翻译《real-time 3d terrain engines using C++ and DX9 》(7)

  
模型资源
       cModelResource类可能是我们将会使用的最重要的类了,它当然是我们最经常使用的资源。这个资源类是一个完整的基于D3DXFRAME层级树的容器。因为复合节点可以背这些对象包含,cModelResource在游戏中可以代表不只一个的物理物体。例如,一个格斗者人物角色可能包含一个完整的制作了动画的骨骼,蒙好了皮的皮肤和衣服网格,和每个武器或者盾牌的静态模型。每个网格一次维护到cRenderMethods和cSurfaceMaterial对象的连接,使cModelResource对象在我们的引擎中表现得是一个完全的实体(entity),而不仅仅是一个几何体。
       正如先前提到的,我们漂亮的使用D3DXFRAME层级来完成这种存储。这些对象在第二章“Fundamental 3D Objects”中有描述,可以作为理想的骨骼动画和蒙皮网格的存储方法。一个D3DX对这些结构的实现的很大特点就是他们是用户可扩展的。通过从D3DXFRAME和D3DXMESHCONTAINER中派生得到我们自己的结构,我们可以在这些积累提供数据的顶部添加我们自己的针对平台的数据。
       这很重要,因为他允许我们我们挂接我们自定义资源,cEffectFile和cSurfaceMaterial。这将D3DX提供的简单的单纹理包装的的网格转化为HLSL着色的,符合纹理数据库。使用这些扩展的类需要创建一个D3DX接口来管理帧层级中的结点。然而,第一步是申明我们的新数据类型。清单4.6展示了我们对D3DXFRAME和D3DXMESHCONTAINER的扩展。
 
我们对D3DXFRAME基类的增加是最小化的。用来构建层级数D3DXFRAME_DERIVED对象被分配到一个固定数组中。因此,即使我们使用一个树结构去使用这个数据,我们怡然可以使用它在线性数组中唯一的索引标识每个节点。我们可以这么做因为可以假定我们的D3DXFRAME_DERIVED树不可以动态改变大小和顺序。一旦一个层级被加载,它在它余下的生命中都保持同样的结构。
为了比D3DXFRAME提供的更多的维护家族(family)信息,我们可以在存储他们的数组中使用索引值去标识任何可能的父对象和根对象。frameIndex是整棵树的根节点。prentIndex指向该节点的上一个父节点。使用-1(word值为0xffff)标识未使用的索引值。
为什么不使用指针?这些数据打算作为引用对象。这个课模型的符合实例可以被放在我们的世界中,每个都有它自己的D3DXFRAME_DERIVED结构集合。这些唯一的结构将包含帧节点每个实例的变换矩阵。通过存储我们的家族(family)信息而不是指针作为索引值,就更容易为该模型创建一个新的实例,仅仅通过为框架对象分配新的数组然后拷贝数据就可以了。不能协商,因为索引值和存储数据的数组的根相关。
D3DXMESHCONTAINER_DERIVED结构更复杂一些。在D3DXMESHCONTAINER基类顶部,我们增加了所有我们引擎特有的数据。这包括一个网格使用的cRenderMethods和cSurfaceMaterials的链表,网格的蒙皮信息和网格本身。我们将我们自己的D3DMEHSDATE结构同基类包含的那个分开存储,这样可以在系统内存中的模型和我们的渲染方法将要使用的经过优化并且载入显存中的模型的维护他们分离。
除了允许我们扩展积累,为框架树提供文件I/O的D3DX函数也可以被扩展以提供我们自定义数据。这将创建一个扩展自Direct3D X文件格式的符合我们需求的接口。这要求我们创建3个关键接口类:一个负责分配和销毁我们的数据结构,一个负责在X文件中保存这些结构,一个负责从X文件中加载这些数据。
这3个接口都在D3DX类ID3DXAllocateHierarchy,ID3DXLoadUserDate和D3DXSaveUserDate中提供。为了增加我们自己的数据,我们简单的从这些接口中派生我们的类,并且为每个基类中定义的纯虚函数提供实现。位于随书光盘的d3dx_frame_manager源文件展示了这些函数。这些文件比我们希望的用文字更好的从细节上展示了分配,清除和文件I/O。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值