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