void Update()
    {
        OptitrackSkeletonState skelState = StreamingClient.GetLatestSkeletonState(m_skeletonDef.Id);

        if (skelState != null)
        {
            // Update the transforms of the bone GameObjects.
            for (int i = 0; i < m_skeletonDef.Bones.Count; ++i)
            {
                Int32 boneId = m_skeletonDef.Bones[i].Id;

                OptitrackPose bonePose;
                GameObject    boneObject;
                bool          foundPose   = skelState.BonePoses.TryGetValue(boneId, out bonePose);
                bool          foundObject = m_boneObjectMap.TryGetValue(boneId, out boneObject);
                if (foundPose && foundObject)
                {
                    boneObject.transform.localPosition = bonePose.Position;
                    boneObject.transform.localRotation = bonePose.Orientation;
                }
            }

            // Perform Mecanim retargeting.
            if (m_srcPoseHandler != null && m_destPoseHandler != null)
            {
                // Interpret the streamed pose into Mecanim muscle space representation.
                m_srcPoseHandler.GetHumanPose(ref m_humanPose);

                // Retarget that muscle space pose to the destination avatar.
                m_destPoseHandler.SetHumanPose(ref m_humanPose);
            }
        }
    }
Ejemplo n.º 2
0
        public override void UpdateTracker()
        {
            base.UpdateTracker();

            status = Status.Unavailable;

            if (!enabled || streamingClient == null)
            {
                return;
            }

            status = Status.Present;

            deviceView.position    = Target.ToVector(trackerTransform.position);
            deviceView.orientation = Target.ToRotation(trackerTransform.rotation);

            if (trackingType == TrackingType.Skeleton && m_skeletonDef != null)
            {
                OptitrackSkeletonState skelState = streamingClient.GetLatestSkeletonState(m_skeletonDef.Id);
                if (skelState == null)
                {
                    return;
                }

                status = Status.Tracking;


                // Update the transforms of the bone GameObjects.
                for (int i = 0; i < m_skeletonDef.Bones.Count; ++i)
                {
                    int optitrackBoneId = m_skeletonDef.Bones[i].Id;

                    OptitrackPose bonePose;
                    Bone          boneId;

                    bool foundPose = skelState.BonePoses.TryGetValue(optitrackBoneId, out bonePose);
                    if (foundPose)
                    {
                        bool foundBone = optitrackBoneMapping.TryGetValue(m_skeletonDef.Bones[i].Name, out boneId);
                        if (foundBone)
                        {
                            bonePositions[(int)boneId] = bonePose.Position;
                            boneRotations[(int)boneId] = bonePose.Orientation;
                        }
                    }
                }
            }
        }
Ejemplo n.º 3
0
    void Update()
    {
        if (StreamingClient == null)
        {
            return;
        }
        OptitrackSkeletonState skelState = StreamingClient.GetLatestSkeletonState(m_skeletonDef.Id);

        if (skelState != null)
        {
            // Update the transforms of the bone GameObjects.
            for (int i = 0; i < m_skeletonDef.Bones.Count; ++i)
            {
                Int32 boneId = m_skeletonDef.Bones[i].Id;

                OptitrackPose bonePose;
                GameObject    boneObject;
                bool          foundPose   = skelState.BonePoses.TryGetValue(boneId, out bonePose);
                bool          foundObject = m_boneObjectMap.TryGetValue(boneId, out boneObject);
                if (foundPose && foundObject)
                {
                    Vector3 startPos = boneObject.transform.localPosition;
                    Vector3 endPos   = bonePose.Position.V3;
                    float   journey  = (startPos - endPos).magnitude;
                    // if bone position change too large, then move smaller
//                    if (journey > 0.1f)
//                    {
//                        boneObject.transform.localPosition =
//                            Vector3.Lerp(startPos, endPos, Time.deltaTime / (5 * journey));
//						Debug.Log ("lerping skeleton");
//                    }
//                    else
//                    {
//						boneObject.transform.localPosition = bonePose.Position.V3;
//                    }
                    if (StreamingClient.ConnectionType == OptitrackStreamingClient.ClientConnectionType.Photon)
                    {
                        boneObject.transform.localPosition = Vector3.Lerp(startPos, endPos, Time.deltaTime * 15);
                    }
                    else
                    {
                        boneObject.transform.localPosition = bonePose.Position.V3;
                    }

                    // Clamp retargetted optitrack bones
                    #region Clamp bone rotation
                    angleX = bonePose.Orientation.Q.eulerAngles.x;
                    angleY = bonePose.Orientation.Q.eulerAngles.y;
                    angleZ = bonePose.Orientation.Q.eulerAngles.z;

                    if (bonePose.Orientation.Q.eulerAngles.x > 180f)
                    {
                        angleX = bonePose.Orientation.Q.eulerAngles.x - 360;
                    }
                    if (bonePose.Orientation.Q.eulerAngles.y > 180f)
                    {
                        angleY = bonePose.Orientation.Q.eulerAngles.y - 360;
                    }
                    if (bonePose.Orientation.Q.eulerAngles.z > 180f)
                    {
                        angleZ = bonePose.Orientation.Q.eulerAngles.z - 360;
                    }

                    if (boneObject.name.Contains("LThumb1"))
                    {
                        SetBoneRotation(boneObject, BoneLimit.LThumb1.xMin, BoneLimit.LThumb1.yMin,
                                        BoneLimit.LThumb1.zMin,
                                        BoneLimit.LThumb1.xMax, BoneLimit.LThumb1.yMax, BoneLimit.LThumb1.zMax);
                    }
                    else if (boneObject.name.Contains("LThumb2"))
                    {
                        SetBoneRotation(boneObject, BoneLimit.LThumb2.xMin, BoneLimit.LThumb2.yMin,
                                        BoneLimit.LThumb2.zMin,
                                        BoneLimit.LThumb2.xMax, BoneLimit.LThumb2.yMax, BoneLimit.LThumb2.zMax);
                    }

                    else if (boneObject.name.Contains("RThumb1"))
                    {
                        SetBoneRotation(boneObject, BoneLimit.RThumb1.xMin, BoneLimit.RThumb1.yMin,
                                        BoneLimit.RThumb1.zMin,
                                        BoneLimit.RThumb1.xMax, BoneLimit.RThumb1.yMax, BoneLimit.RThumb1.zMax);
                    }
                    else if (boneObject.name.Contains("RThumb2"))
                    {
                        SetBoneRotation(boneObject, BoneLimit.RThumb2.xMin, BoneLimit.RThumb2.yMin,
                                        BoneLimit.RThumb2.zMin,
                                        BoneLimit.RThumb2.xMax, BoneLimit.RThumb2.yMax, BoneLimit.RThumb2.zMax);
                    }

                    else if (boneObject.name.Contains("RIndex1") || boneObject.name.Contains("RRing1") ||
                             boneObject.name.Contains("RMiddle1") || boneObject.name.Contains("RPinky1"))
                    {
                        SetBoneRotation(boneObject, BoneLimit.RRing1.xMin, BoneLimit.RRing1.yMin, BoneLimit.RRing1.zMin,
                                        BoneLimit.RRing1.xMax, BoneLimit.RRing1.yMax, BoneLimit.RRing1.zMax);
                    }
                    else if (boneObject.name.Contains("RIndex2") || boneObject.name.Contains("RIndex3") ||
                             boneObject.name.Contains("RRing2") || boneObject.name.Contains("RRing3") ||
                             boneObject.name.Contains("RMiddle2") || boneObject.name.Contains("RMiddle3") ||
                             boneObject.name.Contains("RPinky2") || boneObject.name.Contains("RPinky3"))
                    {
                        SetBoneRotation(boneObject, BoneLimit.RRing2.xMin, BoneLimit.RRing2.yMin, BoneLimit.RRing2.zMin,
                                        BoneLimit.RRing2.xMax, BoneLimit.RRing2.yMax, BoneLimit.RRing2.zMax);
                    }
                    else if (boneObject.name.Contains("LIndex1") || boneObject.name.Contains("LRing1") ||
                             boneObject.name.Contains("LMiddle1") || boneObject.name.Contains("LPinky1"))
                    {
                        SetBoneRotation(boneObject, BoneLimit.LRing1.xMin, BoneLimit.LRing1.yMin, BoneLimit.LRing1.zMin,
                                        BoneLimit.LRing1.xMax, BoneLimit.LRing1.yMax, BoneLimit.LRing1.zMax);
                    }

                    else if (boneObject.name.Contains("LIndex2") || boneObject.name.Contains("LIndex3") ||
                             boneObject.name.Contains("LRing2") || boneObject.name.Contains("LRing3") ||
                             boneObject.name.Contains("LMiddle2") || boneObject.name.Contains("LMiddle3") ||
                             boneObject.name.Contains("LPinky2") || boneObject.name.Contains("LPinky3"))
                    {
                        SetBoneRotation(boneObject, BoneLimit.LRing2.xMin, BoneLimit.LRing2.yMin, BoneLimit.LRing2.zMin,
                                        BoneLimit.LRing2.xMax, BoneLimit.LRing2.yMax, BoneLimit.LRing2.zMax);
                    }


                    else
                    {
                        if (StreamingClient.ConnectionType == OptitrackStreamingClient.ClientConnectionType.Photon)
                        {
                            boneObject.transform.localRotation = Quaternion.Lerp(boneObject.transform.localRotation, bonePose.Orientation.Q, Time.deltaTime * 15);
                        }
                        else
                        {
                            boneObject.transform.localRotation = bonePose.Orientation.Q;
                        }
                    }

                    #endregion
                }
            }

            // Perform Mecanim retargeting.
            if (m_srcPoseHandler != null && m_destPoseHandler != null)
            {
                // Interpret the streamed pose into Mecanim muscle space representation.
                m_srcPoseHandler.GetHumanPose(ref m_humanPose);

                // Retarget that muscle space pose to the destination avatar.
                m_destPoseHandler.SetHumanPose(ref m_humanPose);
            }
        }
    }