




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第三章第三章 变换变换图形是如何通过变换显示在屏幕上的?图形是如何通过变换显示在屏幕上的?如何在场景中设定相机位置如何在场景中设定相机位置如何在场景中定位对象如何在场景中定位对象如何建立投影变换如何建立投影变换如何建立透视变换如何建立透视变换如何进行视区变换如何进行视区变换执行自己的矩阵变换执行自己的矩阵变换照相机与计算机类比照相机与计算机类比相机和物体的相对位置相机和物体的相对位置照相机与计算机类比照相机与计算机类比1.1.视图变换(相当于将相机放在合适的地方对视图变换(相当于将相机放在合适的地方对准准3D3D景物)景物)2.2.模型变换(相当于将模型变换(相当于将3D3D物体放在合适的地方
2、)物体放在合适的地方)3.3.投影变换(相当于将相机镜头调整,使投影变换(相当于将相机镜头调整,使3D3D景景物投影在物投影在2D2D胶片上,裁剪、改变大小)胶片上,裁剪、改变大小)4.4.视区变换(决定胶片大小)视区变换(决定胶片大小) 一个一个3D3D图形的显示包括下面步骤:图形的显示包括下面步骤: 眼坐标:想象成眼坐标:想象成“ “绝对绝对” ”屏幕坐标。默认为屏幕原点,屏幕坐标。默认为屏幕原点,z z轴指轴指向用户。可以理解为一个虚拟坐标系。眼坐标不是真正的坐向用户。可以理解为一个虚拟坐标系。眼坐标不是真正的坐标,而是虚拟的固定坐标系。标,而是虚拟的固定坐标系。 用用3D OpenGL
3、3D OpenGL绘图,笛卡儿坐标系,未变换时,二者相同。绘图,笛卡儿坐标系,未变换时,二者相同。 所有变换是将当前坐标系相对于眼坐标系进行修改。所有变换是将当前坐标系相对于眼坐标系进行修改。基本概念基本概念 xyxyz 变换本质:移动或旋转对象就是相对于眼坐标系移变换本质:移动或旋转对象就是相对于眼坐标系移动和旋转。下图动和旋转。下图 变换的问题,就是修改当前坐标系,在坐标系下的变换的问题,就是修改当前坐标系,在坐标系下的图形自然就变换了。图形自然就变换了。基本概念基本概念 xyyxOpenglOpengl变换变换 变换变换用途用途视图视图指定观察者的位置指定观察者的位置模型模型在场景中移动
4、对象在场景中移动对象模型视图模型视图描述视图对象和模型变描述视图对象和模型变换的对偶性换的对偶性投影投影对视见空间进行裁剪或对视见空间进行裁剪或改变大小改变大小视区视区对到窗口的最终输出进对到窗口的最终输出进行缩放行缩放 视图变换:场景中的第一个变换,解决视图变换:场景中的第一个变换,解决把视点放在把视点放在什么地方的问题什么地方的问题。作为一个参考坐标系。作为一个参考坐标系。 一般先指定视图变换,再指定其他变换。一般先指定视图变换,再指定其他变换。 视图变换的视点应当有利于看物体和场景。如下图视图变换的视点应当有利于看物体和场景。如下图视图变换视图变换视点视点眼坐标系眼坐标系视点视点 目的:
5、把对象移动到合适的位置目的:把对象移动到合适的位置 在方向、尺寸和形状等方面的变化可以通过改变对在方向、尺寸和形状等方面的变化可以通过改变对象坐标描述的几何变换来实现。即象坐标描述的几何变换来实现。即模型变换,针对模型变换,针对模型本身,如平移、旋转、比例等。模型本身,如平移、旋转、比例等。 模型视图的对偶性:模型变换或视图变换二者是相模型视图的对偶性:模型变换或视图变换二者是相同的,例如,定义了视点,就改变了对象的位置。同的,例如,定义了视点,就改变了对象的位置。 向前移动坐标系和向后移动对象是等效的。这里称向前移动坐标系和向后移动对象是等效的。这里称为模型视图变换。而这取一即可。为模型视图
6、变换。而这取一即可。模型变换模型变换 先绕先绕z z旋转,再沿旋转,再沿x x轴平移轴平移 先沿先沿x x轴平移,再绕轴平移,再绕z z轴旋转轴旋转模型变换的顺序及作用模型变换的顺序及作用xyyxxyy xxyyxyxyyyyx每次变换都是相对于刚执行完每次变换都是相对于刚执行完的变换来进行的。的变换来进行的。投影变换投影变换 目的:定义视见空间(裁剪体)目的:定义视见空间(裁剪体) 投影类型:正交投影投影类型:正交投影/透视投影透视投影 正交投影:用于工程视图,表达真实尺寸正交投影:用于工程视图,表达真实尺寸 透视投影:具有纵深感效果透视投影:具有纵深感效果cccceeeewzyxwzyx矩
7、阵投影Orthographic ProjectionDOPsame for all pointsOrthographic ProjectionsDOP is perpendicular to the view plane透视投影透视投影 目的:把投影后的物体映射到屏幕上某个位目的:把投影后的物体映射到屏幕上某个位置置 视区变换可以在屏幕上指定任意位置放显示视区变换可以在屏幕上指定任意位置放显示的图像的图像 上述所有的变换都可以用矩阵变换实现上述所有的变换都可以用矩阵变换实现视区变换视区变换顶点变换各阶段顶点变换各阶段XYZwModelviewMatrixProjectionMatrixPers
8、pectivedivisionViewportTransformationTransformed eye coordinatesnormalized device coordinatesclipcoordinateswindow coordinates3D3D显示流程图显示流程图CTMverticesverticesCURRENT TRANSFORMATION MATRIX?CTMMODEL VIEWPROJECTIONCURRENT TRANSFORMATION MATRIXverticesvertices模型视图变换矩阵模型视图变换矩阵 首先必须设定矩阵模式为:首先必须设定矩阵模式为: 模
9、型视图变换模型视图变换glMatrixMode(GL_MODELVIEWglMatrixMode(GL_MODELVIEW);); 4 44 4矩阵矩阵: : 物体的顶点是一个顶点阵矢量物体的顶点是一个顶点阵矢量V.V. 每个绘制过程之前,都要进行变换每个绘制过程之前,都要进行变换V V M = V M = V eeeewzyxwzyx图矩阵模型视0000模型视图变换矩阵模型视图变换矩阵 模型变换矩阵和视图变换的矩阵区别:模型变换矩阵和视图变换的矩阵区别:如果按照模型变换理解,则是按照变换函数的顺序如果按照模型变换理解,则是按照变换函数的顺序执行,而且坐标系随之变换;相当于相对坐标系,执行,而
10、且坐标系随之变换;相当于相对坐标系,后面的坐标系是针对这个相对坐标系的后面的坐标系是针对这个相对坐标系的执行顺序:先执行平移变换(执行顺序:先执行平移变换(M1M1),再执行旋转变换),再执行旋转变换(M2M2)。效果:作用于对象。)。效果:作用于对象。M1M2M1M2xyxyyyyx模型视图变换矩阵模型视图变换矩阵如果按照视图坐标系理解,则是按照变换函数的逆如果按照视图坐标系理解,则是按照变换函数的逆序执行,坐标系不变;相当于绝对坐标系变换序执行,坐标系不变;相当于绝对坐标系变换. .执行顺序:相对于先执行相对绝对坐标系旋转,再相执行顺序:相对于先执行相对绝对坐标系旋转,再相对绝对坐标系平移
11、对绝对坐标系平移 M1M2M1M2xyyyxxxyxyyyyx模型视图变换矩阵应用举例模型视图变换矩阵应用举例 例如:画一个边长为例如:画一个边长为1010的正方形:的正方形:glutWireCube(10.0f)glutWireCube(10.0f);(默认坐标在原点);(默认坐标在原点) 如果在如果在y y1010的地方画这个块呢?的地方画这个块呢?考虑把模型放在哪里?(或者照相机在哪考虑把模型放在哪里?(或者照相机在哪里?):指定矩阵模式里?):指定矩阵模式确定确定矩阵矩阵参数:参数: glTranslatef(0.0,10.0,0.0);画画glutWireCube(10.0f)glu
12、tWireCube(10.0f);此时会在新地方画此时会在新地方画出图形出图形glMatrixMode(GL_MODELVIEW);1010000100001lllzyx如果是旋转呢?如果是旋转呢?如果是比例呢?如果是比例呢?模型视图变换矩阵应用举例模型视图变换矩阵应用举例10模型视图变换矩阵应用举例模型视图变换矩阵应用举例 注意的问题:注意的问题:模型放在什么地方模型放在什么地方裁剪窗口的设定,如果不当,易造成看不到图裁剪窗口的设定,如果不当,易造成看不到图形形 例子:几何变换例子:几何变换/trans/trans,说明如下问题:,说明如下问题:变换矩阵的影响(比例、平移、旋转)变换矩阵的影
13、响(比例、平移、旋转)裁剪窗口的影响裁剪窗口的影响平移、旋转变换函数平移、旋转变换函数平移:平移:void glTranslated(GLdouble x, GLdouble y, GLdouble z); void glTranslatef(GLfloat x, GLfloat y, GLfloat z );旋转:绕矢量逆时针旋转角度旋转:绕矢量逆时针旋转角度void glRotated( GLdouble angle, GLdouble x, GLdouble y, GLdouble z );void glRotatef(GLfloat angle, GLfloat x, GLfloat
14、y, GLfloat z );比例变换比例变换 比例:在比例:在XYZ XYZ 方向缩放方向缩放, ,缩放因子缩放因子为为 x y zx y zvoid glScaled(GLdouble x, GLdouble y, GLdouble z );void glScalef(GLfloat x, GLfloat y, GLfloat z); 1000000000000zyx变换变换/trans变换变换/trans-trs把单位矩阵加载到模型视图矩阵把单位矩阵加载到模型视图矩阵 glMatrixMode(GL_MODELVIEW); glLoadIdentity();当前矩阵指定为当前矩阵指定为模
15、型视图矩阵模型视图矩阵矩阵复位到原点矩阵复位到原点为什么?为什么?模型视图矩阵中的单位矩阵模型视图矩阵中的单位矩阵 连续变换:两个以上变换的效果连续变换:两个以上变换的效果变换累加的原因:变换相对于当前矩阵。结果不变换累加的原因:变换相对于当前矩阵。结果不正确。正确。单位矩阵的作用:单位矩阵的作用:每次变换完,回到初始位置,每次变换完,回到初始位置,指定单位矩阵,新的变换是相对单位矩阵的。指定单位矩阵,新的变换是相对单位矩阵的。画画2个圆个圆Y移动移动+10X移动移动10实际变换结果:实际变换结果:第二个矩阵是针第二个矩阵是针对当前矩阵对当前矩阵模型变换举例模型变换举例 Example:Exa
16、mple:glMatrixMode(GL_MODELVIEW);glLoadIdentity();glTranslatef(0.0,10.0,0.0);glutSolidSphere(1.0,15,15);/画第一个球画第一个球 glLoadIdentity(); glTranslatef(10.0,0.0,0.0); glutSolidSphere(1.0,15,15);/);/画第二个球画第二个球例子:几何变换例子:几何变换/ttrans/ttrans画画2个圆个圆Y移动移动+10X移动移动10矩阵堆栈矩阵堆栈 用户存储当前变换矩阵,压入堆栈,用用户存储当前变换矩阵,压入堆栈,用 glPu
17、shMatrixglPushMatrix()() 使用堆栈,弹出使用堆栈,弹出用用 glPopMatrixglPopMatrix()() 这个命令只在使用这个命令只在使用 GL_MODELVIEWGL_MODELVIEW 矩阵矩阵模式下。模式下。 目的:处理复杂的多个相对中心的变换,目的:处理复杂的多个相对中心的变换,例如太阳地球月亮运转变换例如太阳地球月亮运转变换矩阵堆栈矩阵堆栈 用途:如果后面的变换经常用到某个变用途:如果后面的变换经常用到某个变换,而又不希望矩阵复位,则放入堆栈,换,而又不希望矩阵复位,则放入堆栈,需要时弹出使用需要时弹出使用 OpenGLOpenGL有有3 3个堆栈:个
18、堆栈:模型视图矩阵堆栈,模型视图矩阵堆栈,投影矩阵堆栈,投影矩阵堆栈,纹理堆栈。纹理堆栈。模式模式设定设定StackCurrentStackCurrentLoad MatrixVertices3DModelVertices3D2DModelviewProjectionMatrix Mode模式指定后面模式指定后面的矩阵属于哪的矩阵属于哪个堆栈的变换个堆栈的变换glMatrixMode(?);指定是什么变换指定是什么变换变换变换矩阵堆栈举例矩阵堆栈举例 程序程序5.1 atom-5.1 atom-原子核运动原子核运动 原子核中心(原子核中心(0,0,-1000,0,-100) 3 3个电子围绕原
19、子核在不同的轨迹上运动个电子围绕原子核在不同的轨迹上运动第一个:在第一个:在x-zx-z平面绕平面绕y y轴运动轴运动第二个:在一个法矢第二个:在一个法矢4545度的平面上过原子核的度的平面上过原子核的空间空间4545度的轴运动度的轴运动第三个:在一个法矢第三个:在一个法矢4545度的平面上过原子核度的平面上过原子核的空间的空间4545度的轴运动度的轴运动矩阵堆栈举例矩阵堆栈举例 和动画有关的一些函数和动画有关的一些函数 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);/双缓存双缓存 glutTimerFunc(500, Tim
20、erFunc, 1);/一次激发一次激发定时器定时器 glutPostRedisplayglutPostRedisplay();/();/重新刷新当前窗口重新刷新当前窗口 glutSwapBuffersglutSwapBuffers();/();/光滑实现双缓冲变换光滑实现双缓冲变换矩阵堆栈举例矩阵堆栈举例 分析:分析: 运动:定时发消息,注册函数有时间事件运动:定时发消息,注册函数有时间事件glutTimerFunc(500, TimerFunc, 1);/时间事时间事件函数件函数注册函数注册函数调用注册函数前调用注册函数前等待的时间等待的时间传送给回调函数传送给回调函数的值的值功能:只激发
21、一次功能:只激发一次 定时的实现:不断调用定时器自身,不断刷新定时的实现:不断调用定时器自身,不断刷新 刷新过程:双缓冲不断交换刷新过程:双缓冲不断交换矩阵堆栈举例矩阵堆栈举例 绕绕y轴:每次时间事件,让小球相对轴:每次时间事件,让小球相对y轴转一个角度轴转一个角度(2个函数实现)为什么不是一个旋转函数?个函数实现)为什么不是一个旋转函数? 绕空间绕空间45度的轴:让小球把相对度的轴:让小球把相对y轴转到轴转到45度,度,然后绕这个新然后绕这个新y轴旋转(轴旋转(3个函数实现)个函数实现) 绕空间绕空间45度的轴:让小球把相对度的轴:让小球把相对y轴转到轴转到45度,度,然后绕这个新然后绕这个
22、新y轴旋转(轴旋转(3个函数实现)个函数实现)Atom:改颜色,关闭其他球,改速度:改颜色,关闭其他球,改速度Solar:glTranslatef(0.0f, 0.0f, -100.0f);/红色球放置在红色球放置在100处处/ Red NucleusglColor3ub(255, 0, 0);glutSolidSphere(30.0f, 15, 15);/在平移后的坐标系处画红球在平移后的坐标系处画红球/ Yellow ElectronsglColor3ub(255,255,0);glPushMatrix();/把把z100的矩阵入栈,同时它还继续使用的矩阵入栈,同时它还继续使用glRota
23、tef(fElect1, 0.0f, 1.0f, 0.0f);/绕红球所在坐标系的绕红球所在坐标系的Y轴旋轴旋转转glTranslatef(90.0f, 0.0f, 0.0f);/沿旋转后的坐标系平移,定位沿旋转后的坐标系平移,定位1号号小球的位置小球的位置glutSolidSphere(6.0f, 15, 15);/在在1号小球位置画号小球位置画1号球号球透视投影透视投影透视投影变换方法透视投影变换方法1 1 透视投影(透视投影(“近大远小近大远小”),有深度感,),有深度感,用这个矩阵乘以当前矩用这个矩阵乘以当前矩阵,以完成变换阵,以完成变换 void glFrustum(GLdouble
24、 left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble znear, GLdouble zfar ); 创建一个平行锥状视见体矩阵,创建一个平行锥状视见体矩阵,将将(left bottom znear )(right, top, zfar) 内的图形内的图形投影到投影到z far平面上平面上用途:把用途:把3D 模型投影到模型投影到2D平面上平面上透视投影变换方法透视投影变换方法2 2 gluPerspective(fovy, Aspect, znear, zfar); 用途:把用途:把3D 模型投影到模型投影到2D平面上,
25、用得比较多平面上,用得比较多更直观更直观垂直方向上的锥角垂直方向上的锥角纵横比纵横比whfovy变换变换/perspect3D3D正交投影前后面可指定正交投影前后面可指定void glOrtho(Gldouble left, Gldouble right, Gldouble bottom, Gldouble top,Gldouble near, Gldouble far);用途:定义一个用途:定义一个3D3D裁剪空间裁剪空间2D正交投影前后面固定正交投影前后面固定glOrtho2D(GLdouble left, Gldouble right, Gldouble bottom, Gldouble
26、 top);用途:定义了一个窗口,作为裁剪域,即:用途:定义了一个窗口,作为裁剪域,即:x1 = left, x2 = right, y1 = bottom, y2 = top 把场景投影到屏幕上把场景投影到屏幕上 指定指定2D2D图形放在屏幕的什么地方图形放在屏幕的什么地方 每当窗口改变时,可得到新的窗口每当窗口改变时,可得到新的窗口w w、h h 保证图形不变形,与保证图形不变形,与OrthoOrtho配合进行修正配合进行修正视区变换视区变换 w w、h h会影响图形变形,要检测窗口尺寸,会影响图形变形,要检测窗口尺寸,进行宽度和高度修正,保证图象不变形进行宽度和高度修正,保证图象不变形
27、视区变换视区变换 函数函数glViewportglViewport ( (int x, intint x, int y y, sizei w, sizei, sizei w, sizei h); h);其中:其中:前前2 2项表示屏幕窗口中的视区的左下角坐标,项表示屏幕窗口中的视区的左下角坐标,后后2 2项表示视区的宽度和高度。(以像素为单位)项表示视区的宽度和高度。(以像素为单位)默认视区为整个窗口默认视区为整个窗口.wh例子:变换例子:变换/viewport几个概念之间的关系几个概念之间的关系 窗口:窗口:windows生成的一个矩形区域生成的一个矩形区域ww,hw 视区:在窗口上的一个矩
28、形区域,由用户指定新的视区:在窗口上的一个矩形区域,由用户指定新的wv,hv 视见空间:用户定义的一个有界裁剪空间视见空间:用户定义的一个有界裁剪空间 当窗口改变,得到新的当窗口改变,得到新的ww,hw ,必须:,必须: 视见空间映射到视区上视见空间映射到视区上 视区放到窗口上视区放到窗口上wvhvwwhw视区与正交投影的配合使用视区与正交投影的配合使用纵横比:垂直方向上一个单位长度的像素数纵横比:垂直方向上一个单位长度的像素数与水平方向上相同长度单位的像素数之比与水平方向上相同长度单位的像素数之比纵横比纵横比1,正方形,正方形纵横比纵横比0.5,水平方向每两个像素为一个单位水平方向每两个像素
29、为一个单位长度,垂直方向一个像素为单位长度长度,垂直方向一个像素为单位长度修改视见空间的目的:保证视见空间的纵横修改视见空间的目的:保证视见空间的纵横比与视区纵横比相同比与视区纵横比相同视区与正交投影的配合使用视区与正交投影的配合使用 glViewport(x, y, w, h);OpenGL修改裁剪空间配合到视区的映射。修改裁剪空间配合到视区的映射。为保证图形不变形,修改裁剪空间为保证图形不变形,修改裁剪空间左下角点左下角点视区大小视区大小视区与正交投影的配合使用视区与正交投影的配合使用if(w1, (250*h/w -0)/ (250-0)=h/w当当w/h1, (250-0)/(250*
30、w/h-0)=h/w程序用例正交投影(物体不位于中心)程序用例正交投影(物体不位于中心)void ChangeSize(GLsizei w, GLsizei h)GLfloat nRange = 120.0f;/ Prevent a divide by zeroif(h = 0)h = 1;/ Set Viewport to window dimensions glViewport(0, 0, w, h);/ Reset coordinate systemglMatrixMode(GL_PROJECTION);glLoadIdentity();例子:变换例子:变换/viewport程序用例正交
31、投影(续)程序用例正交投影(续) if (w = h) glOrtho (0.0f, 250.0f, 0.0f, 250.0f*h/w, 1.0, -1.0); else glOrtho (0.0f, 250.0f*w/h, 0.0f, 250.0f, 1.0, -1.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();程序用例正交投影(物体位于中心)程序用例正交投影(物体位于中心)void ChangeSize(GLsizei w, GLsizei h)GLfloat nRange = 120.0f;/ Prevent a divide by zeroif(h = 0)h = 1;/ Set Viewport to window dimensions glViewport(0, 0, w, h);/ Reset coordinate systemglMatrixMode(GL_PROJECTION);glLoadIdentity();例子:变换例子:变换/viewport-center程序用例正交投影(续程序用
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 工程采购合同的价款支付方式3篇
- 子公司创建与员工激励3篇
- 入股协议书模板3篇
- 合同补充协议的签订流程详解3篇
- 工地临时围墙施工合同3篇
- 员工借调协议3篇
- 代签委托书在融资租赁中的应用3篇
- 种子种苗繁殖与新型农业经营主体的融合考核试卷
- 矿产勘查地球化学方法考核试卷
- 批发业基础知识考核试卷
- 河南省普通高中2024-2025学年高三下学期学业水平选择性模拟考试(四)历史试题(原卷版+解析版)
- 一例盆腔脏器脱垂全盆底重建术患者的护理
- 快手账号转让合同范例
- 2022年江苏凤凰出版传媒集团有限公司招聘笔试题库及答案解析
- 年产11万吨聚丙烯合成工艺设计
- 幼儿园教学课件《神奇的色彩女王 》课件
- 信息不对称论文
- 话剧《林黛玉进贾府》
- 妊娠期高血压综合征-ppt课件
- 《电力工程》PPT精品课程课件全册课件汇总
- 高强螺栓螺母垫圈重量一览表
评论
0/150
提交评论