《图形对象与场景图》由会员分享,可在线阅读,更多相关《图形对象与场景图(22页珍藏版)》请在金锄头文库上搜索。
1、图形对象与场景图Stillwatersrundeep.流静水深流静水深,人静心深人静心深Wherethereislife,thereishope。有生命必有希望。有生命必有希望第九章第九章层次建模层次建模2第九章之第三节第九章之第三节 图形对象与场景图图形对象与场景图3基本内容基本内容l介绍图形对象l推广对象的思想,使之包含光源、照相机和属性l介绍场景图(scene graphs)4直接模型图形的局限直接模型图形的局限l当在应用程序中定义一个几何对象时,在代码被执行后,对象就进入流水线过程l然后它就会从图形系统中消失了l为了重新绘制同样的或者改变了的对象,那么就需要重新执行代码l显示列表功能只
2、是对这个问题进行了部分解决5OpenGL 与对象与对象lOpenGL缺少面向对象的功能l例如,考虑一个绿球可以用多边形建立它的模型,也可以用OpenGL提供的二次曲面功能建模它的颜色是由OpenGL状态确定的,这不是对象的一种属性l这不符合物理对象的观念l可以利用面向对象语言和技术建立起更好的对象代码6强制程序模式强制程序模式l例:旋转立方体l旋转函数必须知道立方体的表示方式顶点列表边表应用程序函数数据结果7l在这种模式中,表示是与对象存贮在一起的l应用程序发送消息给对象l对象中包含函数(也称为方法)可以自己变换对象面向对象的程序模式面向对象的程序模式应用程序对象与方法消息8C/C+l可以利用
3、C的struct类型建立对象lC+提供了更好的功能支持可以应用class结构可以利用类中的public, private和protected对实现进行必要的隐藏也可以利用友元标识使得类可以彼此访问9立方体对象立方体对象l假设我们要创建一个简单的立方体对象,可以对它进行放缩、定向、定位,并直接利用代码设置它的颜色,例如cube mycube;mycube.color0=1.0;mycube.color1=mycube.color2=0.0;mycube.matrix00=10立方体对象的函数立方体对象的函数l我们也希望具有作用在立方体上面的函数,例如mycube.translate(1.0, 0
4、.0,0.0);mycube.rotate(theta, 1.0, 0.0, 0.0);setcolor(mycube, 1.0, 0.0, 0.0);l也有方法显示立方体mycube.render();11建立立方体对象建立立方体对象class cube public: float color3; float matrix44; / public 方法方法 private: / 实现实现12实现实现l可以在private部分进行任何实现,例如应用顶点列表lprivate部分可以访问public成员,类方法的实现可以应用任何实现,而不需要把它们变为可见的l显示方法需要一些技巧,但它会调用标准O
5、penGL的绘图函数,例如glVertex13其它对象其它对象l其它对象具有几何特征照相机光源l但我们也应当能够包含非几何对象材料颜色变换(矩阵)14应用程序代码应用程序代码cube mycube;material plastic;mycube.setMaterial(plastic);camera frontView;frontView.position(x ,y, z);15光源对象光源对象class light / 与与Phong模型匹配模型匹配 public: boolean type; /正交或透视正交或透视 boolean near; float position3; float
6、orientation3; float specular3; float diffuse3; float ambient3;16场景描述场景描述l重新考虑示意图模型,可见可以用树结构或者等价的代码描述模型可以编写出一般的遍历代码从而用于显示l如果可以用C+对象表示场景中所有的成员(照相机、光源、材料、几何体),我们应当能够在一个树结构中列出它们从而可以应用遍历算法显示场景17场景图场景图18遍历遍历glPushAttribglPushMatrix glColorglTranslateglRotate对象对象1glTranslate对象对象2glPopMatrixglPopAttrib19分隔节
7、点分隔节点l需要用它隔离状态改变等价于OpenGL中的Push/Popl注意,与示意图模型中一样可以编写一个适用范围广泛的遍历算法遍历的顺序是相当重要的如果不应用分隔节点,状态改变会扩散20Inventor 与与 Java3DlInventor和Java3D提供了场景图APIl场景图可以用文本文件或者二进制文件进行描述实现与场景的交换方式是独立的场景图API支持这种功能l然而,所支持的基本元素应当与图形系统的功能匹配因此大多数场景图API是建立在OpenGL或者DirectX上的21VRMLl希望有一种场景图可以在WWW网上应用l需要可以连接到其它地方,从而支持分布式数据库l虚拟现实包装语言(Virtual Reality Markup Language)基于Inventor数据库应用OpenGL实现22