叶 帅,游有鹏,邢永彦
(南京航空航天大学 机电学院,江苏 南京 210016)
基于OpenGL的三维模型交互控制研究
叶 帅,游有鹏,邢永彦
(南京航空航天大学 机电学院,江苏 南京 210016)
OpenGL是图形硬件的一种软件接口,在深入了解OpenGL显示机制的基础上,讨论了基于OpenGL实现三维模型的交互显示变换方法。应用OpenGL接口,通过对鼠标的二维位置的变换,得到世界坐标系中三维旋转轴和旋转角度,以及鼠标在世界坐标系中的三维位置,进而对三维模型进行平移、缩放、旋转操作。算法经实际编程应用,证明能够有效地实现三维模型的各种交互控制功能。
三维模型;鼠标控制;OpenGL;交互式
目前,相当多的优秀三维图形工具展现了精彩的虚拟现实场景[1]。随着虚拟现实进入工程应用,要求相关的图形应用软件能够使用户与虚拟现实场景进行互动操作。为此,当进行图形应用软件交互控制设计时,必须考虑三维模型的平移、缩放和旋转等操作的实现,其中最为困难的是旋转操作。常用的方法是使用OpenGL提供的接口函数glRotate()来实现三维旋转操作[2]、采用四元数法求旋转变换矩阵[3]、构造旋转矩阵对模型进行变换[4],它们可以很好地实现三维模型的旋转,但会改变对象的坐标,并且计算量大。对于有坐标值要求的三维实体,这些方法并不适用。针对以上问题,本文提出了一种利用鼠标移动改变视点坐标系位置、保留原有三维模型的空间几何信息、实现三维模型交互控制的方法。
OpenGL中存在如下几种坐标系:
a.世界坐标系。世界坐标系是以屏幕中心为原点(0, 0, 0),在OpenGL中用来描述场景的坐标,是系统的绝对坐标系。在绘图期间,原点和坐标轴保持不变。
b.模型坐标系。绘制模型时使用的坐标系。当模型发生旋转、平移等变化时,模型坐标系本身不会变化,变化的是模型在世界坐标系中的位置。
c.视坐标系。以视点为原点,以视线方向为Z轴正方向的坐标系。OpenGL会将世界坐标系先变换为视坐标系,然后进行裁剪,只有在视景体内的场景才会进行下一个阶段的处理。
2.1显示变换分析
在计算机图形学中,三维图形的旋转变换需要指定一个旋转轴和旋转角度。通常,三维旋转变换可围绕空间任意直线轴进行,并规定图形绕某轴逆时针方向的旋转角度为正。旋转变换前后三维图形的大小和形状不发生变化,只是空间位置发生了变化。绕坐标轴旋转是最简单的旋转变换。当三维图形绕某一坐标轴旋转时,图形上各点关于此轴的坐标值不变,而另两个坐标轴的坐标值相当于在它们组成的坐标面上的一个二维旋转变换,然后再投影到二维的屏幕上。当通过鼠标操作三维场景中某个物体的投影进行旋转时,可以将鼠标位置的改变转换成三维物体绕着空间某一垂直于投影方向轴的旋转。
基于以上分析,可对三维物体旋转问题作如下转化:鼠标在二维屏幕上的移动等价于三维物体绕空间某一条轴的旋转,该旋转轴可定义为平行于屏幕、垂直于鼠标移动方向且通过原点,旋转的角度由鼠标的移动距离来确定。三维物体的缩放,可通过改变视点里三维模型的距离来实现,缩放比例由鼠标沿X轴移动的距离确定。这些变换都使用到同一函数gluLookAt()。对于三维物体平移问题,可直接调用glTranslate*()函数,参数由鼠标在窗口中的移动量确定。
2.2实现步骤
在实际应用中,用户在完成场景建模后,往往需要选择一个合适的视角或者不停地变换视角,以对场景作观察,实用库函数gluLookAt()就提供了这样的功能,函数声明如下:
VoidgluLookAt(GLdoubleeyex,GLdoubleeyey,GLdoubleeyez,GLdoublecenterx,GLdoublecentery,GLdoublecenterz,GLdoubleupx,GLdoubleupy,GLdoubleupz);
该函数定义一个视图矩阵,并与当前矩阵相乘。其中,(eyex,eyey,eyez)为视点的位置;(centerx,centery,centerz)为参考点的位置;向量(upx,upy,upz)为视线向上的方向。
2.2.1构造UVN坐标系
gluLookAt()函数提供了视图模型变换(Model-ViewTransformation)功能,将模型坐标系转换为世界坐标系后,进行世界坐标系到照相机坐标系的转换。实际上,照相机的定位也是在世界坐标系下定义的,这里的转换可以理解为从照相机的角度解释世界坐标系中物体的坐标。可以通过构造一个UVN相机坐标系来简化这一转换。图1为正式定义的UVN相机坐标系。
与UVN相关的概念包括:相机位置,或称之为视点(Eyepoint),即观察参考点 (ViewReferencePoint);相机镜头方向,即观察平面法向量VPN(View Plane Normal),通过观察平面的法向量指定;相机顶部正朝向VUV(View Up Vector)。
gluLookAt()通过指定一个视点、表面场景中心的参考点以及向量Vup来构造一个视变换矩阵。这个矩阵将视点映射成为原点,并指向Z轴负方向。当使用一个特定的投影矩阵时,场景的中心就映射到视口的中心。类似地,由向量Vup描述的方向投影到投影平面成为+Y轴,这样它在视口中的指向向上。向量Vup不可与从视点到参考点的直线平行。
各参数通过以下公式计算:
VPN=target-eye
式中:target是物体位置;eye是视点位置;u,v,n是UVN坐标系的3个基向量。
需要注意的是,OpenGL中使用的相机坐标系是右手坐标系,UVN坐标系是左手坐标系。在构造实际变换矩阵的过程中,OpenGL需要将-N轴翻转为相机坐标系的+Z轴,U,V轴定为相机坐标系的+X和+Y轴。
2.2.2构造视变换矩阵
视变换就是在相机坐标系中解释世界坐标系中的点。这个变换矩阵的构造,可以看作将相机坐标系变换到与原来的世界坐标系重合。而将世界坐标系变换到与相机坐标系重合,可以看作是这个所求变换的逆过程。
将世界坐标系变换到与相机坐标系重合,实际上进行了两个步骤:第一步将世界坐标系旋转一定角度记作变换R,再将世界坐标系平移到视点位置记作T,那么这个变换矩阵记为M=TR。要将世界坐标系的点变换到照相机坐标系下,需要使用矩阵M的逆矩阵,即inverse(M)=inverse(R)·inverse(T)。
平移矩阵的逆矩阵形式简单,就是取平移量eyex,eyey,eyez的相反数,即:
2.2.3求出旋转矩阵R
上面构造的UVN坐标系u-v-n3个基向量可以构造成矩阵:
这里对N轴进行了翻转,构成右手照相机坐标系。从矩阵形式上可以看出,矩阵A实际上代表的就是一个旋转矩阵。旋转矩阵的一个特点就是它是正交矩阵,即有inverse(A)=transpose(A),(A-1=AT)。
这里A矩阵可以看作是将世界坐标系转换到与照相机坐标系重合时的旋转矩阵。矩阵A的第4列为(0,0,0,1)T,可以看作是世界坐标系和照相机坐标系原点重合;矩阵前3列为变换后的基向量,那么这个基向量就是通过旋转原来的世界坐标系的基向量来构造的。因此,可以说矩阵A代表的就是将世界坐标系旋转到与相机坐标系重合时的旋转矩阵R,即R=A。
则inverse(R)=inverse(A)=transpose(A) ,即:
所以变换矩阵inverse(M)为:
M-1=R-1T-1=
2.2.4应用
通过以上几个小节的讨论,已经求得变换矩阵,通过gluLookAt()函数即可将世界坐标系的点变换到照相机坐标系下。gluLookAt()函数所需的具体参数可通过以下步骤计算得出:
CurrentAngleZ=(ep.x()-sp.x())*divAnale+LastAngleZ;//计算当前绕Z轴旋转角度,ep为终止点,sp为起始点
CurrentAngleY=(ep.y()-sp.y())*divAnale+LastAngleY; //计算当前绕Y轴旋转角度
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()函数中,并在鼠标移动的响应函数中实时跟踪最新的鼠标位置值,就能够实现以世界坐标系原点为中心,按任意方向旋转整个场景的功能。
设定zoom=zoom+ (终止点X方向坐标值-起始点X方向坐标值)/8;
moveX= (终止点X方向坐标值-起始点X方向坐标值)/10;
moveY= (终止点Y方向坐标值-起始点Y方向坐标值)/10;
在应用gluLookAt()时,eyex,eyey,eyez分别乘以系数zoom即可实现以世界坐标系原点为中心的场景缩放功能,应用glTranslatef(moveX,moveY,0)使得场景能够平移。
搭建的机床加工模型如图2所示,旋转、平移、缩放等功能均得到很好的实现。
本文在讨论了OpenGL显示机制的基础上,分析了模型变换和视点变换,通过鼠标在二维屏幕上的移动转化为三维场景绕空间某一轴的旋转,实现模型平移、缩放等功能,并能实时显示交互过程。在此基础上搭建的机床加工三维模型,具有较好的交互显示效果,为接下来研究机床加工的虚拟仿真奠定了一个较好的基础。
[1]EdwardAngel.交互式计算机图形学:基于OpenGL的自顶向下方法[M].吴文国,译.北京:清华大学出版社,2006.
[2] 王映辉.3D建模与编程技术[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