动画重定向
24 November 2020
做u3d项目,有2套完全不同的骨骼动画,一个是人形,一个是普通动画。花了2天时间研究如何,让一个动画模拟另一个动画。
要把2个tpose骨骼调成相同的方向
首先把2个动画对应的骨骼找到。然后手动控制一个的旋转模拟另一个即可。
a1,b1是原始T动画,a2,b2是当前动画。
因为a2到a1的矩阵和b2到b1的矩阵相等 得到
b2-b1=a2-a1
b2-b1+b1=a2-a1+b1
b2=a2-a1+b1
u3d代码
public BoneController ab;
public BoneController bb;
public Matrix4x4[] ams;
public Matrix4x4[] bms;
void Start()
{
ab.InitializeSkeletonJoints();
bb.InitializeSkeletonJoints();
ams = new Matrix4x4[BoneController.k_NumSkeletonJoints];
bms = new Matrix4x4[BoneController.k_NumSkeletonJoints];
for (var i=0;i<ab.m_BoneMapping.Length;i++)
{
var a = ab.m_BoneMapping[i];
var b = bb.m_BoneMapping[i];
if (a!=null&&b!=null)
{
ams[i] = ab.transform.worldToLocalMatrix*a.localToWorldMatrix;
bms[i] = bb.transform.worldToLocalMatrix*b.localToWorldMatrix;
}
}
}
void Update()
{
for (var i = 0; i < ab.m_BoneMapping.Length; i++)
{
var a = ab.m_BoneMapping[i];
var b = bb.m_BoneMapping[i];
if (a != null && b != null)
{
var am = ams[i];
var bm = bms[i];
var matr=bb.transform.localToWorldMatrix*ab.transform.worldToLocalMatrix*a.localToWorldMatrix * am.inverse*bm;
b.rotation = matr.rotation;
}
}
}