OpenGL之坐标变换.docx
- 文档编号:12792988
- 上传时间:2023-04-22
- 格式:DOCX
- 页数:13
- 大小:345.87KB
OpenGL之坐标变换.docx
《OpenGL之坐标变换.docx》由会员分享,可在线阅读,更多相关《OpenGL之坐标变换.docx(13页珍藏版)》请在冰豆网上搜索。
OpenGL之坐标变换
OpenGL通过相机模拟、可以实现计算机图形学中最基本的三维变换,即几何变换、投影变换、裁剪变换、视口变换等,同时,OpenGL还实现了矩阵堆栈等。
理解掌握了有关坐标变换的内容,就算真正走进了精彩地三维世界。
a—、OpenGL中的三维物体的显示亠
(一)坐标系统亠
在现实世界中,所有的物体都具有三维特征,但计算机本身只能处理数字,显示二维的图形,将三维物体及二维数据联系在一起的唯一纽带就是坐标。
上为了使被显示的三维物体数字化,要在被显示的物体所在的空间中怎义一个坐标系。
这个坐标系的长度单位和坐标轴的方向要适合对被显示物体的描述,这个坐标系称为世界坐标系。
世界坐标系是始终固定不变的。
OpenGL还左义了局部坐标系的概念,所谓局部坐标系,也就是坐标系以物体的中心为坐标原点,物体的旋转或平移等操作都是国绕局部坐标系进行的,这时,当物体模型进行旋转或平移等操作时,局部坐标系也执行相应的旋转或平移操作。
需要注意的是,如果对物体模型进行缩放操作,则局部坐标系也要进行相应的缩放,如果缩放比例在案各坐标轴上不同,那么再经过旋转操作后,局部坐标轴之间可能不再相互垂直。
无论是在世界坐标系中进行转换还是在局部坐标系中进行转换,程序代码是相同的,只是不同的坐标系考虑的转换方式不同罢了。
讣算机对数字化的显示物体作了加工处理后,要在图形显示器上显示,这就要在图形显示器屏幕上立义一个二维直角坐标系,这个坐标系称为屏幕坐标系。
这个坐标系坐标轴的方向通常取成平行于屏幕的边缘,坐标原点取在左下角,长度单位常取成一个象素。
上
(二)三维物体的相机模拟上
为了说明在三维物体到二维图象之间,需要经过什么样的变换,我们引入了相机(Camera)模拟的方式,假定用相机来舶摄这个世界,那么在相机的取景器中,就存在人眼和现实世界之间的一个变换过程。
ns^en
图一.相机模拟OpenGL中的各种坐标变换
从三维物体到二维图象,就如同用相机拍照一样,通常都要经历以下几个步骤:
1、将相机巻于三角架上,让它对准三维景物,它相当于0penGL中调整视点的位置,即视点变换(ViewingTransformation)<>必
2、将三维物体放在场景中的适当位苣,它相当于OpenGL中的模型变换(ModelingTransformation),即对模型进行旋转、平移和缩放。
小3、选择相机镜头并调焦,
使三维物体投影在二维胶片上,它相当于OpenGL中把三维模型投影到二维屏幕上的过程,即OpenGL的投影变换(ProjectionTransformation),OpenGL中投影的方法有两种,即正射投影和透视投影。
为了使显示的物体能以合适的位豊、大小和方向显示出来,必须要通过投影。
有时为了突出图形的一部分,只耙图形的某一部分显示出来,这时可以定义一个三维视景体(ViewingVolume)。
正射投影时一般是一个长方体的视景体,透视投影时一般是一个棱台似的视景体。
只有视景体内的物体能被投影在显示平而上,其他部分则不能。
4、冲洗底片,决宦二维相片的大小,它相当与0penGL中的视口变换(ViewportTransformation)(在屏幕窗口内可以泄义一个矩形,称为视口(viewport),视景体投影后
的图形就在视口内显示)规左屏幕上显示场景的范国和尺寸。
通过上面的几个步骤,一个三维空间里的物体就可以用相应的二维平而物体表示了,也就能在二维的电脑屏幕上正确显示了。
总的来说,三维物体的显示过程如下:
图二、三维物体的显示过程
二、0penGL中的几种变换
OpenGL中的各种转换是通过矩阵运算实现的,具体的说,就是当发岀一个转换命令时,该命令会生成一个4X4阶的转换矩阵(OpenGL中的物体坐标一律采用齐次坐标,即(X,y,乙w),故所有变换矩阵都采用4X4矩阵),当前矩阵与这个转换矩阵相乘,从而生成新的当前矩阵。
例如,对于顶点坐标v,转换命令通常在顶点坐标命令之前发出,若当前矩阵为C,转换命令构成的矩阵为M,则发岀转换命令后,生成的新的肖前矩阵为CM,这个矩阵再乘以顶点坐标V,从而构成新的顶点坐标CMVo上述过程说明,程序中绘制顶点前的最后一个变换命令最先作用于顶点之上。
这同时也说明,0penGL编程中,实际的变换顺序与指宦的顺序是相反的。
上
(一)视点变换
上视点变换确左了场景中物体的视点位置和方向,就向上边提到的,它象是在场景中放置了一架照相机,让相机对准要拍摄的物体。
确省时,相机(即视点)定位在坐标系的原点(相机初始方向都指向Z负轴),它同物体模型的缺省位巻是一致的,显然,如果不进行视点变换,相机和物体是重叠在一起的。
小执行视点变换的命令和执行模型转换的命令是相同的,想一想,在用相机舶摄物体时,我们可以保持物体的位置不动,而将相机移离物体,这就相当于视点变换;另外,我们也可以保持相机的固立位程,将物体移离相机,这就相当于模型转换。
这样,在0penGL中,以逆时针旋转物体就相肖于以顺时针旋转相机。
因此,我们必须把视点转换和模型转换结合在一起考虑,而对这两种转换单独进行考虑是亳无意义的。
亠除了用模型转换命令执行视点转换之外,OpenGL实用库还提供了gluLookAt()函数,该函数有三个变量,分别左义了视点的位垃、相机瞄准方向的参考点以及相机的向上方向。
该函数的原型为:
voidg1uLookAt(GLdoubleeyex,GLdoubleeyeytGLdoublceye乙GLdoable
centerx,GLdoublecenteryfGLdoub1eupx•GLdoubIcupy,GLdoubleupz);
该函数左义了视点矩阵,并用该矩阵乘以当前矩阵。
eyex,eyey,eyez泄义了视点的位置:
centerx.centery和centerz变量指定了参考点的位置,该点通常为相机所瞄
准的场景中心轴线上的点;upx、upy、upz变量指左了向上向疑的方向。
通常,视点转换操作在模型转换操作之前发出,以便模型转换先对物体发生作用。
场景中物体的顶点经过模型转换之后移动到所希望的位垃,然后再对场景进行视点定位等操作。
模型转换和视点转换共同构成模型视景矩阵。
上
(2)模型变换
上模型变换是在世界坐标系中进行的。
缺省时,物体模型的中心定位在坐标系的中心处。
OpenGL在这个坐标系中,有三个命令,可以模型变换。
丄1、模型平移
gITranslate{fd}(TYPEx.TYPEy,TYPEz);
上该函数用指左的x,y,z值沿着x轴、y轴、z轴平移物体(或按照相同的量值移动局部坐标系)。
2、模型旋转
|glRotateffd} a该函数中第一个变量angle制左模型旋转的角度,单位为度,后三个变量表示以原点(0,0,0)到点(x,y,7.)的连线为轴线逆时针旋转物体。 例如,glRotatef(45.0,0.0,0.0,1.0)的结果是绕Z轴旋转45度。 m3、模型缩放 |glScalc{fd}(TYPEx.TYPEy.TYPEz); »该函数可以对物体沿着x.y.z轴分别进行放大缩小。 函数中的三个参数分别是x、y、z轴方向的比例变换因子。 缺省时都为1.0,即物体没变化。 程序中物体丫轴比例为2.0,其余都为1.0,就是说将立方体变成长方体。 (3)投影变换皿经过模型视景的转换后,场景中的物体放在了所希望的位巻上,但由于显示器只能用二维图象显示三维物体,因此就要靠投影来降低维数(投影变换类似于选择相机的镜头)。 金 事实上,投影变换的目的就是龙义一个视景体,使得视景体外多余的部分裁剪掉,最终进入图像的只是视景体内的有关部分。 投影包括透视投影(PerspectiveProjection)和正视投影(OrthographicProjection)两种。 心透视投影,符合人们心理习惯,即离视点近的物体大,离视点远的物体小,远到极点即为消失,成为火点。 它的视景体类似于一个顶部和底部都被进行切割过的棱椎,也就是棱台。 这个投影通常用于动画、视觉仿貞•以及其它许多具有真实性反映的方而。 OpenGL透视投影函数有两个,其中函数gIFrustum()的原型为: |voidgIFrustum(GLdoub1cleft,GLdoubleRight,GLdoublebottom,GLdoub 1etop,GLdoublcnear,GLdoublefar); A它创建一个透视视景体。 其操作是创建一个透视投影矩阵,并且用这个矩阵乘以当前矩 阵。 这个函数的参数只左义近裁剪平而的左下角点和右上角点的三维空间坐标,即(left,bottom,-near)和(right,top,-near): 最后一个参数far是远裁剪平而的Z负值,其左下角点和右上角点空间坐标由函数根据透视投影原理自动生成onear和far表示离视点的远近,它们总为正值。 该函数形成的视景体如图三所示。 近平面距离 远平面距离 远平面距醫 图三、透视投影视景体 交另一个透视函数是: voidgluPcrspcctive(GLdoablefovy,GLdoubleaspect,GLdoub1ezNear.GLdoub1ezFar): 上它也创建一个对称透视视景体,但它的参数立义于前而的不同,参数fovy左义视野在 X-Z平而的角度,范围是[0.0,180.0];参数aspect是投影平而宽度与髙度的比率渗数zNear和Far分别是远近裁剪而沿Z负轴到视点的距离,它们总为正值。 鼻图四、透视投影视景体 视景体 以上两个函数缺省时,视点都在原点,视线沿Z轴指向负方向。 小正射投影,又叫平行投影。 这种投影的视景体是一个矩形的平行管道,也就是一个长方体,如图五所示。 正射投影的最大一个特点是无论物体距离相机多远,投影后的物体大小尺寸不变。 这种投影通常用在建筑蓝图绘制和汁算机辅助设讣等方而,这些行业要求投影后的物体尺寸及相互间的角度不变,以便施工或制造时物体比例大小正确。 鼻图五、正射投影 OpenGL正射投影函数也有两个,一个函数是: voidg10rtho(GLdoub1eleft,GLdoublerighttGLdoublebottom,GLdoubletop,GLdoublenear,GLdoub1efar) A它创建一个平行视景体。 实际上这个函数的操作是创建一个正射投彫矩阵,并且用这个矩阵乘以当前矩阵。 其中近裁剪平面是一个矩形,矩形左下角点三维空间坐标是(left,bottom,-near),右上角点是(right,top,-neai'): 远裁剪平而也是一个矩形,左下角点空间坐标是(left,bottom,-far),右上角点是(right,top,-far)。 所有的near和far值同时为正或同时为负。 如果没有其他变换,正射投影的方向平行于Z轴,且视点朝向Z负轴。 这意味着物体在视点前面时far和near都为负值,物体在视点后面时far和near都为正值。 另一个函数是: voidgluOrtho2D(GLdouble1eft,GLdoub1eright,GLdoubIcbottom,GLdoubletop) a它是一个特殊的正射投影函数,主要用于二维图像到二维屏幕上的投影。 它的near和far缺省值分别为-1.0和1.0,所有二维物体的Z坐标都为0.0。 因此它的裁剪而是一个左下角点为(left,bottom).右上角点为(right,top)的矩形。 (4)视口变换。 2视口变换就是将视景体内投影的物体显示在二维的视口平面上。 运用相机模拟方式,我们很容易理解视口变换就是类似于照片的放大与缩小。 在讣算机图形学中,它的定义是将经过几何变换、投影变换和裁剪变换后的物体显示于屏幕窗口内指左的区域内,这个区域通常为矩形,称为视口。 OpenGL中相关函数是: |g1Viewport(GLintx.GLinty,GLsizeiwidth,GLsizeiheight); a这个函数左义一个视口。 函数参数(X,y)是视口在屏幕窗口坐标系中的左下角点坐标,参数width和height分别是视口的宽度和高度。 缺省时,参数值即(0,0,winWidth,winHeight)指的是屏幕窗口的实际尺寸大小。 所有这些值都是以象素为单位,全为整型数。 (5)裁剪变换 上在OpenGL中,除了视景体定义的六个裁剪平而(上、下、左、右、前、后)夕卜,用户还可自己再定义一个或多个附加裁剪平而,以去掉场景中无关的目标,如图六所示。 “图六、附加裁 附加平面裁剪函数为: »1、voidglCIipPIane(GLenumplane.ConstGLdouble*equation);^ 函数参数equation指向一个拥有四个系数值的数组,这四个系数分别是裁剪平而Ax+By+Cz+D=0的A、B、C、D值。 因此,由这四个系数就能确左一个裁剪平而。 参数pIane是GL_CLIP_PLANEi(i=0,1指定裁剪面号。 上在调用附加裁剪函数之前,必须先启动glEnable(GL_CLIP_PLANEi),使得当前 所定义的裁剪平而有效;当不再调用某个附加裁剪平而时,可用gIDisabIe(GL_CLIP.PLANEi)关闭相应的附加裁剪功能。 下而这个例子不仅说明了附加裁剪函数的用法,而且调用了g1uPerspective()透视投影函数,读者可以细细体会其中的用法。 例程如下: include"gios.h#include #inc1ude voidmyinit(void)>voidCALLBACKmvReshape(GLsizeiw,GLsizeih)>voidCALLBACKdisplay(void); voidCALLBACKdisplay(void>{ GLdoubleeqn[4]={1.0,0・0・0.0,0.0)>glC1ear(GL_COLO R_BUFFER_BIT); glColor3f(1.0,0.0,1.0): agIPushMatrix()>glTranslatof(0.0,0.0.・5.0): >/*c1iptheleftpartofwire__sphere: x<07 g1ClipPlane(GL_CLIP_PLANE0,eqn)>g1Enable(GL_CLIP__PLANE 0)>gIRotatef(-90.0»1.0,0.0.0.0)>auxWjreSpherc(1.0); g1PopMatrix(); glFlush()>)*voidmyinit(void)a{agIShadeMode1(GL _FLAT): 鼻卜voidCALLBACKmyReshape(GLsizeiw,GLsizeih) { g】Viewport(0,0,wth): gIMatrixMode(GL_PROJECTION); gILoadidentity(); gluPerspcctive(60.0,(GLfloat)w/(GLfloat)h,I・0,20.0): g1MatrixMode(GL_MODELV|Ew): a} voidmain(void) {鼻auxlnitDisplayMode(AUXSINGLE|AUXRGB)>auxlnitPosition(0.0,500,500); auxlnitWindow("ArbitraryClippingPlanes”); myinit(); auxReshapeFunc(myReshape); auxMainLoop(display): OpenGL通过相机模拟、可以实现计算机图形学中最基本的三维变换,即几何变换、投影变换、裁剪变换、视口变换等,同时,OpenGL还实现了矩阵堆栈等。 理解掌握了有关坐标变换的内容,就算真正走进了精彩地三维世界。 小一、OpenGL中的三维物体的显示小 (一)坐标系统亠 在现实世界中,所有的物体都具有三维特征,但计算机本身只能处理数字,显示二维的图形,将三维物体及二维数据联系在一起的唯一纽带就是坐标。 A为了使被显示的三维物体数字化,要在被显示的物体所在的空间中左义一个坐标系。 这个坐标系的长度单位和坐标轴的方向要适合对被显示物体的描述,这个坐标系称为世界坐标系。 世界坐标系是始终固定不变的。 上OpenGL还定义了局部坐标系的概念,所谓局部坐标系,也就是坐标系以物体的中心为坐标原点,物体的旋转或平移等操作都是用绕局部坐标系进行的,这时,当物体模型进行旋转或平移等操作时,局部坐标系也执行相应的旋转或平移操作。 需要注意的是,如果对物体模型进行缩放操作,则局部坐标系也要进行相应的缩放,如果缩放比例在案各坐标轴上不同,那么再经过旋转操作后,局部坐标轴之间可能不再相互垂直。 无论是在世界坐标系中进行转换还是在局部坐标系中进行转换,程序代码是相同的,只是不同的坐标系考虑的转换方式不 同罢•了。 2计算机对数字化的显示物体作了加工处理后,要在图形显示器上显示,这就要在图形显示器屏幕上定义一个二维直角坐标系,这个坐标系称为屏幕坐标系。 这个坐标系坐标轴的方向通常取成平行于屏幕的边缘,坐标原点取在左下角,长度单位常取成一个象素。 (二)三维物体的相机模拟 为了说明在三维物体到二维图象之间,需要经过什么样的变换,我们引入了相机(Camera)模拟的方式,假龙用相机来拍摄这个世界,那么在相机的取景器中,就存在人眼和现实世界之间的一个变换过程。 W/Jth口CameraWWha »从三维物体到二维图象,就如同用相机拍照一样•通常都要经历以下几个步骤仁将相机置于三角架上,让它对准三维景物,它相当于openGL中调整视点的位置,即视点变换(ViewingTransformation)。 4 2、将三维物体放在场景中的适当位宜,它相肖于OpenGL中的模型变换(ModelingTransformation),即对模型进行旋转、平移和缩放。 3、选择相机镜头并调焦,使三维物体投影在二维胶片上,它相当于OpenGL中把三维模型投影到二维屏幕上的过程,即OpenGL的投影变换(ProjectionTransformation),openGL中投影的方法有两种,即正射投影和透视投影。 为了使显示的物体能以合适的位置、大小和方向显示出来,必须要通过投影。 有时为了突出图形的一部分,只把图形的某一部分显示岀来,这时可以左义一个三维视景体(ViewingVolume)。 正射投影时一般是一个长方体的视景体,透视投影时一般是一个棱台似的视景体。 只有视景体内的物体能被投影在显示平面上,其他部分则不能。 4、冲洗底片,决左二维相片的大小,它相当与openGL中的视口变换(ViewportTransformation)(在屏幕窗口内可以立义一个矩形,称为视口(Viewport),视景体投影后的图形就在视口内显示)规定屏幕上显示场景的范囤和尺寸。 丄通过上而的几个步骤,一个三维空间里的物体就可以用相应的二维平而物体表示了,也就能在二维的电脑屏幕上正确显示了。 总的来说,三维物体的显示过程如下: 图二、三维物体的显示过程
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- OpenGL 坐标 变换