Пример #1
0
    // Update is called once per frame
    private void Update()
    {
        Matrix4x4[] matArr0 = new Matrix4x4[furBoneList0.Count];
        Matrix4x4[] matArr1 = new Matrix4x4[furBoneList1.Count];

        for (int i = 0; i < furBoneList0.Count; i++)
        {
            FurBone    furBone = furBoneList0[i];
            Matrix4x4  animatedFurBoneMat;
            Vector3    finalFramePos = new Vector3();
            Quaternion finalFrameRot = new Quaternion();

            for (int k = 0; k < furBone.baseBoneID.Count; k++)
            {
                Transform baseBone   = furBone.baseBone[k];
                float     weight     = furBone.boneWeight[k];
                int       baseBoneID = furBone.baseBoneID[k];

                animatedFurBoneMat = baseBone.localToWorldMatrix * baseBnInitInvXF[baseBoneID] * furBone.initXF;

                finalFramePos += (Vector3)animatedFurBoneMat.GetColumn(3) * weight;

                finalFrameRot = Quaternion.Slerp(finalFrameRot, animatedFurBoneMat.rotation, weight);
            }

            furBone.bone.position = finalFramePos;
            furBone.bone.rotation = finalFrameRot;

            matArr0[i] = furBoneList0[i].bone.localToWorldMatrix * furBoneList0[i].initInvXF;
            matArr1[i] = furBoneList1[i].bone.localToWorldMatrix * furBoneList1[i].initInvXF;
        }

        foreach (Material mat in furMaterials)
        {
            mat.SetMatrixArray("BoneMatrics0", matArr0);
            mat.SetMatrixArray("BoneMatrics1", matArr1);
        }
    }
Пример #2
0
    // Start is called before the first frame update
    void Start()
    {
        List <Transform> furBoneTransform0 = new List <Transform>();

        for (int i = 0; i < furRigRoot.childCount; i++)
        {
            furBoneTransform0.Add(furRigRoot.GetChild(i).GetComponent <Transform>());
        }

        for (int i = 0; i < furBoneTransform0.Count; i++)
        {
            FurBone newBone = new FurBone();
            newBone.bone      = furBoneTransform0[i];
            newBone.initXF    = newBone.bone.localToWorldMatrix;
            newBone.initInvXF = newBone.bone.worldToLocalMatrix;
            furBoneList0.Add(newBone);

            Transform childXf  = furBoneTransform0[i].GetChild(0);
            FurBone   newBone2 = new FurBone();
            newBone2.bone      = childXf;
            newBone2.initInvXF = newBone2.bone.worldToLocalMatrix;
            furBoneList1.Add(newBone2);
        }

        furBuider = GetComponentInChildren <FurMeshBuilder>();
        furMaterials.Clear();
        foreach (MeshRenderer rend in furBuider.GetComponentsInChildren <MeshRenderer>())
        {
            furMaterials.Add(rend.sharedMaterial);
        }


        GetAllChildren(baseRigRoot, ref baseBoneList);

        ReadFurRigConstraint(constraintPath);
    }