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