示例#1
0
        public float GetSpeed(bool mirrored)
        {
            float length = 0f;

            Vector3[] positions = new Vector3[6];
            positions[0]   = GetRootPosition(mirrored);
            positions[0].y = 0f;
            for (int i = 1; i <= 5; i++)
            {
                Frame future = Data.GetFrame(Mathf.Clamp(Timestamp + (float)i / 5f, 0f, Data.GetTotalTime()));
                positions[i]   = future.GetRootPosition(mirrored);
                positions[i].y = 0f;
            }
            for (int i = 1; i <= 5; i++)
            {
                length += Vector3.Distance(positions[i - 1], positions[i]);
            }
            return(length);
        }
示例#2
0
        public void Inspector(MotionEditor editor)
        {
            UltiDraw.Begin();
            Utility.SetGUIColor(UltiDraw.Grey);
            using (new EditorGUILayout.VerticalScope("Box")) {
                Utility.ResetGUIColor();

                EditorGUILayout.BeginHorizontal();
                if (Utility.GUIButton("+", UltiDraw.DarkGrey, UltiDraw.White, 20f, 20f))
                {
                    AddBone(0);
                }
                EditorGUILayout.LabelField("Group", GUILayout.Width(40f));
                SetName(EditorGUILayout.TextField(ID, GUILayout.Width(100f)));
                EditorGUILayout.LabelField("Mask", GUILayout.Width(40));
                Mask = InternalEditorUtility.ConcatenatedLayersMaskToLayerMask(EditorGUILayout.MaskField(InternalEditorUtility.LayerMaskToConcatenatedLayersMask(Mask), InternalEditorUtility.layers, GUILayout.Width(100f)));
                EditorGUILayout.LabelField("Offset", GUILayout.Width(40f));
                Offset = EditorGUILayout.Vector3Field("", Offset, GUILayout.Width(125f));
                EditorGUILayout.LabelField("Threshold", GUILayout.Width(60f));
                Threshold = EditorGUILayout.FloatField(Threshold, GUILayout.Width(30f));
                EditorGUILayout.LabelField("Velocity", GUILayout.Width(60f));
                Velocity = EditorGUILayout.FloatField(Velocity, GUILayout.Width(30f));
                EditorGUILayout.EndHorizontal();

                for (int i = 0; i < Bones.Length; i++)
                {
                    EditorGUILayout.BeginHorizontal();
                    if (Utility.GUIButton("-", UltiDraw.DarkGrey, UltiDraw.White, 20f, 20f))
                    {
                        RemoveBone(i);
                        i--;
                    }
                    else
                    {
                        SetBone(i, EditorGUILayout.Popup(Bones[i], editor.GetAsset().Source.GetBoneNames()));
                    }
                    EditorGUILayout.EndHorizontal();
                }

                Frame      frame = editor.GetCurrentFrame();
                MotionData data  = editor.GetAsset();

                EditorGUILayout.BeginVertical(GUILayout.Height(10f));
                Rect ctrl = EditorGUILayout.GetControlRect();
                Rect rect = new Rect(ctrl.x, ctrl.y, ctrl.width, 10f);
                EditorGUI.DrawRect(rect, UltiDraw.Black);

                float startTime = frame.Timestamp - editor.GetWindow() / 2f;
                float endTime   = frame.Timestamp + editor.GetWindow() / 2f;
                if (startTime < 0f)
                {
                    endTime  -= startTime;
                    startTime = 0f;
                }
                if (endTime > data.GetTotalTime())
                {
                    startTime -= endTime - data.GetTotalTime();
                    endTime    = data.GetTotalTime();
                }
                startTime = Mathf.Max(0f, startTime);
                endTime   = Mathf.Min(data.GetTotalTime(), endTime);
                int start    = data.GetFrame(startTime).Index;
                int end      = data.GetFrame(endTime).Index;
                int elements = end - start;

                Vector3 bottom = new Vector3(0f, rect.yMax, 0f);
                Vector3 top    = new Vector3(0f, rect.yMax - rect.height, 0f);

                start = Mathf.Clamp(start, 1, Module.Data.Frames.Length);
                end   = Mathf.Clamp(end, 1, Module.Data.Frames.Length);

                //Contacts
                for (int i = start; i <= end; i++)
                {
                    if (GetContact(data.GetFrame(i), editor.Mirror) == 1f)
                    {
                        float left  = rect.xMin + (float)(i - start) / (float)elements * rect.width;
                        float right = left;
                        while (i < end && GetContact(data.GetFrame(i), editor.Mirror) == 1f)
                        {
                            i++;
                            right = rect.xMin + (float)(i - start) / (float)elements * rect.width;
                        }
                        if (left != right)
                        {
                            Vector3 a = new Vector3(left, rect.y, 0f);
                            Vector3 b = new Vector3(right, rect.y, 0f);
                            Vector3 c = new Vector3(left, rect.y + rect.height, 0f);
                            Vector3 d = new Vector3(right, rect.y + rect.height, 0f);
                            UltiDraw.DrawTriangle(a, c, b, UltiDraw.Green);
                            UltiDraw.DrawTriangle(b, c, d, UltiDraw.Green);
                        }
                    }
                }

                //Current Pivot
                top.x    = rect.xMin + (float)(frame.Index - start) / elements * rect.width;
                bottom.x = rect.xMin + (float)(frame.Index - start) / elements * rect.width;
                top.y    = rect.yMax - rect.height;
                bottom.y = rect.yMax;
                UltiDraw.DrawLine(top, bottom, UltiDraw.Yellow);

                Handles.DrawLine(Vector3.zero, Vector3.zero);                 //Somehow needed to get it working...

                EditorGUILayout.EndVertical();
            }
            UltiDraw.End();
        }
        public Trajectory GetTrajectory(bool mirrored)
        {
            Trajectory trajectory = new Trajectory(12, 0);

            for (int i = 0; i < 6; i++)
            {
                Frame previous = Data.GetFrame(Mathf.Clamp(Timestamp - 1f + (float)i / 6f, 0f, Data.GetTotalTime()));
                trajectory.Points[i].SetTransformation(previous.GetRoot(mirrored));
                trajectory.Points[i].SetVelocity(previous.GetBoneVelocity(0, mirrored));
            }
            trajectory.Points[6].SetTransformation(GetRoot(mirrored));
            trajectory.Points[6].SetVelocity(GetBoneVelocity(0, mirrored));
            for (int i = 1; i <= 5; i++)
            {
                Frame future = Data.GetFrame(Mathf.Clamp(Timestamp + (float)i / 5f, 0f, Data.GetTotalTime()));
                trajectory.Points[6 + i].SetTransformation(future.GetRoot(mirrored));
                trajectory.Points[6 + i].SetVelocity(future.GetBoneVelocity(0, mirrored));
            }
            return(trajectory);
        }
        public void Inspector(MotionEditor editor)
        {
            UltiDraw.Begin();
            Utility.SetGUIColor(UltiDraw.Grey);
            using (new EditorGUILayout.VerticalScope("Box")) {
                Utility.ResetGUIColor();

                EditorGUILayout.BeginHorizontal();
                EditorGUILayout.LabelField("Bone", GUILayout.Width(40f));
                Bone = EditorGUILayout.Popup(Bone, editor.GetData().Source.GetBoneNames(), GUILayout.Width(80f));
                EditorGUILayout.LabelField("Mask", GUILayout.Width(30));
                Mask = InternalEditorUtility.ConcatenatedLayersMaskToLayerMask(EditorGUILayout.MaskField(InternalEditorUtility.LayerMaskToConcatenatedLayersMask(Mask), InternalEditorUtility.layers, GUILayout.Width(75f)));
                EditorGUILayout.LabelField("Capture", GUILayout.Width(50));
                Capture = (ID)EditorGUILayout.EnumPopup(Capture, GUILayout.Width(75f));
                EditorGUILayout.LabelField("Edit", GUILayout.Width(30));
                Edit = (ID)EditorGUILayout.EnumPopup(Edit, GUILayout.Width(75f));
                EditorGUILayout.LabelField("Solve Position", GUILayout.Width(80f));
                SolvePosition = EditorGUILayout.Toggle(SolvePosition, GUILayout.Width(20f));
                EditorGUILayout.LabelField("Solve Rotation", GUILayout.Width(80f));
                SolveRotation = EditorGUILayout.Toggle(SolveRotation, GUILayout.Width(20f));
                EditorGUILayout.LabelField("Solve Distance", GUILayout.Width(80f));
                SolveDistance = EditorGUILayout.Toggle(SolveDistance, GUILayout.Width(20f));
                EditorGUILayout.EndHorizontal();

                EditorGUILayout.BeginHorizontal();
                EditorGUILayout.LabelField("Offset", GUILayout.Width(40f));
                Offset = EditorGUILayout.Vector3Field("", Offset, GUILayout.Width(180f));
                EditorGUILayout.LabelField("Threshold", GUILayout.Width(70f));
                Threshold = EditorGUILayout.FloatField(Threshold, GUILayout.Width(50f));
                EditorGUILayout.LabelField("Tolerance", GUILayout.Width(70f));
                Tolerance = EditorGUILayout.FloatField(Tolerance, GUILayout.Width(50f));
                EditorGUILayout.LabelField("Velocity", GUILayout.Width(70f));
                Velocity = EditorGUILayout.FloatField(Velocity, GUILayout.Width(50f));
                EditorGUILayout.LabelField("Weight", GUILayout.Width(60f));
                Weight = EditorGUILayout.FloatField(Weight, GUILayout.Width(50f));
                EditorGUILayout.EndHorizontal();

                Frame      frame = editor.GetCurrentFrame();
                MotionData data  = editor.GetData();

                EditorGUILayout.BeginVertical(GUILayout.Height(10f));
                Rect ctrl = EditorGUILayout.GetControlRect();
                Rect rect = new Rect(ctrl.x, ctrl.y, ctrl.width, 10f);
                EditorGUI.DrawRect(rect, UltiDraw.Black);

                float startTime = frame.Timestamp - editor.GetWindow() / 2f;
                float endTime   = frame.Timestamp + editor.GetWindow() / 2f;
                if (startTime < 0f)
                {
                    endTime  -= startTime;
                    startTime = 0f;
                }
                if (endTime > data.GetTotalTime())
                {
                    startTime -= endTime - data.GetTotalTime();
                    endTime    = data.GetTotalTime();
                }
                startTime = Mathf.Max(0f, startTime);
                endTime   = Mathf.Min(data.GetTotalTime(), endTime);
                int start    = data.GetFrame(startTime).Index;
                int end      = data.GetFrame(endTime).Index;
                int elements = end - start;

                Vector3 bottom = new Vector3(0f, rect.yMax, 0f);
                Vector3 top    = new Vector3(0f, rect.yMax - rect.height, 0f);

                start = Mathf.Clamp(start, 1, Module.Data.Frames.Length);
                end   = Mathf.Clamp(end, 1, Module.Data.Frames.Length);

                //Contacts
                for (int i = start; i <= end; i++)
                {
                    if ((editor.Mirror ? InverseContacts[i - 1] : RegularContacts[i - 1]) == 1f)
                    {
                        float left  = rect.xMin + (float)(i - start) / (float)elements * rect.width;
                        float right = left;
                        while (i < end && (editor.Mirror ? InverseContacts[i - 1] : RegularContacts[i - 1]) != 0f)
                        {
                            right = rect.xMin + (float)(i - start) / (float)elements * rect.width;
                            i++;
                        }
                        if (left != right)
                        {
                            Vector3 a = new Vector3(left, rect.y, 0f);
                            Vector3 b = new Vector3(right, rect.y, 0f);
                            Vector3 c = new Vector3(left, rect.y + rect.height, 0f);
                            Vector3 d = new Vector3(right, rect.y + rect.height, 0f);
                            UltiDraw.DrawTriangle(a, c, b, UltiDraw.Green);
                            UltiDraw.DrawTriangle(b, c, d, UltiDraw.Green);
                        }
                    }
                }

                //Current Pivot
                top.x    = rect.xMin + (float)(frame.Index - start) / elements * rect.width;
                bottom.x = rect.xMin + (float)(frame.Index - start) / elements * rect.width;
                top.y    = rect.yMax - rect.height;
                bottom.y = rect.yMax;
                UltiDraw.DrawLine(top, bottom, UltiDraw.Yellow);

                Handles.DrawLine(Vector3.zero, Vector3.zero);                 //Somehow needed to get it working...

                EditorGUILayout.EndVertical();
            }
            UltiDraw.End();
        }
示例#5
0
 public void SampleTransformations(MotionData reference, params string[] bones)
 {
     if (reference == null)
     {
         Debug.Log("No reference specified.");
         return;
     }
     foreach (string bone in bones)
     {
         Hierarchy.Bone self  = Source.FindBone(bone);
         Hierarchy.Bone other = reference.Source.FindBone(bone);
         if (self == null || other == null)
         {
             Debug.Log("No mapping found for resampling bone " + bone + ".");
         }
         else
         {
             foreach (Frame frame in Frames)
             {
                 frame.Transformations[self.Index] = reference.SampleSourceTransformation(frame.Timestamp.Normalize(0f, GetTotalTime(), 0f, reference.GetTotalTime()), other.Index);
             }
         }
     }
 }
示例#6
0
 public Vector3 GetBoneVelocity(int index, bool mirrored, float smoothing = 0f)
 {
     if (smoothing == 0f)
     {
         return((GetBoneTransformation(index, mirrored).GetPosition() - GetPreviousFrame().GetBoneTransformation(index, mirrored).GetPosition()) * Data.Framerate);
     }
     else
     {
         Frame[] frames   = Data.GetFrames(Mathf.Clamp(Timestamp - smoothing, 0f, Data.GetTotalTime()), Mathf.Clamp(Timestamp + smoothing, 0f, Data.GetTotalTime()));
         Vector3 velocity = Vector3.zero;
         float   sum      = 0f;
         for (int i = 0; i < frames.Length; i++)
         {
             float weight = 2f * (float)(i + 1) / (float)(frames.Length + 1);
             if (weight > 1f)
             {
                 weight = 2f - weight;
             }
             sum      += weight;
             velocity += weight * frames[i].GetBoneVelocity(index, mirrored);
         }
         return(velocity / sum);
     }
 }