コード例 #1
0
 // Start is called before the first frame update
 void Start()
 {
     dataPose0 = new animationTransformData();
     dataPose1 = new animationTransformData();
     dataPose0.setTransform(pose0);
     dataPose1.setTransform(pose1);
 }
コード例 #2
0
    public static animationTransformData average(identity nIdentity, animationTransformData pose_0, animationTransformData pose_1, float parameter0, float parameter1, bool usingQuaternion)
    {
        animationTransformData newPose_0 = scale(new identity(), pose_0, parameter0, usingQuaternion);
        animationTransformData newPose_1 = scale(new identity(), pose_1, parameter1, usingQuaternion);

        return(add(newPose_0, newPose_1, usingQuaternion));
    }
コード例 #3
0
 public void setData(AnimationClip clip, int keyIndex)
 {
     size     = clip.animData.poseBase.Length;
     poseData = new animationTransformData[size];
     for (int i = 0; i < size; i++)
     {
         KeyFrame key = clip.getcurrentFrame(keyIndex, i);
         animationTransformData newdata = new animationTransformData(key.keyPosition, Quaternion.Euler(key.keyRotation), key.scale);
         poseData[i] = newdata;
     }
 }
コード例 #4
0
 public void setData(AnimationDataHierarchal animdata, int keyIndex)
 {
     size     = animdata.poseBase.Length;
     poseData = new animationTransformData[size];
     for (int i = 0; i < size; i++)
     {
         KeyFrame key = animdata.poseBase[i].keyFrames[keyIndex];
         animationTransformData newdata = new animationTransformData(key.keyPosition, Quaternion.Euler(key.keyRotation), key.scale);
         poseData[i] = newdata;
     }
 }
コード例 #5
0
    private void Update()
    {
        for (int i = 0; i < animData.poseBase.Length; i++)
        {
            animationTransformData poseresult = new animationTransformData();
            animationTransformData dataPose0  = new animationTransformData();
            animationTransformData dataPose1  = new animationTransformData();
            KeyFrame key0 = animData.poseBase[i].keyFrames[keyframe0];
            KeyFrame key1 = animData.poseBase[i].keyFrames[keyframe1];
            dataPose0.setTransformIndividual(key0.keyPosition, Quaternion.Euler(key0.keyRotation), new Vector3(1, 1, 1));
            dataPose1.setTransformIndividual(key1.keyPosition, Quaternion.Euler(key1.keyRotation), new Vector3(1, 1, 1));
            switch (blendMode)
            {
            case testBlendMode.LERP:
                poseresult = blendStatic.lerp(dataPose0, dataPose1, parameter0, usingQuaternion);
                break;

            case testBlendMode.ADD:
                poseresult = blendStatic.add(dataPose0, dataPose1, usingQuaternion);
                break;

            case testBlendMode.SCALE:
                poseresult = blendStatic.scale(new identity(), dataPose0, parameter0, usingQuaternion);
                break;

            case testBlendMode.AVERAGE:
                poseresult = blendStatic.average(new identity(), dataPose0, dataPose1, parameter0, parameter1, usingQuaternion);
                break;
            }

            int     parentIndex   = animData.poseBase[i].parentNodeIndex;
            Vector3 localPosition = animData.poseBase[i].getLocalPosition();
            Vector3 localRotation = animData.poseBase[i].getLocalRotationEuler();

            //find delta change from localpose
            Matrix4x4 deltaMatrix = Matrix4x4.TRS(localPosition + poseresult.localPosition, Quaternion.Euler(localRotation + poseresult.localRotation.eulerAngles), new Vector4(1, 1, 1, 1));

            if (parentIndex == -1)
            {
                //is root
                animData.poseBase[i].currentTransform = deltaMatrix;
            }
            else
            {
                //current transform = take the parent index current transform and multiply with delta matrix
                animData.poseBase[i].currentTransform = animData.poseBase[parentIndex].currentTransform * deltaMatrix;
            }

            animData.poseBase[i].updateNewPosition(gameObjectData.getObject(i));
        }
    }
コード例 #6
0
    //binds the objects in the object hierarchy to a pose, either current or base
    void setPose(bool boundToCurrent)
    {
        for (int jointID = 0; jointID < animData.poseBase.Length; jointID++)
        {
            animationTransformData tData = new animationTransformData(0);
            if (boundToCurrent)
            {
                KeyFrame currentKey = animData.poseBase[jointID].keyFrames[currentKeyFrame];
                tData.setTransformIndividual(currentKey.keyPosition, currentKey.keyQRotation, currentKey.scale);
            }

            ForwardKinematics.setData(gameObjectHierarchy, animData, tData, jointID);
        }
    }
コード例 #7
0
    public static animationTransformData scale(identity nIdentity, animationTransformData pose_1, float parameter, bool usingQuaternion)
    {
        animationTransformData poseresult = new animationTransformData();

        //translation: literal linear interpolation
        poseresult.localPosition = Vector3.Lerp(nIdentity.position, pose_1.localPosition, parameter);

        //scale: ditto
        poseresult.localScale = Vector3.Lerp(nIdentity.scale, pose_1.localScale, parameter);
        //rotation: slerp if quaternion (or NLERP) otherwise euler lerp
        if (usingQuaternion)
        {
            poseresult.localRotation = Quaternion.Slerp(nIdentity.rotation, pose_1.localRotation, parameter);
        }
        else
        {
            poseresult.localEulerAnglesSet(Vector3.Lerp(nIdentity.rotation.eulerAngles, pose_1.localEulerAngles(), parameter));
        }
        return(poseresult);
    }
コード例 #8
0
    private void Update()
    {
        switch (blendMode)
        {
        case testBlendMode.LERP:
            poseresult = blendStatic.lerp(dataPose0, dataPose1, parameter0, usingQuaternion);
            break;

        case testBlendMode.ADD:
            poseresult = blendStatic.add(dataPose0, dataPose1, usingQuaternion);
            break;

        case testBlendMode.SCALE:
            poseresult = blendStatic.scale(new identity(), dataPose0, parameter0, usingQuaternion);
            break;

        case testBlendMode.AVERAGE:
            poseresult = blendStatic.average(new identity(), dataPose0, dataPose1, parameter0, parameter1, usingQuaternion);
            break;
        }
        poseresult.changeTransform(this.transform);
    }
コード例 #9
0
    public static animationTransformData add(animationTransformData pose0, animationTransformData pose1, bool usingQuaternion)
    {
        animationTransformData poseresult = new animationTransformData();

        //translation literal addition
        poseresult.localPosition = pose0.localPosition + pose1.localPosition;

        //scale component-wise multiplication
        poseresult.localScale = pose0.localScale;
        poseresult.localScale.Scale(pose1.localScale);

        //rotation: quaternioni concatenation or Euler addition
        if (usingQuaternion)
        {
            poseresult.localRotation = pose0.localRotation * pose1.localRotation;
        }
        else
        {
            poseresult.localEulerAnglesSet(pose0.localEulerAngles() + pose1.localEulerAngles());
        }

        return(poseresult);
    }
    void blendAnimation()
    {
        bool usingQuaternion = true;

        for (int i = 0; i < currentAnim.poseBase.Length; i++)
        {
            animationTransformData poseresult = new animationTransformData();
            animationTransformData dataPose0  = new animationTransformData();
            animationTransformData dataPose1  = new animationTransformData();
            KeyFrame key0 = prevAnim.poseBase[i].keyFrames[currentFrame];
            KeyFrame key1 = currentAnim.poseBase[i].keyFrames[currentFrame];
            dataPose0.setTransformIndividual(key0.keyPosition, Quaternion.Euler(key0.keyRotation), new Vector3(1, 1, 1));
            dataPose1.setTransformIndividual(key1.keyPosition, Quaternion.Euler(key1.keyRotation), new Vector3(1, 1, 1));

            poseresult = blendStatic.lerp(dataPose0, dataPose1, transitionParameter, usingQuaternion);

            int     parentIndex   = currentAnim.poseBase[i].parentNodeIndex;
            Vector3 localPosition = currentAnim.poseBase[i].getLocalPosition();
            Vector3 localRotation = currentAnim.poseBase[i].getLocalRotationEuler();

            //find delta change from localpose
            Matrix4x4 deltaMatrix = Matrix4x4.TRS(localPosition + poseresult.localPosition, Quaternion.Euler(localRotation + poseresult.localRotation.eulerAngles), new Vector4(1, 1, 1, 1));

            if (parentIndex == -1)
            {
                //is root
                currentAnim.poseBase[i].currentTransform = deltaMatrix;
            }
            else
            {
                //current transform = take the parent index current transform and multiply with delta matrix
                currentAnim.poseBase[i].currentTransform = currentAnim.poseBase[parentIndex].currentTransform * deltaMatrix;
            }

            currentAnim.poseBase[i].updateNewPosition(objectHierarchy.getObject(i));
        }
    }
コード例 #11
0
 public void setPoseData(animationTransformData data, int index)
 {
     poseData[index] = data;
 }
コード例 #12
0
    //used for blending, given a joint with a transform data and the hierarchies do forward kinematics
    public static void setData(gameObjectMain objHierarchy, AnimationDataHierarchal animData, animationTransformData transformData, int jointID)
    {
        int     parentIndex   = animData.poseBase[jointID].parentNodeIndex;
        Vector3 localPosition = animData.poseBase[jointID].getLocalPosition();
        Vector3 localRotation = animData.poseBase[jointID].getLocalRotationEuler();

        //find delta change from localpose
        Matrix4x4 deltaMatrix = Matrix4x4.TRS(localPosition + transformData.localPosition, Quaternion.Euler(localRotation + transformData.localRotation.eulerAngles), new Vector4(1, 1, 1, 1));

        if (parentIndex == -1)
        {
            //is root
            animData.poseBase[jointID].currentTransform = deltaMatrix;
        }
        else
        {
            //current transform = take the parent index current transform and multiply with delta matrix
            animData.poseBase[jointID].currentTransform = animData.poseBase[parentIndex].currentTransform * deltaMatrix;
        }

        animData.poseBase[jointID].updateNewPosition(objHierarchy.ObjectHierarchy[jointID]);
    }
コード例 #13
0
    public virtual blendPoseData blendOperation(BlendingTree parentTree, int currentFrameID)
    {
        blendPoseData firstPose  = new blendPoseData();
        blendPoseData secondPose = new blendPoseData();
        int           length     = 0;

        switch (nodeType)
        {
        case blendType.BLEND_LERP:
            firstPose  = parentTree.getIndexedNode(nextID1).blendOperation(parentTree, currentFrameID);
            secondPose = parentTree.getIndexedNode(nextID2).blendOperation(parentTree, currentFrameID);

            length = firstPose.size;

            for (int i = 0; i < length; i++)
            {
                animationTransformData transformData;

                transformData = blendStatic.lerp(firstPose.getPoseData(i), secondPose.getPoseData(i), parameter1, true);
                firstPose.setPoseData(transformData, i);
            }
            return(firstPose);

        case blendType.BLEND_ADD:
            firstPose  = parentTree.getIndexedNode(nextID1).blendOperation(parentTree, currentFrameID);
            secondPose = parentTree.getIndexedNode(nextID2).blendOperation(parentTree, currentFrameID);

            length = firstPose.size;

            for (int i = 0; i < length; i++)
            {
                animationTransformData transformData;

                transformData = blendStatic.add(firstPose.getPoseData(i), secondPose.getPoseData(i), true);
                firstPose.setPoseData(transformData, i);
            }
            return(firstPose);

        case blendType.BLEND_SCALE:
            firstPose = parentTree.getIndexedNode(nextID1).blendOperation(parentTree, currentFrameID);

            length = firstPose.size;

            for (int i = 0; i < length; i++)
            {
                animationTransformData transformData = firstPose.getPoseData(i);
                identity newIdentity = new identity();
                transformData = blendStatic.scale(newIdentity, transformData, parameter1, true);
                firstPose.setPoseData(transformData, i);
            }
            return(firstPose);

        case blendType.BLEND_AVG:
            firstPose  = parentTree.getIndexedNode(nextID1).blendOperation(parentTree, currentFrameID);
            secondPose = parentTree.getIndexedNode(nextID2).blendOperation(parentTree, currentFrameID);
            length     = firstPose.size;

            for (int i = 0; i < length; i++)
            {
                animationTransformData transformData;
                identity nIdentity = new identity();

                transformData = blendStatic.average(nIdentity, firstPose.getPoseData(i), secondPose.getPoseData(i), parameter1, parameter2, true);
                firstPose.setPoseData(transformData, i);
            }
            return(firstPose);

        case blendType.BLEND_END:
            blendPoseData newPoseData = new blendPoseData();
            newPoseData.setData(clip, currentFrameID);
            return(newPoseData);

        default:
            return(firstPose);
        }
    }