葉 帥,游有鵬,邢永彥
(南京航空航天大學 機電學院,江蘇 南京 210016)
基于OpenGL的三維模型交互控制研究
葉 帥,游有鵬,邢永彥
(南京航空航天大學 機電學院,江蘇 南京 210016)
OpenGL是圖形硬件的一種軟件接口,在深入了解OpenGL顯示機制的基礎(chǔ)上,討論了基于OpenGL實現(xiàn)三維模型的交互顯示變換方法。應用OpenGL接口,通過對鼠標的二維位置的變換,得到世界坐標系中三維旋轉(zhuǎn)軸和旋轉(zhuǎn)角度,以及鼠標在世界坐標系中的三維位置,進而對三維模型進行平移、縮放、旋轉(zhuǎn)操作。算法經(jīng)實際編程應用,證明能夠有效地實現(xiàn)三維模型的各種交互控制功能。
三維模型;鼠標控制;OpenGL;交互式
目前,相當多的優(yōu)秀三維圖形工具展現(xiàn)了精彩的虛擬現(xiàn)實場景[1]。隨著虛擬現(xiàn)實進入工程應用,要求相關(guān)的圖形應用軟件能夠使用戶與虛擬現(xiàn)實場景進行互動操作。為此,當進行圖形應用軟件交互控制設(shè)計時,必須考慮三維模型的平移、縮放和旋轉(zhuǎn)等操作的實現(xiàn),其中最為困難的是旋轉(zhuǎn)操作。常用的方法是使用OpenGL提供的接口函數(shù)glRotate()來實現(xiàn)三維旋轉(zhuǎn)操作[2]、采用四元數(shù)法求旋轉(zhuǎn)變換矩陣[3]、構(gòu)造旋轉(zhuǎn)矩陣對模型進行變換[4],它們可以很好地實現(xiàn)三維模型的旋轉(zhuǎn),但會改變對象的坐標,并且計算量大。對于有坐標值要求的三維實體,這些方法并不適用。針對以上問題,本文提出了一種利用鼠標移動改變視點坐標系位置、保留原有三維模型的空間幾何信息、實現(xiàn)三維模型交互控制的方法。
OpenGL中存在如下幾種坐標系:
a.世界坐標系。世界坐標系是以屏幕中心為原點(0, 0, 0),在OpenGL中用來描述場景的坐標,是系統(tǒng)的絕對坐標系。在繪圖期間,原點和坐標軸保持不變。
b.模型坐標系。繪制模型時使用的坐標系。當模型發(fā)生旋轉(zhuǎn)、平移等變化時,模型坐標系本身不會變化,變化的是模型在世界坐標系中的位置。
c.視坐標系。以視點為原點,以視線方向為Z軸正方向的坐標系。OpenGL會將世界坐標系先變換為視坐標系,然后進行裁剪,只有在視景體內(nèi)的場景才會進行下一個階段的處理。
2.1顯示變換分析
在計算機圖形學中,三維圖形的旋轉(zhuǎn)變換需要指定一個旋轉(zhuǎn)軸和旋轉(zhuǎn)角度。通常,三維旋轉(zhuǎn)變換可圍繞空間任意直線軸進行,并規(guī)定圖形繞某軸逆時針方向的旋轉(zhuǎn)角度為正。旋轉(zhuǎn)變換前后三維圖形的大小和形狀不發(fā)生變化,只是空間位置發(fā)生了變化。繞坐標軸旋轉(zhuǎn)是最簡單的旋轉(zhuǎn)變換。當三維圖形繞某一坐標軸旋轉(zhuǎn)時,圖形上各點關(guān)于此軸的坐標值不變,而另兩個坐標軸的坐標值相當于在它們組成的坐標面上的一個二維旋轉(zhuǎn)變換,然后再投影到二維的屏幕上。當通過鼠標操作三維場景中某個物體的投影進行旋轉(zhuǎn)時,可以將鼠標位置的改變轉(zhuǎn)換成三維物體繞著空間某一垂直于投影方向軸的旋轉(zhuǎn)。
基于以上分析,可對三維物體旋轉(zhuǎn)問題作如下轉(zhuǎn)化:鼠標在二維屏幕上的移動等價于三維物體繞空間某一條軸的旋轉(zhuǎn),該旋轉(zhuǎn)軸可定義為平行于屏幕、垂直于鼠標移動方向且通過原點,旋轉(zhuǎn)的角度由鼠標的移動距離來確定。三維物體的縮放,可通過改變視點里三維模型的距離來實現(xiàn),縮放比例由鼠標沿X軸移動的距離確定。這些變換都使用到同一函數(shù)gluLookAt()。對于三維物體平移問題,可直接調(diào)用glTranslate*()函數(shù),參數(shù)由鼠標在窗口中的移動量確定。
2.2實現(xiàn)步驟
在實際應用中,用戶在完成場景建模后,往往需要選擇一個合適的視角或者不停地變換視角,以對場景作觀察,實用庫函數(shù)gluLookAt()就提供了這樣的功能,函數(shù)聲明如下:
VoidgluLookAt(GLdoubleeyex,GLdoubleeyey,GLdoubleeyez,GLdoublecenterx,GLdoublecentery,GLdoublecenterz,GLdoubleupx,GLdoubleupy,GLdoubleupz);
該函數(shù)定義一個視圖矩陣,并與當前矩陣相乘。其中,(eyex,eyey,eyez)為視點的位置;(centerx,centery,centerz)為參考點的位置;向量(upx,upy,upz)為視線向上的方向。
2.2.1構(gòu)造UVN坐標系
gluLookAt()函數(shù)提供了視圖模型變換(Model-ViewTransformation)功能,將模型坐標系轉(zhuǎn)換為世界坐標系后,進行世界坐標系到照相機坐標系的轉(zhuǎn)換。實際上,照相機的定位也是在世界坐標系下定義的,這里的轉(zhuǎn)換可以理解為從照相機的角度解釋世界坐標系中物體的坐標??梢酝ㄟ^構(gòu)造一個UVN相機坐標系來簡化這一轉(zhuǎn)換。圖1為正式定義的UVN相機坐標系。
與UVN相關(guān)的概念包括:相機位置,或稱之為視點(Eyepoint),即觀察參考點 (ViewReferencePoint);相機鏡頭方向,即觀察平面法向量VPN(View Plane Normal),通過觀察平面的法向量指定;相機頂部正朝向VUV(View Up Vector)。
gluLookAt()通過指定一個視點、表面場景中心的參考點以及向量Vup來構(gòu)造一個視變換矩陣。這個矩陣將視點映射成為原點,并指向Z軸負方向。當使用一個特定的投影矩陣時,場景的中心就映射到視口的中心。類似地,由向量Vup描述的方向投影到投影平面成為+Y軸,這樣它在視口中的指向向上。向量Vup不可與從視點到參考點的直線平行。
各參數(shù)通過以下公式計算:
VPN=target-eye
式中:target是物體位置;eye是視點位置;u,v,n是UVN坐標系的3個基向量。
需要注意的是,OpenGL中使用的相機坐標系是右手坐標系,UVN坐標系是左手坐標系。在構(gòu)造實際變換矩陣的過程中,OpenGL需要將-N軸翻轉(zhuǎn)為相機坐標系的+Z軸,U,V軸定為相機坐標系的+X和+Y軸。
2.2.2構(gòu)造視變換矩陣
視變換就是在相機坐標系中解釋世界坐標系中的點。這個變換矩陣的構(gòu)造,可以看作將相機坐標系變換到與原來的世界坐標系重合。而將世界坐標系變換到與相機坐標系重合,可以看作是這個所求變換的逆過程。
將世界坐標系變換到與相機坐標系重合,實際上進行了兩個步驟:第一步將世界坐標系旋轉(zhuǎn)一定角度記作變換R,再將世界坐標系平移到視點位置記作T,那么這個變換矩陣記為M=TR。要將世界坐標系的點變換到照相機坐標系下,需要使用矩陣M的逆矩陣,即inverse(M)=inverse(R)·inverse(T)。
平移矩陣的逆矩陣形式簡單,就是取平移量eyex,eyey,eyez的相反數(shù),即:
2.2.3求出旋轉(zhuǎn)矩陣R
上面構(gòu)造的UVN坐標系u-v-n3個基向量可以構(gòu)造成矩陣:
這里對N軸進行了翻轉(zhuǎn),構(gòu)成右手照相機坐標系。從矩陣形式上可以看出,矩陣A實際上代表的就是一個旋轉(zhuǎn)矩陣。旋轉(zhuǎn)矩陣的一個特點就是它是正交矩陣,即有inverse(A)=transpose(A),(A-1=AT)。
這里A矩陣可以看作是將世界坐標系轉(zhuǎn)換到與照相機坐標系重合時的旋轉(zhuǎn)矩陣。矩陣A的第4列為(0,0,0,1)T,可以看作是世界坐標系和照相機坐標系原點重合;矩陣前3列為變換后的基向量,那么這個基向量就是通過旋轉(zhuǎn)原來的世界坐標系的基向量來構(gòu)造的。因此,可以說矩陣A代表的就是將世界坐標系旋轉(zhuǎn)到與相機坐標系重合時的旋轉(zhuǎn)矩陣R,即R=A。
則inverse(R)=inverse(A)=transpose(A) ,即:
所以變換矩陣inverse(M)為:
M-1=R-1T-1=
2.2.4應用
通過以上幾個小節(jié)的討論,已經(jīng)求得變換矩陣,通過gluLookAt()函數(shù)即可將世界坐標系的點變換到照相機坐標系下。gluLookAt()函數(shù)所需的具體參數(shù)可通過以下步驟計算得出:
CurrentAngleZ=(ep.x()-sp.x())*divAnale+LastAngleZ;//計算當前繞Z軸旋轉(zhuǎn)角度,ep為終止點,sp為起始點
CurrentAngleY=(ep.y()-sp.y())*divAnale+LastAngleY; //計算當前繞Y軸旋轉(zhuǎn)角度
eyex=sin(CurrentAngleY)*sin(CurrentAngleZ);
eyey=cos(CurrentAngleY);
eyez=sin(CurrentAngleY)*cos(CurrentAngleZ);
Look=(targetx-eyex,targety-eyey,targetz-eyez)T;
Look.normalized();//單位化Look向量
Up.normalized();//單位化up向量;
Right = Cross( Look, Up );//Look與up向量的叉積
Up = Cross(Right, Look);//Right與Look向量的叉積
最后將得到的新的觀察點位置和向量up應用到gluLookAt()函數(shù)中,并在鼠標移動的響應函數(shù)中實時跟蹤最新的鼠標位置值,就能夠?qū)崿F(xiàn)以世界坐標系原點為中心,按任意方向旋轉(zhuǎn)整個場景的功能。
設(shè)定zoom=zoom+ (終止點X方向坐標值-起始點X方向坐標值)/8;
moveX= (終止點X方向坐標值-起始點X方向坐標值)/10;
moveY= (終止點Y方向坐標值-起始點Y方向坐標值)/10;
在應用gluLookAt()時,eyex,eyey,eyez分別乘以系數(shù)zoom即可實現(xiàn)以世界坐標系原點為中心的場景縮放功能,應用glTranslatef(moveX,moveY,0)使得場景能夠平移。
搭建的機床加工模型如圖2所示,旋轉(zhuǎn)、平移、縮放等功能均得到很好的實現(xiàn)。
本文在討論了OpenGL顯示機制的基礎(chǔ)上,分析了模型變換和視點變換,通過鼠標在二維屏幕上的移動轉(zhuǎn)化為三維場景繞空間某一軸的旋轉(zhuǎn),實現(xiàn)模型平移、縮放等功能,并能實時顯示交互過程。在此基礎(chǔ)上搭建的機床加工三維模型,具有較好的交互顯示效果,為接下來研究機床加工的虛擬仿真奠定了一個較好的基礎(chǔ)。
[1]EdwardAngel.交互式計算機圖形學:基于OpenGL的自頂向下方法[M].吳文國,譯.北京:清華大學出版社,2006.
[2] 王映輝.3D建模與編程技術(shù)[J].計算機應用研究,2004(1):37-43.
[3] 王峰, 周江華, 孫國基.三維模型交互式瀏覽的簡捷算法[J].計算機工程與應用, 2004,40(26): 101-103.
[4] 徐元進, 胡光道, 葉菁,等.基于OpenGL的對應分析因子載荷三維圖的繪制[J].計算機工程與應用, 2004,40(10): 91-93.
Study on the interactive control of three-dimensional models based on OpenGL
YE Shuai, YOU Youpeng, XING Yongyan
(Nanjing University of Aeronautics and Astronautics, Jiangsu Nanjing, 210016, China)
OpenGL is a software interface to the graphics hardware. Bases on in-depth understanding of OpenGL display mechanism, it discusses the interactive OpenGL 3D model display transformation method. Applying OpenGL interface, it obtains the world coordinate of 3D rotation axis and angle of rotation through the two-dimensional position of the mouse transform, the 3D position of the mouse in world coordinates, the operation of translation, scaling and rotation of the 3D model. The actual programming application proves that the algorithm can realize the various 3Dmodel interactive control efficiently.
three-dimensional models; mouse control; OpenGL; interactive
10.3969/j.issn.2095-509X.2015.01.004
2014-11-21
葉帥(1991—),男,江蘇宿遷人,南京航空航天大學碩士研究生,主要研究方向為機電控制及自動化。
TP391.72;TH16
A
2095-509X(2015)01-0015-04