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;
            }
        }
    }