现在的位置: 首页 > 综合 > 正文

MeshContent, GeometryContent and VertexContent

2013年04月27日 ⁄ 综合 ⁄ 共 1640字 ⁄ 字号 评论关闭

   MeshContent, GeometryContent and VertexContent

仅供个人学习使用,请勿转载,勿用于任何商业用途。 

    相信所有第一次写custom content pipeline的人都会被这三个类弄晕,我也一样,这里做一个简单的小结。

    MeshContent(MC)可以包含一系列子MeshContent和GeometryContent(GC)。MC也储存了一系列顶点位置(MC.Positions),注意是*顶点位置*,不是*顶点*。这一系列顶点位置被它所包含的GC所共享。GC代表了一个由若干顶点组成的最小渲染单元,类似一个ModelMeshPart。GC和VertexContent(VC)是一一对应的关系,每个GC对象都有一个VC。VC的作用是把一些本属于GC的数据单独打包为一个对象,让GC看起来更简洁,逻辑更清楚。MC有如下结构:

MC
|
|------------GC1-----VC1
|    |
|    |---GC2 -----VC2
|    |
|    |---GC3---- VC3
|
|
|------------SubMC1………
|    |
|    |---SubMC2---……..
|    |
|    |---SubMC3----………
|
|----Positions
|

 

    GC通过VC对象中的PositionIndices知道自己引用了MC.Positions中的哪些位置,也可以直接访问VC的Positions属性活得这些所引用的位置。特别要注意的是VC.Positions中的元素可能会大于MC.Positions的元素个数,也就是说VC.Positions中可能会包含对MC.Positions中元素的重复引用。Why?? 如前所述,这里的position只是位置,可能有2个顶点都处在同一位置,但是他们有不同的法线和纹理坐标,所以他们是不同的顶点。VC.Positions中的元素个数,才是当前GC所包含的实际顶点个数。

    那么顶点的纹理和法线保存在哪里呢?这些数据以VertexChannel的形式,保存在VC中。每种不同类型的数据对应一个channel,比如法线在channel1,第一组纹理坐标在channel2,第二组纹理坐标在channel3,等等。每个channel中的元素个数都与VC.Positions中的相同。

    顶点或者说三角形索引是如何储存的呢?索引储存在GC. Indices,注意,这里的索引对应的是VC.Positions中的元素,而不是MC.Position,因为只有VC中的位置才是与最终顶点一一对应的。

    最后看一个例子,假设导入一个人物模型,包含6个部分,躯干,两条手臂,两条腿和头,那么根据在建模软件里的组织形式不同,content pipeline导入之后的数据也可能有2种:

RootMC
|
|-----Positions
|
|-----GC_body---VC_body
|-----GC_head---VC_head
|-----GC_LeftHand---VC_LeftHand
|-----GC_RightHand---VC_RightHand
|…………
|………..

 或者

RootMC
|
|-----Positions
|
|-----GC_body---VC_body
|
|-------MC_head--------Positions
|             |
|             |---GC_head---VC_body
|
|-----MC_LeftHand-----------Positions
|                 |
|                 |---GC_LeftHand—VC_LeftHand
|…………………..
|……………………

 

    在Creator.com的众多sample中,dude.fbx是以第一种方式导出的,而tank.fbx则是第二种。

 

 

 

抱歉!评论已关闭.