• <tr id="yyy80"></tr>
  • <sup id="yyy80"></sup>
  • <tfoot id="yyy80"><noscript id="yyy80"></noscript></tfoot>
  • 99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

    基于OpenGL的三維模型交互控制研究

    2015-04-17 12:40:47游有鵬邢永彥
    機械設(shè)計與制造工程 2015年1期
    關(guān)鍵詞:坐標值視點鼠標

    葉 帥,游有鵬,邢永彥

    (南京航空航天大學 機電學院,江蘇 南京 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)三維模型交互控制的方法。

    1 坐標系分類

    OpenGL中存在如下幾種坐標系:

    a.世界坐標系。世界坐標系是以屏幕中心為原點(0, 0, 0),在OpenGL中用來描述場景的坐標,是系統(tǒng)的絕對坐標系。在繪圖期間,原點和坐標軸保持不變。

    b.模型坐標系。繪制模型時使用的坐標系。當模型發(fā)生旋轉(zhuǎn)、平移等變化時,模型坐標系本身不會變化,變化的是模型在世界坐標系中的位置。

    c.視坐標系。以視點為原點,以視線方向為Z軸正方向的坐標系。OpenGL會將世界坐標系先變換為視坐標系,然后進行裁剪,只有在視景體內(nèi)的場景才會進行下一個階段的處理。

    2 實現(xiàn)方法和步驟

    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)。

    3 結(jié)束語

    本文在討論了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

    猜你喜歡
    坐標值視點鼠標
    麥弗遜懸架主銷軸線對半軸滑移的影響
    北京汽車(2023年1期)2023-03-03 00:50:38
    Progress in Neural NLP: Modeling, Learning, and Reasoning
    Engineering(2020年3期)2020-09-14 03:42:00
    基于二分法迭代的凸模數(shù)控銑削加工編程*
    視點
    河南電力(2016年5期)2016-02-06 02:11:24
    讓你每天一元錢,物超所值——《今日視點—2014精萃》序
    新聞前哨(2015年2期)2015-03-11 19:29:22
    兩會視點
    中國水利(2015年5期)2015-02-28 15:12:40
    利用CAD/CAM 軟件確定數(shù)控編程中 未知點的坐標
    圖學學報(2010年3期)2010-01-01 01:46:54
    物理坐標圖像的應用賞析
    45歲的鼠標
    少年科學(2009年1期)2009-01-20 03:25:10
    超能力鼠標
    IM家庭電子(2008年11期)2008-12-05 09:49:20
    萨嘎县| 陇南市| 新野县| 阳高县| 崇礼县| 聂拉木县| 台南县| 登封市| 峨边| 华阴市| 宜兰县| 铁力市| 赣榆县| 华亭县| 奎屯市| 册亨县| 金门县| 广南县| 吴江市| 济宁市| 元谋县| 西华县| 鹤峰县| 临潭县| 阳曲县| 茶陵县| 左云县| 梓潼县| 乡城县| 德清县| 罗山县| 南开区| 营山县| 荥经县| 海兴县| 公安县| 台东县| 绥滨县| 噶尔县| 永胜县| 武邑县|