Esempio n. 1
0
    public void CreateClip()
    {
        Read();

        nameMap = new Dictionary <string, Transform>();

        for (int i = 0; i < remap.Length; i++)
        {
            if (remap[i].targetTransform != null)
            {
                nameMap.Add(remap[i].bvhName, remap[i].targetTransform);
            }
        }

        myClip        = new AnimationClip();
        myClip.name   = "MyAnimation";
        myClip.legacy = true;

        for (int i = 0; i < bi.boneList.Count; i++)
        {
            BVHImporter.Bone bone    = bi.boneList[i];
            string           bvhName = bone.name;
            if (!nameMap.ContainsKey(bvhName))
            {
                continue;
            }
            else
            {
                Transform targetTransform = nameMap[bvhName];
                path = GetRelativePath(rootTransform, targetTransform);
                SetCurve(bone, targetTransform);
            }
        }

        myClip.EnsureQuaternionContinuity();
    }
Esempio n. 2
0
    private void SetCurve(BVHImporter.Bone bone, Transform targetTransform)
    {
        bool posX = false;
        bool posY = false;
        bool posZ = false;
        bool rotX = false;
        bool rotY = false;
        bool rotZ = false;

        string[] props = new string[7];
        keyframes = new Keyframe[7][];
        float[][] values = new float[6][];

        for (int channel = 0; channel < 6; channel++)
        {
            if (!bone.channels[channel].enabled)
            {
                continue;
            }

            switch (channel)
            {
            case 0:
                posX           = true;
                props[channel] = "localPosition.x";
                break;

            case 1:
                posY           = true;
                props[channel] = "localPosition.y";
                break;

            case 2:
                posZ           = true;
                props[channel] = "localPosition.z";
                break;

            case 3:
                rotX           = true;
                props[channel] = "localRotation.x";
                break;

            case 4:
                rotY           = true;
                props[channel] = "localRotation.y";
                break;

            case 5:
                rotZ           = true;
                props[channel] = "localRotation.z";
                break;

            default:
                channel = -1;
                break;
            }

            if (channel == -1)
            {
                continue;
            }

            keyframes[channel] = new Keyframe[frames];
            values[channel]    = bone.channels[channel].value;
            if (rotX && rotY && rotZ && keyframes[6] == null)
            {
                keyframes[6] = new Keyframe[frames];
                props[6]     = "localRotation.w";
            }
        }

        float time = 0.0f;

        if (posX && posY && posZ)
        {
            Vector3 offset;
            offset = new Vector3(-bone.offsets.x, bone.offsets.y, bone.offsets.z);

            for (int i = 0; i < frames; i++)
            {
                time += 1.0f / frameRate;
                keyframes[0][i].time = time;
                keyframes[1][i].time = time;
                keyframes[2][i].time = time;

                keyframes[0][i].value = -values[0][i];
                keyframes[1][i].value = values[1][i];
                keyframes[2][i].value = values[2][i];

                Vector3 bvhPosition = rootTransform.transform.InverseTransformPoint(new Vector3(keyframes[0][i].value, keyframes[1][i].value, keyframes[2][i].value) + this.transform.position + offset);
                bvhPosition           = Resize(bvhPosition);
                keyframes[0][i].value = bvhPosition.x * this.transform.localScale.x;
                keyframes[1][i].value = bvhPosition.y * this.transform.localScale.y;
                keyframes[2][i].value = bvhPosition.z * this.transform.localScale.z;
            }

            myClip.SetCurve(path, typeof(Transform), props[0], new AnimationCurve(keyframes[0]));
            myClip.SetCurve(path, typeof(Transform), props[1], new AnimationCurve(keyframes[1]));
            myClip.SetCurve(path, typeof(Transform), props[2], new AnimationCurve(keyframes[2]));
        }

        time = 0.0f;
        if (rotX && rotY && rotZ)
        {
            Quaternion oldRotation = targetTransform.transform.rotation;
            for (int i = 0; i < frames; i++)
            {
                Vector3    bvhEuler = new Vector3(WrapAngle(values[3][i]), WrapAngle(values[4][i]), WrapAngle(values[5][i]));
                Quaternion rotation = Quaternion.Euler(bvhEuler);

                time += 1.0f / frameRate;
                keyframes[3][i].time = time;
                keyframes[4][i].time = time;
                keyframes[5][i].time = time;
                keyframes[6][i].time = time;

                keyframes[3][i].value = rotation.x;
                keyframes[4][i].value = -rotation.y;
                keyframes[5][i].value = -rotation.z;
                keyframes[6][i].value = rotation.w;

                targetTransform.transform.rotation = new Quaternion(keyframes[3][i].value, keyframes[4][i].value, keyframes[5][i].value, keyframes[6][i].value);
                keyframes[3][i].value = targetTransform.transform.localRotation.x;
                keyframes[4][i].value = targetTransform.transform.localRotation.y;
                keyframes[5][i].value = targetTransform.transform.localRotation.z;
                keyframes[6][i].value = targetTransform.transform.localRotation.w;
            }

            targetTransform.transform.rotation = oldRotation;
            myClip.SetCurve(path, typeof(Transform), props[3], new AnimationCurve(keyframes[3]));
            myClip.SetCurve(path, typeof(Transform), props[4], new AnimationCurve(keyframes[4]));
            myClip.SetCurve(path, typeof(Transform), props[5], new AnimationCurve(keyframes[5]));
            myClip.SetCurve(path, typeof(Transform), props[6], new AnimationCurve(keyframes[6]));
        }
    }