Browse Source

add scaling to always make same length

Kenkart 2 years ago
parent
commit
20e5f6590e

+ 82 - 20
Assets/KinectView/Scripts/BodySourceView.cs

@@ -15,9 +15,6 @@ public class BodySourceView : MonoBehaviour
     public bool wristLeftLate;
     public bool wristRightLate;
 
-    [HideInInspector]
-    public float scale;
-
     private Dictionary<ulong, GameObject> _Bodies = new Dictionary<ulong, GameObject>();
     private BodySourceManager _BodyManager;
 
@@ -133,7 +130,8 @@ public class BodySourceView : MonoBehaviour
                 Rigidbody rb = jointObj.AddComponent<Rigidbody>();
                 rb.useGravity = false;
                 rb.isKinematic = true;
-            } else if (jt == Kinect.JointType.WristRight)
+            }
+            else if (jt == Kinect.JointType.WristRight)
             {
                 jointObj.tag = "WristRight";
                 Rigidbody rb = jointObj.AddComponent<Rigidbody>();
@@ -161,6 +159,19 @@ public class BodySourceView : MonoBehaviour
 
     private void RefreshBodyObject(Kinect.Body body, GameObject bodyObject)
     {
+        Vector3[] initJoints = new Vector3[25];
+        for (Kinect.JointType jt = Kinect.JointType.SpineBase; jt <= Kinect.JointType.ThumbRight; jt++)
+        {
+            Kinect.Joint sourceJoint = body.Joints[jt];
+
+            initJoints[(int)jt] = GetVector3FromJoint(sourceJoint);
+        }
+
+        // TODO: use this method
+        Vector3[] rescaledJoints = RescaleJoints(initJoints);
+
+
+
         for (Kinect.JointType jt = Kinect.JointType.SpineBase; jt <= Kinect.JointType.ThumbRight; jt++)
         {
             Kinect.Joint sourceJoint = body.Joints[jt];
@@ -172,8 +183,9 @@ public class BodySourceView : MonoBehaviour
             }
 
             Transform jointObj = bodyObject.transform.Find(jt.ToString());
-            jointObj.localPosition = GetVector3FromJoint(sourceJoint);
-            
+            //jointObj.localPosition = GetVector3FromJoint(sourceJoint);
+            jointObj.localPosition = rescaledJoints[(int)jt];
+
             if (jt == Kinect.JointType.Head)
             {
                 // Make head joint invisible
@@ -206,17 +218,18 @@ public class BodySourceView : MonoBehaviour
             {
                 if (modeController.feedback == ModeController.Feedback.ColorFeedback)
                 {
-                    // TODO: Change to red color
                     jointObj.GetComponent<Renderer>().material.color = new Color(1, 0, 0);
                     jointObj.GetComponent<LineRenderer>().startColor = new Color(1, 0, 0);
-                } else if (modeController.feedback == ModeController.Feedback.HapticFeedback)
+                }
+                else if (modeController.feedback == ModeController.Feedback.HapticFeedback)
                 {
                     // TODO: Add haptic feedback need to test
                     if (jt == Kinect.JointType.WristLeft)
                     {
                         Debug.Log("WristLeft vibrate");
                         SteamVR_Actions.default_Haptic[SteamVR_Input_Sources.LeftHand].Execute(0, 0.01f, 10, 1);
-                    } else if (jt == Kinect.JointType.WristRight)
+                    }
+                    else if (jt == Kinect.JointType.WristRight)
                     {
                         Debug.Log("WristRight vibrate");
                         SteamVR_Actions.default_Haptic[SteamVR_Input_Sources.RightHand].Execute(0, 0.01f, 10, 1);
@@ -230,7 +243,8 @@ public class BodySourceView : MonoBehaviour
                     && jt != Kinect.JointType.HandTipLeft && jt != Kinect.JointType.HandTipRight) // Do not make LineRenderer for these joints
             {
                 lr.SetPosition(0, jointObj.localPosition);
-                lr.SetPosition(1, GetVector3FromJoint(targetJoint.Value));
+                //lr.SetPosition(1, GetVector3FromJoint(targetJoint.Value));
+                lr.SetPosition(1, rescaledJoints[(int)_BoneMap[jt]]);
 
                 // Coloring the line renderer
                 //lr.SetColors(GetColorForState(sourceJoint.TrackingState), GetColorForState(targetJoint.Value.TrackingState));
@@ -296,16 +310,7 @@ public class BodySourceView : MonoBehaviour
     {
         //return new Vector3(joint.Position.X * -10, joint.Position.Y * 10, joint.Position.Z * 10);
 
-        // TODO: problem with scaling
-        if (joint.JointType == Kinect.JointType.ShoulderLeft)
-        {
-            return new Vector3((joint.Position.X + scale) * -1 - 0.01f, joint.Position.Y + scale, joint.Position.Z + scale);
-        } else if (joint.JointType == Kinect.JointType.ShoulderRight)
-        {
-            return new Vector3((joint.Position.X + scale) * -1 + 0.01f, joint.Position.Y + scale, joint.Position.Z + scale);
-        }
-
-        return new Vector3((joint.Position.X + scale) * -1, joint.Position.Y + scale, joint.Position.Z + scale);
+        return new Vector3(joint.Position.X * -1, joint.Position.Y, joint.Position.Z);
     }
 
     private Quaternion ConvertKinectOrientationToUnity(Kinect.Vector4 orientation)
@@ -317,4 +322,61 @@ public class BodySourceView : MonoBehaviour
         orientationUnity.w = orientation.W;
         return orientationUnity;
     }
+
+    // TODO: need to test
+    private Vector3[] RescaleJoints(Vector3[] initJoints)
+    {
+        Vector3[] rescaledJoints = new Vector3[25];
+
+        rescaledJoints[(int)Kinect.JointType.FootLeft] = initJoints[(int)Kinect.JointType.FootLeft];
+        rescaledJoints[(int)Kinect.JointType.FootRight] = initJoints[(int)Kinect.JointType.FootRight];
+        rescaledJoints[(int)Kinect.JointType.AnkleLeft] = initJoints[(int)Kinect.JointType.AnkleLeft];
+        rescaledJoints[(int)Kinect.JointType.AnkleRight] = initJoints[(int)Kinect.JointType.AnkleRight];
+
+        rescaledJoints[(int)Kinect.JointType.KneeLeft] = GetTargetJointWithDesiredLength(
+            initJoints[(int)Kinect.JointType.AnkleLeft], initJoints[(int)Kinect.JointType.KneeLeft], 0.4f);
+        rescaledJoints[(int)Kinect.JointType.KneeRight] = GetTargetJointWithDesiredLength(
+            initJoints[(int)Kinect.JointType.AnkleRight], initJoints[(int)Kinect.JointType.KneeRight], 0.4f);
+
+        rescaledJoints[(int)Kinect.JointType.HipLeft] = GetTargetJointWithDesiredLength(
+            initJoints[(int)Kinect.JointType.KneeLeft], initJoints[(int)Kinect.JointType.HipLeft], 0.25f);
+        rescaledJoints[(int)Kinect.JointType.HipRight] = GetTargetJointWithDesiredLength(
+            initJoints[(int)Kinect.JointType.KneeRight], initJoints[(int)Kinect.JointType.HipRight], 0.25f);
+
+        rescaledJoints[(int)Kinect.JointType.SpineBase] = GetTargetJointWithDesiredLength(
+            initJoints[(int)Kinect.JointType.HipLeft], initJoints[(int)Kinect.JointType.SpineBase], 0.08f);
+
+        rescaledJoints[(int)Kinect.JointType.SpineMid] = GetTargetJointWithDesiredLength(
+            initJoints[(int)Kinect.JointType.SpineBase], initJoints[(int)Kinect.JointType.SpineMid], 0.3f);
+
+        rescaledJoints[(int)Kinect.JointType.SpineShoulder] = GetTargetJointWithDesiredLength(
+            initJoints[(int)Kinect.JointType.SpineMid], initJoints[(int)Kinect.JointType.SpineShoulder], 0.2f);
+
+        rescaledJoints[(int)Kinect.JointType.ShoulderLeft] = GetTargetJointWithDesiredLength(
+            initJoints[(int)Kinect.JointType.SpineShoulder], initJoints[(int)Kinect.JointType.ShoulderLeft], 0.15f);
+        rescaledJoints[(int)Kinect.JointType.ShoulderRight] = GetTargetJointWithDesiredLength(
+            initJoints[(int)Kinect.JointType.SpineShoulder], initJoints[(int)Kinect.JointType.ShoulderRight], 0.15f);
+
+        rescaledJoints[(int)Kinect.JointType.ElbowLeft] = GetTargetJointWithDesiredLength(
+            initJoints[(int)Kinect.JointType.ShoulderLeft], initJoints[(int)Kinect.JointType.ElbowLeft], 0.25f);
+        rescaledJoints[(int)Kinect.JointType.ElbowRight] = GetTargetJointWithDesiredLength(
+            initJoints[(int)Kinect.JointType.ShoulderRight], initJoints[(int)Kinect.JointType.ElbowRight], 0.25f);
+
+        rescaledJoints[(int)Kinect.JointType.WristLeft] = GetTargetJointWithDesiredLength(
+            initJoints[(int)Kinect.JointType.ElbowLeft], initJoints[(int)Kinect.JointType.WristLeft], 0.2f);
+        rescaledJoints[(int)Kinect.JointType.WristRight] = GetTargetJointWithDesiredLength(
+            initJoints[(int)Kinect.JointType.ElbowRight], initJoints[(int)Kinect.JointType.WristRight], 0.2f);
+
+        rescaledJoints[(int)Kinect.JointType.Neck] = GetTargetJointWithDesiredLength(
+            initJoints[(int)Kinect.JointType.SpineShoulder], initJoints[(int)Kinect.JointType.Neck], 0.07f);
+
+        return rescaledJoints;
+    }
+
+    private Vector3 GetTargetJointWithDesiredLength(Vector3 source, Vector3 target, float desiredLength)
+    {
+        Vector3 sourceToTarget = target - source;
+        float length = sourceToTarget.magnitude;
+        return sourceToTarget * desiredLength / length + source;
+    }
 }

+ 1 - 1
Assets/Scripts/Visualizer_FadeInSeries.cs

@@ -129,7 +129,7 @@ public class Visualizer_FadeInSeries : MonoBehaviour
                 jointObj.transform.parent = body.transform;
 
                 // Set alpha depends on i
-                Color newColor = new Color(1, 1, 1, Mathf.Lerp(0, 1, (float) (i + 1) / jointsDataSeries.Count));
+                Color newColor = new Color(1, 1, 0, Mathf.Lerp(0, 1, (float) (i + 1) / jointsDataSeries.Count));
                 jointObj.GetComponent<MeshRenderer>().material.color = newColor;
                 jointObj.GetComponent<LineRenderer>().startColor = newColor;
                 jointObj.GetComponent<LineRenderer>().endColor = newColor;

+ 0 - 13
Assets/Scripts/ViveInput.cs

@@ -51,18 +51,5 @@ public class ViveInput : MonoBehaviour
             playerReplay.AddJoints(recordingTime);
             recordingTime += Time.deltaTime;
         }
-
-        if (Input.GetKeyDown("up"))
-        {
-            Debug.Log("up");
-            bsv.scale += 0.1f;
-        }
-
-        if (Input.GetKeyDown("down"))
-        {
-            Debug.Log("down");
-            bsv.scale -= 0.1f;
-        }
-
     }
 }