全球旧事资料 分类
ormMatrix)变了,这时就要根据新的变换来计算,所以这个过程一般称作UpdateBo
eMatrix。因为骨骼的变换都是相对父的,要变换顶点必须使用世界变换矩阵,所以这个过程是根据更新了的某些骨骼的骨骼变换矩阵(Tra
sformMatrix)计算出所有骨骼的世界变换矩阵(也即Combi
edMatrix)。在本文的例子中,骨骼只能平移,甚至我们没有用矩阵,所以当有骨骼变动时要做的只是直接计算骨骼的世界坐标,因此函数命名为ComputeWorldPos,相当于UpdateBo
eMatrix后再用顶点乘以Combi
edMatrix。
classBo
egivefathersworldposcomputethebo
esworldposvoidComputeWorldPosfloatfatherWXfloatfatherWYfloatfatherWZ
fm_wxfatherWXm_xm_wyfatherWYm_ym_wzfatherWZm_z
ifm_pSibli
gNULLm_pSibli
gComputeWorldPosfatherWXfatherWYfatherWZ
ifm_pFirstChildNULLm_pFirstChildComputeWorldPosm_wxm_wym_wz其中的递归调用使用了微软例子的思想。
有了上述函数,当某骨骼运动时就可以让其子骨骼跟随运动了,但是怎么让骨骼运动呢?这就是动画问题了。我不打算在这个简单的例子中使用关键帧动画,而只是通过程序每帧改变某些骨骼的位置,DEMO中a
imateBo
es就是做这个的,你可以在里面改变不同的骨骼看看效果。在本文下面会对骨骼的关键帧动画做简单的讨论。
至此,我们定义了骨骼类的结构,手工创建了骨骼层次(实际引擎应该从文件读入),并且可以根据新位置更新骨骼了(实际引擎应该从动画数据读入新的变换或使用物理计算),这样假如我们用连线将骨骼画出来,并且让某个骨骼动起来,我们就会看见他下面的子骨骼跟着动了。当然只有骨骼是不够的,我们要让Mesh跟随骨骼运动,下面就是蒙皮了。骨骼蒙皮动画Ski
edMesh的原理解析(二)
2)蒙皮信息和蒙皮过程
21)Ski
i
fo的定义上文曾讨论过,Ski
edMesh中Mesh是作为皮肤使用,蒙在骨骼之上的。为了让普通的Mesh具有蒙皮的功能,必须添加蒙皮信息,Ski
i
fo。即我们知道Mesh是由顶点构成的,建模时顶点是定义在模型自身坐标系的,即相对于Mesh原点的,而骨骼动画中决定模型顶点最终世界坐标的是骨骼,所以要让骨骼决定顶点的世界坐标,这就要将顶点和骨骼联系起来,Ski
i
fo正是起了这个作用。下面是DEMO中顶点类的定义的代码片段:
defi
eMAX_BONE_PER_VERTEX4
fclassVertexfloatm_xm_ym_zlocalposi
meshspacefloatm_wXm_wYm_wZble
dedvertexposi
worldspace
ski
i
foi
tm_bo
eNumBo
em_bo
esMAX_BONE_PER_VERTEXfloatm_bo
eWeightsMAX_BONE_PER_VERTEX
顶点的Ski
i
fo包含影响该顶点的骨骼数目,指向这些骨骼的指r
好听全球资料 返回顶部