维图形程序设计.ppt
三维图形程序设计,1,三维图形程序设计3,Face,三维图形程序设计,2,Chap3 学习如何帮助OpenGL观察,Chap2,三维图形程序设计,3,Simple1.c2,三维图形绘制的最终目标在于将人们在三维空间中思考并创建的三维模型转换为二维图形。在OpenGL中,有三种操作将模型的三维坐标转换为屏幕上的像素位置。,变换:模型变换 视点变换 投影变换,裁剪:裁剪掉位于裁剪面另一面的模型(或模型的局部),视口变换,不可否认的是,帮助OpenGL来观察场景的工作与相机工作有类似之处,所以我们应学习将用相机照相和操作OpenGL对应起来。,三维图形程序设计,4,Temp,三维图形程序设计,5,Temp,在理解顶点变换过程时,让我们回顾一下在线性代数课中所学到的矩阵运算 v=Mv,三维图形程序设计,6,Temp,引例:看看如何绘制一个不那么规整的立方体三维模型,三维图形程序设计,7,Temp,认识几个对日后工作有帮助的函数,void glMatrixMode(mode),mode,GL_MODELVIEW,GL_PROJECTION,GL_TEXTURE,void glLoadIdentity(viod),在矩阵的乘法中,有一种矩阵起着特殊的作用,如同数的乘法中的1,我们称这种矩阵为单位矩阵它是个方阵,除左上角到右下角的对角线(称为主对角线)上的元素均为1以外全都为0。对于单位矩阵,有AE=EA=A,三维图形程序设计,8,Temp,认识几个对日后工作有帮助的函数,void glLoadMatrixfd(*m)C=M,void glMultMatrixfd(*m)C=CM,提醒:其默认处理模式数组m44中的mij位于OpenGL变换矩阵的第i列,第j行,这样的思考方式估计会让人沮丧,但没关系,我们可以用m16或下面2个函数来替代,void glLoadTransposeMatrix fd(*m)C=M,void glMultTransposeMatrix fd(*m)C=CM,三维图形程序设计,9,Temp,进入视点和模型变换的话题,从这个图引出的有趣问题,看教材上的一个模型变换的例子,I IN INM INML INMLv NMLv N(M(Lv),三维图形程序设计,10,Temp,从不同的角度来思考同一个问题立方体要停留在x轴上的问题,1、从全局固定坐标的角度,2、从移动局部坐标的角度,结论:第1步:平移第2步:旋转以移动局部坐标系的方式来理解与常规思路一致,三维图形程序设计,11,Temp,模型变换函数集,void glTranslate f d(x,y,z),void glRotate f d(angle,x,y,z),三维图形程序设计,12,Temp,模型变换函数集,void glScale f d(x,y,z),三维图形程序设计,13,Temp,来测试一下函数的效力,思考如何实现下图的变换,三维图形程序设计,14,Temp,学习视点变换,方法:1、使用模型变换函数集来进行视点变换,这需要反向思考即可2、使用实用库函数gluLookAt()gluLookAt(eyex,eyey,eyez,centerx,centery,centerz,upx,upy,upz)3、在某些情形下,会要求用户去自定义视点的变换函数,这种情形很少见,因为gluLookAt函数确实很有用,三维图形程序设计,15,Temp,学习投影变换,投影变换意味着:1、投影体决定了物体将被如何投影到屏幕上(2种不同的投影方式)2、决定哪些模型或模型的哪些部分将被裁剪掉,三维图形程序设计,16,Temp,透视投影的函数1、glFrustum(letf,right,bottom,top,near,far)该函数创建一个透视投影矩阵,并将其与当前的矩阵相乘,其中参数定义了视景体:(left,bottom,-near)和(right,top,-near)定义了近裁剪面的左下角和右上角坐标,near和far分别是近裁剪面和远裁剪面距离视点的距离,必须大于0。,透视投影,三维图形程序设计,17,Temp,透视投影的函数1、gluPrespective(fovy,aspect,near,far),三维图形程序设计,18,Temp,正交投影的函数1、glOrtho(left,right,bottom,top,near,far),正交投影,特殊2D格式:glOrtho2D(letf,right,bottom,top),三维图形程序设计,19,Temp,视口是什么?,讨论视口,视口函数:glViewport(x,y,width,height),三维图形程序设计,20,Temp,为什么辛苦创建的窗口里什么也没有?,三维图形程序设计,21,Temp,纠正不那么合适的视角大小角度的一半的正切等于物体大小的一半除以物体距离视点的距离,三维图形程序设计,22,Temp,关于矩阵堆栈的话题1、为什么有矩阵堆栈的概念 为层次模型服务,center,模型视点矩阵,投影矩阵,三维图形程序设计,23,Temp,与矩阵堆栈相关的函数glPushMatrix(void)glPopMatrix(void),三维图形程序设计,24,Temp,返回之前所提到的小车绘制这里假设是已经编写好了绘制车、车轮和螺钉的函数,三维图形程序设计,25,Temp,请思考:目标:绘制一个简单的太阳系模型,只含太阳和一颗行星,行星每天自传一周,每年绕太阳公转一周;太阳就假定静止不同。,提示:行星有2个旋转要处理,一个是公转角度,另一个是自转角度,请思考代码如何编写,三维图形程序设计,26,Temp,来看看答案:核心代码部分,三维图形程序设计,27,Temp,关于附件裁剪面:1、为什么要引入附加裁剪面的概念 你会遇到用户要你显示出物体剖视图的可能吗 2、附加裁剪面的基础内容:1)数量 6 2)平面有Ax+By+Cz+D=0 3、相关函数:glClipPlane(plane,equation),三维图形程序设计,29,Temp,谢谢!,