コード例 #1
0
    private void CaptureBoneSnapShot(AnimationClip animClip, MotionFrameData motionFrameData, MotionFrameData lastMotionFrameData, GameObject sampleGO, float bakeFrames, float CurrentFrame)
    {
        float frameSkipsTimeStep = frameSkips[animClip.name] / (float)fps;
        float bakeDelta          = CurrentFrame / bakeFrames;
        float animationTime      = bakeDelta * animClip.length;

        if (requiresAnimator)
        {
            float normalizedTime = animationTime / animClip.length;
            animator.Play(animClip.name, 0, normalizedTime);
            animator.Update(frameSkipsTimeStep);
        }
        else
        {
            GameObject sampleObject    = sampleGO;
            Animation  legacyAnimation = sampleObject.GetComponentInChildren <Animation>();
            if (animator && animator.gameObject != sampleObject)
            {
                sampleObject = animator.gameObject;
            }
            else if (legacyAnimation && legacyAnimation.gameObject != sampleObject)
            {
                sampleObject = legacyAnimation.gameObject;
            }
            animClip.SampleAnimation(sampleObject, animationTime);
        }


        int index = 0;

        foreach (string boneName in bonesMap.Keys)
        {
            int            boneIndex      = bonesMap[boneName];
            Transform      child          = joints[boneIndex];
            MotionBoneData motionBoneData = motionFrameData.motionBoneDataList[index];
            motionBoneData.position      = child.position;
            motionBoneData.localPosition = child.localPosition;
            motionBoneData.rotation      = child.rotation;
            motionBoneData.localRotation = child.localRotation;
            motionBoneData.velocity      = Vector3.zero;
            motionBoneData.boneName      = child.name;
            motionBoneData.boneIndex     = boneIndex;

            //calc velocity
            if (lastMotionFrameData != null)
            {
                MotionBoneData lastMotionBoneData = lastMotionFrameData.motionBoneDataList[index];
                lastMotionBoneData.velocity = (motionBoneData.localPosition - lastMotionBoneData.localPosition) / frameSkipsTimeStep;
            }
            index++;
        }
    }
コード例 #2
0
    protected virtual void OnSceneGUI()
    {
        float         size          = 0.1f;
        MotionMatcher motionMatcher = (MotionMatcher)target;

        currentMotionsData = motionMatcher.motionsData;
        if (currentMotionsData)
        {
            Transform   child  = motionMatcher.transform.Find(MotionMatchingBakeEditor.RootBoneName);
            Transform[] joints = child.GetComponentsInChildren <Transform>();

            for (int i = 0; i < currentMotionsData.motionDataList.Length; i++)
            {
                MotionData motionData = currentMotionsData.motionDataList[i];
                if (motionData.motionName == motionMatcher.bestMotionName ||
                    (string.IsNullOrEmpty(motionMatcher.bestMotionName) && motionData.motionName == defaultMotionName))
                {
                    for (int j = 0; j < motionData.motionFrameDataList.Length; j++)
                    {
                        MotionFrameData motionFrameData = motionData.motionFrameDataList[j];

                        for (int k = 0; k < motionFrameData.motionBoneDataList.Length; k++)
                        {
                            MotionBoneData motionBoneData = motionFrameData.motionBoneDataList[k];
                            Transform      bone           = joints[motionBoneData.boneIndex];
                            if (bone)
                            {
                                Vector3 bonePosition = motionBoneData.position;
                                Handles.color = Color.green;
                                Handles.SphereHandleCap(0, bonePosition, Quaternion.identity, size, EventType.Repaint);
                            }
                        }

                        for (int l = 0; l < motionFrameData.motionTrajectoryDataList.Length; l++)
                        {
                            MotionTrajectoryData motionTrajectoryData = motionFrameData.motionTrajectoryDataList[l];
                            Handles.color = Color.yellow;
                            Handles.SphereHandleCap(0, motionTrajectoryData.position, Quaternion.identity, size, EventType.Repaint);
                        }
                    }
                }
            }
        }
    }
コード例 #3
0
    private void ComputeMotionsBestCost()
    {
        float bestMotionCost = float.MaxValue;

        bestMotionName       = "";
        bestMotionFrameIndex = 0;
        for (int i = 0; i < motionsData.motionDataList.Length; i++)
        {
            MotionData motionData = motionsData.motionDataList[i];
            if (motionMatcherSettings.EnableDebugText)
            {
                AddDebugContent("motion: " + motionData.motionName);
            }

            for (int j = 0; j < motionData.motionFrameDataList.Length; j++)
            {
                MotionDebugData motionDebugData = new MotionDebugData();
                float           motionCost      = 0f;
                float           bonesCost       = 0f;
                float           bonePosCost     = 0f;
                float           boneRotCost     = 0f;

                float trajectoryPosCost = 0f;
                float trajectoryVelCost = 0f;
                float trajectoryDirCost = 0f;
                float trajectorysCost   = 0f;

                float rootMotionCost = 0f;

                MotionFrameData motionFrameData = motionData.motionFrameDataList[j];

                for (int k = 0; k < motionFrameData.motionBoneDataList.Length; k++)
                {
                    MotionBoneData motionBoneData        = motionFrameData.motionBoneDataList[k];
                    MotionBoneData currentMotionBoneData = currentMotionFrameData.motionBoneDataList[k];
                    float          BonePosCost           = Vector3.SqrMagnitude(motionBoneData.localPosition - currentMotionBoneData.localPosition);
                    Quaternion     BonePosError          = Quaternion.Inverse(motionBoneData.localRotation) * currentMotionBoneData.localRotation;
                    float          BoneRotCost           = Mathf.Abs(BonePosError.x) + Mathf.Abs(BonePosError.y) + Mathf.Abs(BonePosError.z) + (1 - Mathf.Abs(BonePosError.w));
                    //float BoneVelocityCost = Vector3.SqrMagnitude(motionBoneData.velocity - currentMotionBoneData.velocity);
                    bonePosCost += BonePosCost * motionCostFactorSettings.bonePosFactor;
                    boneRotCost += BoneRotCost * motionCostFactorSettings.boneRotFactor /* + BoneVelocityCost * motionCostFactorSettings.boneVelFactor*/;
                    //AddDebugContent("BonePosCost: " + BonePosCost);
                    //AddDebugContent("BoneRotCost: " + BoneRotCost);
                    //AddDebugContent("BoneVelocityCost: " + BoneVelocityCost);
                }

                bonesCost = bonePosCost + boneRotCost;
                motionDebugData.bonePosCost = bonePosCost;
                motionDebugData.boneRotCost = boneRotCost;
                motionDebugData.bonesCost   = bonesCost;

                if (motionMatcherSettings.EnableDebugText)
                {
                    AddDebugContent("bonesTotalCost: " + bonesCost);
                }

                for (int l = 0; l < motionFrameData.motionTrajectoryDataList.Length; l++)
                {
                    MotionTrajectoryData motionTrajectoryData        = motionFrameData.motionTrajectoryDataList[l];
                    MotionTrajectoryData currentMotionTrajectoryData = currentMotionFrameData.motionTrajectoryDataList[l];

                    trajectoryPosCost += Vector3.SqrMagnitude(motionTrajectoryData.localPosition - currentMotionTrajectoryData.localPosition) * motionCostFactorSettings.predictionTrajectoryPosFactor;
                    //trajectoryVelCost += Vector3.SqrMagnitude(motionTrajectoryData.velocity - currentMotionTrajectoryData.velocity) * motionCostFactorSettings.predictionTrajectoryVelFactor;
                    trajectoryDirCost += Vector3.Dot(motionTrajectoryData.direction, currentMotionTrajectoryData.direction) * motionCostFactorSettings.predictionTrajectoryDirFactor;
                    //AddDebugContent("trajectoryPosCost: " + trajectoryPosCost);
                    //AddDebugContent("trajectoryVelCost: " + trajectoryVelCost);
                    //AddDebugContent("trajectoryDirCost: " + trajectoryDirCost);
                }

                trajectorysCost = trajectoryPosCost + trajectoryVelCost + trajectoryDirCost;
                motionDebugData.trajectoryPosCost = trajectoryPosCost;
                motionDebugData.trajectoryVelCost = trajectoryVelCost;
                motionDebugData.trajectoryDirCost = trajectoryDirCost;
                motionDebugData.trajectorysCost   = trajectorysCost;

                if (motionMatcherSettings.EnableDebugText)
                {
                    AddDebugContent("trajectorysToatalCost: " + trajectorysCost);
                }

                rootMotionCost = Mathf.Abs(motionFrameData.velocity - currentMotionFrameData.velocity) * motionCostFactorSettings.rootMotionVelFactor;
                motionDebugData.rootMotionCost = rootMotionCost;
                if (motionMatcherSettings.EnableDebugText)
                {
                    AddDebugContent("rootMotionCost: " + rootMotionCost);
                }

                motionCost = bonesCost + trajectorysCost + rootMotionCost;
                motionDebugData.motionCost = motionCost;

                if (motionMatcherSettings.EnableDebugText)
                {
                    AddDebugContent("motionTotalCost: " + motionCost);
                }

                //Debug.LogFormat("ComputeMotionsBestCost motionName {0} motionCost {1} ", motionData.motionName, motionCost);

                if (bestMotionCost > motionCost)
                {
                    bestMotionCost       = motionCost;
                    bestMotionFrameIndex = j;
                    bestMotionName       = motionData.motionName;
                    bestMotionDebugData  = motionDebugData;

                    motionDebugData.motionName       = motionData.motionName;
                    motionDebugData.motionFrameIndex = j;

                    motionDebugDataList.Add(motionDebugData);
                }
            }
        }
    }
コード例 #4
0
    private void onDropdownChanged(int arg0)
    {
        costTextContainer.SetActive(true);
        hideCostTextContainerBtn.gameObject.SetActive(true);

        MotionData[] motionDataList = playerMotionMatcher.motionsData.motionDataList;
        MotionData   motionData     = motionDataList[arg0];

        targetMotionFrameData  = motionData.motionFrameDataList[0];
        currentMotionFrameData = playerMotionMatcher.currentMotionFrameData;

        MotionDebugData motionDebugData = new MotionDebugData();

        AddDebugContent("----------------------" + motionData.motionName);

        float motionCost  = 0f;
        float bonesCost   = 0f;
        float bonePosCost = 0f;
        float boneRotCost = 0f;

        float trajectoryPosCost = 0f;
        float trajectoryVelCost = 0f;
        float trajectoryDirCost = 0f;
        float trajectorysCost   = 0f;

        float rootMotionCost = 0f;

        for (int k = 0; k < targetMotionFrameData.motionBoneDataList.Length; k++)
        {
            MotionBoneData motionBoneData        = targetMotionFrameData.motionBoneDataList[k];
            MotionBoneData currentMotionBoneData = currentMotionFrameData.motionBoneDataList[k];
            float          BonePosCost           = Vector3.SqrMagnitude(motionBoneData.localPosition - currentMotionBoneData.localPosition);
            Quaternion     BonePosError          = Quaternion.Inverse(motionBoneData.localRotation) * currentMotionBoneData.localRotation;
            float          BoneRotCost           = Mathf.Abs(BonePosError.x) + Mathf.Abs(BonePosError.y) + Mathf.Abs(BonePosError.z) + (1 - Mathf.Abs(BonePosError.w));
            //float BoneVelocityCost = Vector3.SqrMagnitude(motionBoneData.velocity - currentMotionBoneData.velocity);
            bonePosCost += BonePosCost * playerMotionMatcher.motionCostFactorSettings.bonePosFactor;
            boneRotCost += BoneRotCost * playerMotionMatcher.motionCostFactorSettings.boneRotFactor /* + BoneVelocityCost * motionCostFactorSettings.boneVelFactor*/;
            //AddDebugContent("BonePosCost: " + BonePosCost);
            //AddDebugContent("BoneRotCost: " + BoneRotCost);
            //AddDebugContent("BoneVelocityCost: " + BoneVelocityCost);
        }

        bonesCost = bonePosCost + boneRotCost;
        motionDebugData.bonePosCost = bonePosCost;
        motionDebugData.boneRotCost = boneRotCost;
        motionDebugData.bonesCost   = bonesCost;

        AddDebugContent("bonesTotalCost: " + bonesCost);

        for (int l = 0; l < targetMotionFrameData.motionTrajectoryDataList.Length; l++)
        {
            MotionTrajectoryData motionTrajectoryData        = targetMotionFrameData.motionTrajectoryDataList[l];
            MotionTrajectoryData currentMotionTrajectoryData = currentMotionFrameData.motionTrajectoryDataList[l];

            trajectoryPosCost += Vector3.SqrMagnitude(motionTrajectoryData.localPosition - currentMotionTrajectoryData.localPosition) * playerMotionMatcher.motionCostFactorSettings.predictionTrajectoryPosFactor;
            //trajectoryVelCost += Vector3.SqrMagnitude(motionTrajectoryData.velocity - currentMotionTrajectoryData.velocity) * motionCostFactorSettings.predictionTrajectoryVelFactor;
            trajectoryDirCost += Vector3.Dot(motionTrajectoryData.direction, currentMotionTrajectoryData.direction) * playerMotionMatcher.motionCostFactorSettings.predictionTrajectoryDirFactor;
            //AddDebugContent("trajectoryPosCost: " + trajectoryPosCost);
            //AddDebugContent("trajectoryVelCost: " + trajectoryVelCost);
            //AddDebugContent("trajectoryDirCost: " + trajectoryDirCost);
        }

        trajectorysCost = trajectoryPosCost + trajectoryVelCost + trajectoryDirCost;
        motionDebugData.trajectoryPosCost = trajectoryPosCost;
        motionDebugData.trajectoryVelCost = trajectoryVelCost;
        motionDebugData.trajectoryDirCost = trajectoryDirCost;
        motionDebugData.trajectorysCost   = trajectorysCost;

        AddDebugContent("trajectoryPosCost: " + trajectoryPosCost);
        AddDebugContent("trajectoryVelCost: " + trajectoryVelCost);
        AddDebugContent("trajectoryDirCost: " + trajectoryDirCost);
        AddDebugContent("trajectorysToatalCost: " + trajectorysCost);

        rootMotionCost = Mathf.Abs(targetMotionFrameData.velocity - currentMotionFrameData.velocity) * playerMotionMatcher.motionCostFactorSettings.rootMotionVelFactor;
        motionDebugData.rootMotionCost = rootMotionCost;
        AddDebugContent("rootMotionCost: " + rootMotionCost);

        motionCost = bonesCost + trajectorysCost + rootMotionCost;
        motionDebugData.motionCost = motionCost;

        AddDebugContent("motionTotalCost: " + motionCost);
    }