private void Track() { if (_dataProvider != null) { var data = _dataProvider.GetSkeletonPoseData(); trackedRoot.position = handAnchor.position; trackedRoot.rotation = handAnchor.rotation; for (var i = 0; i < bones.Length; ++i) { var currentBone = bones[i]; if (data.IsDataValid && data.IsDataHighConfidence) { if (currentBone.tracked != null) { currentBone.tracked.localRotation = data.BoneRotations[i].FromFlippedXQuatf(); if (i == (int)OVRSkeleton.BoneId.Hand_WristRoot) { currentBone.tracked.localRotation *= wristFixupRotation; } if (currentBone.physics != null) { if (i != (int)OVRSkeleton.BoneId.Hand_WristRoot) { var joint = currentBone.joint; joint.SetTargetRotation(currentBone.tracked.localRotation, currentBone.cachedRotation); wristPosOffset = Vector3.Distance(currentBone.physics.AffectedBody.position, currentBone.tracked.position); wristRotOffset = Quaternion.Angle(currentBone.physics.AffectedBody.rotation, currentBone.tracked.rotation); } currentBone.physics.position = currentBone.tracked.position; currentBone.physics.rotation = currentBone.tracked.rotation; //Need to keep this for the wrists Vector3 boneVelocity = (currentBone.tracked.position - currentBone.previousPosition) / Time.deltaTime; currentBone.physics.velocity = boneVelocity; } currentBone.previousPosition = currentBone.tracked.position; currentBone.previousTrackedRotation = currentBone.tracked.localRotation; currentBone.hasBeenTracked = true; } } if (currentBone.mesh != null && currentBone.physics != null) { currentBone.mesh.position = currentBone.physics.transform.position; currentBone.mesh.rotation = currentBone.physics.transform.rotation; } } } }
void Update() { if (_dataProvider != null) { var data = _dataProvider.GetSkeletonPoseData(); trackedRoot.position = handAnchor.position; trackedRoot.rotation = handAnchor.rotation; if (data.IsDataValid && data.IsDataHighConfidence) { for (var i = 0; i < trackedBones.Length; ++i) { var trackedBone = trackedBones[i]; var physicsBone = physicsBones[i]; var meshBone = meshBones[i]; if (trackedBone != null) { trackedBone.localRotation = data.BoneRotations[i].FromFlippedXQuatf(); if (i == (int)OVRSkeleton.BoneId.Hand_WristRoot) { trackedBone.localRotation *= wristFixupRotation; } if (physicsBone != null) { if (i != (int)OVRSkeleton.BoneId.Hand_WristRoot) { var joint = physicsBone.joint; joint.SetTargetRotation(trackedBone.localRotation, cachedRotations[i]); } physicsBone.position = trackedBone.position; physicsBone.rotation = trackedBone.rotation; //Need to keep this for the wrists Vector3 boneVelocity = (trackedBone.position - previousPositions[i]) / Time.deltaTime; physicsBone.velocity = boneVelocity; if (meshBone != null) { meshBone.position = physicsBone.transform.position; meshBone.rotation = physicsBone.transform.rotation; } } } previousPositions[i] = trackedBone.position; } } } }