<Real Time 3D Terrain Engines Using C++ And DX9>
Chapter 2. Fundamental 3D Objects
这章主要是讲.x文件和.fx文件,以及在我看来非常复杂的骨骼动画和蒙皮网络。这章有很多接口和结构在以前看for Beginner的书的时候都没见过。For Beginner的书得少看!(不能不看……)
Load & Display a Model using D3DX
显示一个3D物体需要的3个基本元素:
1) 模型自身(几何信息)
2)Material(记录光从物体表面反射的色调)
3)覆盖物体表面的材质(可选项)
显示Mesh三部曲:
1) 从磁盘上读取Mesh
2) 构建渲染该Mesh所需的objects
3) 用这些objects显示Mesh的内容
Mesh在渲染时会被分成许多个subsets,subset是使用同一个material的几何体的集合。
Effect Files
FX Files既可以写入Vectex Shader和Pixel Shader,也可以写入Fix-Function的Pipeline。我还以为FX只能写VS和PS呢。
这块讲得也不深,估计要等到第3章讲HLSL的时候才会细讲吧。
D3DXFRAME & D3DXMESHCONTAINER
这俩玩意以前还真没听过…… 尤其是D3DXFRAME,使用的数据结构居然是“兄弟-儿子”二叉树来表示多叉树的层次结构。而从D3DXMESHCONTAINER的定义上看,它使用的DS就是Link List了。真的要感谢一下自己那几本Data Structure的书了(虽然这两种DS都比较白痴 -_-|||)。
D3DXFRAME和D3DXMESHCONTAINER主要用于组织大型的有层次的Mesh们。Frame就是一个棵多叉树(用二叉树表示),每个Frame里面有一个变换矩阵。而MeshContainer就是多叉树每个节点上的一个链表,用于储存这个Frame里面所有的Mesh。一个多叉树加上一堆链表…… 怪不得Liker说这玩艺复杂呢,是够复杂的。
不过听Snook说,D3DX可以把他们一次性搞定,用D3DXLoadMeshHierarchyFromX,真够体贴的。这东西手工一个一个去读取,不读死才怪。
另外,MeshContainer不只可以存储普通的Mesh,还可以存储Progressive Mesh和Patch Mesh。这要归功于D3DXMESHDATA了。
书上说想创建Skinned Mesh,需要先创建D3DXFrame,然后创建D3DXMESHCONTAINER,最后是ID3DXSkinInfo。哦?这个是虾米东东?书上的讲解看得有点儿晕,去查了查MSDN:
ID3DXSkinInfo Interface
Applications use the methods of the ID3DXSkinInfo interface to manipulate bone matrices, which are used to skin vertex data for animation. This interface is no longer strictly tied to ID3DXMesh and can be used to skin any set of vertex data.
哦,看来是用来操作Bones的。
Skeletal Animation & Skinned Meshs
这节有更复杂的东西出现(我以为那个Frame就已经够复杂了)。一个ID3DXAnimationSet里面包含着一个ID3DXAnimationController的表。每个ID3DXAnimationController都和一个相同Name的Frame连着,比如“左手”啦、“右脚”啦。那么操纵Controller似乎就能够操纵这个部分了。
这章几乎都没有什么代码,就是用语言来描述几个结构和接口之间的关系,虽然大致上明白了,但是理解不够,看来要等到后面看到具体的Code的时候才能有深一层的理解了。