程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi使用OpenGL實現色彩變換動畫

Delphi使用OpenGL實現色彩變換動畫

編輯:Delphi

本例將利用OpenGL 函數中顏色的配置和動畫的實現,實現圖像色彩的變換,程序運行界面如圖所示,在窗體中有一個不斷變動形狀的物體,顏色也不斷地變化,艷麗而鮮艷。

 Delphi使用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;
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved