- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第四章 场景节点和数据结构
第四章 场景的节点与数据结构
如果将场景比作房间,那么场景的节点就是房间里的床、桌、灯、柜等设施。著名的3D软件开发工具Open Inventor将应用程序抽象成“a scene graph plus a set of actions”,所有的图形对象、属性、事件响应全由场景的节点来处理,十分适合于图形的交互式绘制。Intra3D 2.0借鉴了Open Inventor的节点设计。本章讲述Intra3D 2.0的节点基类、形体节点、相机节点、光源节点和组节点的设计与实现。
场景图与节点的概念
从数据结构角度讲,场景是一个有向无环图,称为Scene Graph。场景的交互式绘制就是对Scene Graph各个节点的遍历绘制。节点可分为组节点与叶子节点两大类,Scene Graph的根节点总是组节点。以下“伪代码”用于创建图4.1所示的Scene Graph :
图4.1 Scene Graph 的组节点与叶子节点
GroupNode *node1 = new GroupNode ;
GroupNode *node2 = new GroupNode ;
GroupNode *node4 = new GroupNode ;
GroupNode *node7 = new GroupNode ;
LeafNode *node3 = new LeafNode ;
LeafNode *node5 = new LeafNode ;
LeafNode *node6 = new LeafNode ;
LeafNode *node8 = new LeafNode ;
LeafNode *node9 = new LeafNode ;
LeafNode *node10 = new LeafNode ;
node1-AddChild(node2);
node1-AddChild(node6);
node1-AddChild(node7);
node1-AddChild(node9);
node1-AddChild(node10);
node2-AddChild(node3);
node2-AddChild(node4);
node4-AddChild(node5);
node7-AddChild(node8);
如果用深度优先的方法遍历图4.1的Scene Graph,则节点的遍历顺序是1、2、3、4、5、6、7、8、9与10。
Scene Grpah 中的叶子节点可以被多个组节点引用,如图4.2所示。当Scene Grpah比较复杂时,节点之间的引用关系也变得复杂,因此Scene Grpah需要用“对象引用计数”方法来管理节点的内存(见2.5节)。节点可以显式使用new来创建,但不可显式使用delete删除节点,应该用节点的Release函数。
图4.2 叶子节点可以被多个组节点引用
Intra3D 将Scene Graph节点分为组节点(GroupNode),形体节点(ShapeNode),光源节点(DirLightNode、PointLightNode、SpotLightNode)和相机节点(CameraNode)。
所有上述节点均从基类节点SceneNode派生。SceneNode节点中定义了坐标系与丰富的3D交互功能。由于C++类支持数据(Data)和代码(Implementation)的继承,SceneNode节点功能可以被派生类节点继承。但是COM对象仅支持接口继承(本质上是继承虚函数的声明),不支持数据和代码的继承。只能在派生节点中包容ISceneNode并将ISceneNode的函数重新封装为当前节点的函数。COM库中的节点程序要比C++类库的复杂,4.3节将以ShapeNode为例分别论述类与COM对象的程序设计。
相机是否该成为一种节点是值得商讨的话题。直观地讲,相机等同于观察者的眼睛,的确不是场景的组成部分。如果应用程序不涉及相机的交互,那么只需调用OpenGL的几个投影函数就可以实现图形学概念中的相机变换(请参考 Intra3D 的Window3D程序)。如果应用程序涉及复杂的相机交互,例如多个相机的切换,场景的漫游;此时将相机作为节点插入Scene Graph中,可以享用到在SceneNode定义的交互功能(请参考 Intra3D 的SceneView程序)。使用了相机节点的SceneView程序要比不使用相机节点的 Window3D程序复杂。
场 景 节 点 的 基 类
C++类库中的SceneNode程序见Intra3D-DLL\Include\Layer3\SceneNode.h和Intra3D-DLL\Layer3\SceneNode.cpp。COM库
文档评论(0)