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); }
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(); }
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); } } } }
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); } }