欢迎光临散文网 会员登陆 & 注册

Unity中的蒙皮动画原理和代码测试

2023-01-17 11:26 作者:DeadCyber  | 我要投稿

就以vertex[0]为测试。


将播动画的prefab的transform reset,保证W(世界空间)和M(模型空间)一致,省去一些麻烦。



首先通过

得知vertex0的受2个骨骼影响,bone[3]影响权重为0.75,bone[6]为0.25。



其次了解bindpose(通常是T-pose),类型为Matrix4x4,就是模型系下每个骨骼的transform。


作用为从M(模型空间)转到B(骨骼空间)。



将vertex[0]分别转到3,6骨骼空间下:

此时v1,v2都在B空间了。注意不论此时骨骼怎么动,B空间里的v是不会动的。(这就是T-pos的意义,让模型的默认vertex有一个在B空间的相对位置)



上篇知道skin.bones是实时更新的,所以此时skin.bones[i]的local就是B空间(因为


transform为0时,点就在骨骼位置上),World又和M空间一致(因为我们把prefab的


transform reset为0了)。


所以skin.bones[i]的localToWorldMatrix就是从B(骨骼空间)转到M(模型空间),它是实时


更新的。 由于v1,v2现在就在B空间,再乘一下骨骼skin.bones[i]的实时矩阵


localToWorldMatrix,就能得到v1,v2的实时M空间位置:

最后再根据boneWeight混合一下,就能得到最终vertex[0]的骨骼动画实时M空间位置:



最后对比一下直接从BakedMesh拿到的vertexFinal数据,如果两者一样,说明我们的理解没

有错。完整代码:

看来没有错。蒙皮动画这一套方案,和许多实时图形学一样,由于是基于大量数据的编写结构,导致其直接理解起来不是很直观(如果先入为主 机器人动力学 的那套FK理论)。但拆开单个看,可以发现那些基本的setUp都隐藏在各种名词结构(bindpose,bones,boneIndices,boneWeights)下了。

Unity中的蒙皮动画原理和代码测试的评论 (共 条)

分享到微博请遵守国家法律