计算机图形学_第1页
计算机图形学_第2页
计算机图形学_第3页
计算机图形学_第4页
计算机图形学_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、层级结构和建模方法模型n模型是世界的抽象n这里的世界既可以是真实的,也可以是虚拟的n模型通常是用它的数学方程表示的n在计算机科学中应用抽象数据类型模拟对象的组织n在计算机图形学中应用几何对象模拟整个世界模型的数学表示n当建立一个数学模型时,需要仔细确定采用哪种数学表示n根据所需要模拟的现象进行选择n例:常微分方程适用于模拟弹簧质子系统的行为;而偏微分方程则适用于模拟流体的行为n在计算机图形学中关键在于几何对象的表示方式以及对象之间关系的反映分级建模基本内容n线性建模的局限性n符号与实例n分级模型n关联的模型n机器人n介绍树模型与DAG模型实例变换n从一个原型对象(称为一个符号, symbol)

2、开始n在模型中对象的出现称为一个实例(instance)n需要进行放缩、定向、定位n定义实例的变换符号-实例表n存贮模型的方法是:给每个符号赋一个编号,并存贮实例变换的参数汽车模型的关系n符号-实例表并没有显示出来模型各部分之间的关系n考虑汽车的模型n车身+ 四个一样的车轮n两个符号n向前运动的速度由车轮的旋转速度确定的由函数调用反映结构car(speed) chassis();wheel(right_front);wheel(left_front);wheel(right_rear);wheel(left_rear);没有很好地反映各部分之间的关系图结构n图(graph)由节点(node)和

3、边(edge, 也称为link)组成n边连接两个节点n有向图无向图n环路(cycle): 构造一个循环的有向路径树结构n一种特殊的图结构,其中每个节点(除了根节点)都有一个父节点n可以有多个子节点n叶子:没有子节点的节点汽节的树结构模型DAG结构模型n如果应用所有轮子相同的事实,那么就得到有向无环图(directed acyclic graph, DAG)n与树结构的处理没有很大的不同应用树结构建模n需要确定把哪种信息放在节点上,哪种信息放在边上n节点n要绘制的内容n指向子节点的指针n边n可以包含变换矩阵改变的信息(也可以保存在节点处)机器人手臂关联的模型n机器人手臂就是一个关联的模型(art

4、iculated model) 的例子n部分与部分之间在关节处连接在一起n可以通过给定关节角指定模型的状态机器人手臂中的关系n支架部分独立旋转n单个角度确定它的位置n下臂与基本部分相连n它的位置与支架的旋转相关n必须相对于支架平移,并且绕关节点旋转n上臂与下臂相连n它的位置与支架和下臂的位置有关n相对于下臂部分平移,并且绕与下臂相连的关节处旋转所需要的矩阵n支架的旋转:Rbn把M = Rb应用到支架上n下臂相对于支架部分部分平移:Tlun下臂绕关节旋转:Rlun把M=RbTluRlu应用到下臂上n上臂相对于下臂平移:Tuun上臂绕关节旋转:Ruun把M=RbTluRluTuuRuu应用到上臂上

5、机器人手臂的OpenGL代码robot_arm() glRotated(theta, 0.0, 1.0, 0.0);base();glTranslated(0.0, h1, 0.0);glRotated(phi, 0.0, 1.0, 0.0);lower_arm();glTranslated(0.0, h2, 0.0);glRoated(psi, 0.0, 1.0, 0.0);upper_arm();机器人手臂的树结构模型n注意上述代码显示了模型中各部分的关系n这样可以很容易改变各部分的样子,而不改变它们相互之间的关系n右图为机器人手臂的树结构模型n希望为节点建立起一个一般的节点结构可能的节点

6、结构推广n需要处理多个子节点的情形n如何表示一个更一般的树结构?n如何遍历这样的数据结构?n动画n如何动态应用?n能否在执行期间创建和删除节点?人体示意图模型的建立n可以用二次曲面简单实现前述示意图n椭球面与圆柱面n通过函数调用创建每一部分ntorso();nleft_upper_arm();n矩阵描述节点相对于其父节点的位置nMlll相对于左上腿定位左下腿带有矩阵的树结构显示与遍历n示意图的位置是由11个关节角(头部有两个,其它每部分一个)确定的n树结构的显示需要对图进行遍历n访问每个节点一次n在每个节点处的绘制函数描述与节点相联系的部分,并且应用恰当的变换矩阵进行定位和定向变换矩阵n有10

7、个相关的矩阵nM定位和定向整个示意图,它作用在根节点躯干上nMh相对于躯干定位头部nMlua, Mrua, Mlul, Mrul相对于躯干定位手臂与腿nMlla, Mrla, Mlll, Mrll相对于四肢的上半部分定位各自的下半部分基于堆栈的遍历n把模型视图矩阵设为M,并绘制躯干n设置模型视图矩阵为MMh,并绘制头部n对于左上臂,应用矩阵MMlua, 其它部分类似n在实际应用时,没有必要自己重新计算MMlua或者应用逆矩阵,可以应用矩阵堆栈存贮矩阵M以及其它在遍历树结构时遇到的矩阵遍历代码分析n上述代码描述了特定的树结构,并采用了特定的遍历策略n能否设计出更一般的方法呢?n注意在示例代码中没

8、有对状态进行修改,例如没有改变颜色n也可以采用glPushAttrib和glPopAttrib以避免意料之外的状态改变对后面的代码有影响一般的树数据结构n需要一个数据结构表示树和一个算法遍历树n采用左子右亲(left-child right-sibling)结构:n应用链表n在数据结构中每个节点有两个指针n左:下一个节点n右:子节点链表左子右亲树结构树节点的结构n在每个节点需要存贮下列信息n指向同胞的指针n指向子节点的指针n一个函数指针,指向绘制节点表示对象的函数n乘在当前模型视图矩阵右边的齐次坐标矩阵n表示从父节点到当前节点的改变n在OpenGL中这个矩阵存贮为一维的形式,矩阵按列展开树节点

9、的C定义structtreenodeGLfloatm16;void (*f)();structtreenode*sibling;structtreenode*child;定义躯干节点treenodetorso_node, head_node, lua_node, ;/*应用OpenGL函数形成矩阵*/glLoadIdentity();glRotatef(theta0, 0.0, 1.0, 0.0);/*把模型视图矩阵移到m中*/glGetFloatfv(GL_MODELVIEW_MATRIX, torso_node.m);torso_node.f= torso; /torso()绘制躯干tor

10、so_node.sibling= NULL;torso_node.child= &head_node;注记n示意图的位置是由存贮在theta11中的11个关节角确定的n可以通过改变这些角度并且重新显示实现动画效果n利用glRotate和glTranslate形成所需要的矩阵n由于矩阵是相对于模型视图矩阵构成的,因此需要首先把原来的模型视图矩阵送到矩阵堆栈中遍历void traverse(treenode*root)if(root= NULL) return;glPushMatrix();glMultMatrix(root-m);root-f();if(root-child!=NULL)

11、traverse(root-child);glPopMatrix();if(root-sibling != NULL)traverse(root-sibling);注记n在模型视图矩阵上乘以节点矩阵之前,必须保存模型视图矩阵n对子节点进行的矩阵修改并不应用到同胞节点上,因为它们有自己的矩阵n遍历程序适用于任意的左子右亲树结构n特定的树可以通过对树节点进行特别地处理实现n遍历的顺序是需要考虑的,因为函数有可能对状态进行了修改动态树结构n如果应用指针,那么树结构可以是动态的typedeftreenode*tree_ptr;tree_ptrtorso_ptr;torso_ptr=malloc(siz

12、eof(treenode);n节点的定义以及节点的遍历策略本质上是一样的,但在执行过程中需要增加或删除节点图形对象与场景图基本内容n介绍图形对象n推广对象的思想,使之包含光源、照相机和属性n介绍场景图(scene graphs)直接模型图形的局限n当在应用程序中定义一个几何对象时,在代码被执行后,对象就进入流水线过程n然后它就会从图形系统中消失了n为了重新绘制同样的或者改变了的对象,那么就需要重新执行代码n显示列表功能只是对这个问题进行了部分解决OpenGL与对象nOpenGL缺少面向对象的功能n例如,考虑一个绿球n可以用多边形建立它的模型,也可以用OpenGL提供的二次曲面功能建模n它的颜色

13、是由OpenGL状态确定的,这不是对象的一种属性n这不符合物理对象的观念n可以利用面向对象语言和技术建立起更好的对象代码强制程序模式n例:旋转立方体n旋转函数必须知道立方体的表示方式n顶点列表n边表面向对象的程序模式n在这种模式中,表示是与对象存贮在一起的n应用程序发送消息给对象n对象中包含函数(也称为方法)可以自己变换对象C/C+n可以利用C的struct类型建立对象nC+提供了更好的功能支持n可以应用class结构n可以利用类中的public, private和protected对实现进行必要的隐藏n也可以利用友元标识使得类可以彼此访问立方体对象n假设我们要创建一个简单的立方体对象,可以对

14、它进行放缩、定向、定位,并直接利用代码设置它的颜色,例如cube mycube;mycube.color0=1.0;mycube.color1=mycube.color2 = 0.0;mycube.matrix00=立方体对象的函数n我们也希望具有作用在立方体上面的函数,例如:nmycube.translate(1.0, 0.0, 0.0);nmycube.rotate(theta, 1.0,0.0,0.0);nsetcolor(mycube,1.0,0.0,0.0);n也有方法显示立方体nmycube.render();建立立方体对象class cube public:float color

15、3;float matrix44;/ public 方法private:/ 实现实现n可以在private部分进行任何实现,例如应用顶点列表nprivate部分可以访问public成员,类方法的实现可以应用任何实现,而不需要把它们变为可见的n显示方法需要一些技巧,但它会调用标准OpenGL的绘图函数,例如glVertex其它对象n其它对象具有几何特征n照相机n光源n但我们也应当能够包含非几何对象n材料n颜色n变换(矩阵)应用程序代码cube mycube;material plastic;mycube.setMaterial(plastic);camera frontView;frontVie

16、w.position(x,y,z);光源对象class light /与Phong模型匹配public:booltype; /正交或透视boolnear;float position3;float orientation3;float specular3;float diffuse3;float ambient3;场景描述n重新考虑示意图模型,可见n可以用树结构或者等价的代码描述模型n可以编写出一般的遍历代码从而用于显示n如果可以用C+对象表示场景中所有的成员(照相机、光源、材料、几何体),我们应当能够在一个树结构中列出它们n从而可以应用遍历算法显示场景场景图遍历glPushAttribglPushMatrixglColorglTranslateglRotate对象1glTranslate对象2glPopMatrixglPopAttrib分隔节点n需要用它隔离状态改变n等价于OpenGL中的Push/Popn注意,与示意图模型中一样n可以编写一个适用范围广泛的遍历算法n遍历的顺序是相当重要的n如果不应用分隔节点,状态改变会扩

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论