本例將利用OpenGL 函數中顏色的配置和動畫的實現,實現圖像色彩的變換,程序運行界面如圖所示,在窗體中有一個不斷變動形狀的物體,顏色也不斷地變化,艷麗而鮮艷。
在OpenGL.pas 文件中,定義了所有的OpenGL 函數。本例動畫的實現主要是利用OpenGL 的顏色配置來獲得OpenGL 的場景,同時利用Timer 控件,來控制稜鏡不斷變動。
本例先定義設置OpenGL 場景,然後制作場景需要的畫布,並設置窗口隨窗口尺寸變化的位置。利用Timer 控件,控制窗體中稜鏡的轉動。當關閉窗體時,需要釋放OpenGL場景。具體步驟:
1.新建工程
(1)啟動Delphi 6.0 程序。選擇“文件”菜單下的“新建”命令,從彈出的子菜單中選擇Application 選項,則出現新建工程的Form1 窗口。
(2)選擇“文件”菜單下的“工程另存為”命令,彈出Save Unit1 As 對話框。在“保存在”列表框中選擇需要存放該窗口文件所在的目錄名;在“文件名”編輯框中填寫文件名,這裡填寫“Unit1”,點擊“保存”按鈕,保存上面的選項。
(3)執行上一步後,將彈出“屬性”對話框。在“保存在”列表框中選擇需要存放該工程的目錄名,最好和第(2)步選取相同的目錄;在“文件名”編輯框中填寫保存處理該工程的源代碼的文件名,這裡填寫“Project1”,點擊“保存”按鈕,保存上面的選項。
2.修改窗口
(1)激活Unit1 窗口,在“屬性”面板中設置該窗體的Caption 屬性為“美麗的彩色稜鏡”,Color 屬性設置為“clBtnFace”。
(2)選擇“系統”頁中的Timer 選項,在窗體中添加Timer 控件,在“屬性”面板中設置其Name 屬性為“Timer1”,Interval 屬性為1。
下面對代碼進行分析:
(1)在“屬性”窗口的“事件”頁中,為MainForm 窗口添加OnPaint 消息,用於設置OpenGL 場景:
procedure TMainForm.FormPaint(Sender: TObject); begin ActivateRenderingConText(Canvas.Handle,RC); //制作場景需要的畫布 glClearColor(0,0.5,0.5,1); //背景 glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); //清除背景和占用的內存 glMatrixMode(GL_MODELVIEW); //設置轉換矩陣 glLoadIdentity; //轉換成初始狀態 gluLookAt(0,0,6,0,0,-10,0,1,0); //設置場景所在坐標 glRotatef(4*Angle,0,1,0); //繞軸(x:0;y:1;z:0)旋轉 glRotatef(30,1,0,0); //旋轉以獲得另一種場景 glScalef(1,sin(Angle*pi/90),1); //場景模仿 glEnable(GL_DEPTH_TEST); //著色 glBegin(GL_TRIANGLE_FAN); //繪制一個四面體 glColor3f(1,1,1); //上面頂點的顏色 glVertex3f(0,1,0); //上面頂點的場景 glColor3f(1,0,0); //左邊頂點的顏色 glVertex3f(-1,0,1); //左邊頂點的場景 glColor3f(0,1,0); //右邊頂點的顏色 glVertex3f(1,0,1); //右邊頂點的場景 glColor3f(0,0,1); //後部中間頂點的顏色 glVertex3f(0,0,-1); //後部中間頂點的場景 glColor3f(1,0,0); //變化左邊頂點的顏色 glVertex3f(-1,0,1); //變化左邊頂點的場景 glEnd; //停止變化 SwapBuffers(Canvas.Handle); //復制場景 DeactivateRenderingConText; //釋放場景 end;
(2)在“屬性”窗口的“事件”頁中,為MainForm 窗口添加OnReSize 消息,用於設置窗口隨窗口尺寸變化的位置:
procedure TMainForm.FormReSize(Sender: TObject); begin //設置窗口隨窗口尺寸變化的位置 wglMakeCurrent(Canvas.handle,RC); //制作畫布場景 glVIEwport(0,0,Width,Height); //指定視點 glMatrixMode(GL_PROJECTION); //設置矩陣 glLoadIdentity; //設置初始狀態 gluPerspective(35,Width/Height,1,100); //設置透視參數 wglMakeCurrent(0,0); //釋放場景 Refresh; //更新畫布 end;
(3)為Timer1 控件的OnTimer 事件添加代碼來控制稜鏡的旋轉角度:
procedure TMainForm.Timer1Timer(Sender: TObject); begin Inc(Angle,1); if Angle >= 360 then Angle:=0; //當角度不小於360 度時,角度賦值為0 Repaint; end;