private void UpdateDataPoses(SkeletonPoseData poseData) { _handDataAsset.HandScale = poseData.RootScale; _handDataAsset.IsTracked = _ovrHand.IsTracked; _handDataAsset.IsHighConfidence = poseData.IsDataHighConfidence; _handDataAsset.IsDominantHand = _ovrHand.IsDominantHand; _handDataAsset.RootPoseOrigin = _handDataAsset.IsTracked ? PoseOrigin.RawTrackedPose : PoseOrigin.None; for (var fingerIdx = 0; fingerIdx < Constants.NUM_FINGERS; fingerIdx++) { var ovrFingerIdx = (OVRHand.HandFinger)fingerIdx; bool isPinching = _ovrHand.GetFingerIsPinching(ovrFingerIdx); _handDataAsset.IsFingerPinching[fingerIdx] = isPinching; bool isHighConfidence = _ovrHand.GetFingerConfidence(ovrFingerIdx) == OVRHand.TrackingConfidence.High; _handDataAsset.IsFingerHighConfidence[fingerIdx] = isHighConfidence; float fingerPinchStrength = _ovrHand.GetFingerPinchStrength(ovrFingerIdx); _handDataAsset.FingerPinchStrength[fingerIdx] = fingerPinchStrength; } // Read the poses directly from the poseData, so it isn't in conflict with // any modifications that the application makes to OVRSkeleton _handDataAsset.Root = new Pose() { position = poseData.RootPose.Position.FromFlippedZVector3f(), rotation = poseData.RootPose.Orientation.FromFlippedZQuatf() }; if (_ovrHand.IsPointerPoseValid) { _handDataAsset.PointerPoseOrigin = PoseOrigin.RawTrackedPose; _handDataAsset.PointerPose = new Pose(_ovrHand.PointerPose.localPosition, _ovrHand.PointerPose.localRotation); } else { _handDataAsset.PointerPoseOrigin = PoseOrigin.None; } // Hand joint rotations X axis needs flipping to get to Unity's coordinate system. var bones = poseData.BoneRotations; for (int i = 0; i < bones.Length; i++) { // When using Link in the Unity Editor, the first frame of hand data // sometimes contains bad joint data. _handDataAsset.Joints[i] = float.IsNaN(bones[i].w) ? Config.HandSkeleton.joints[i].pose.rotation : bones[i].FromFlippedXQuatf(); } _handDataAsset.Joints[0] = WristFixupRotation; }
protected override void UpdateData() { _handDataAsset.Config = Config; _handDataAsset.IsDataValid = true; _handDataAsset.IsConnected = (OVRInput.GetConnectedControllers() & _ovrController) > 0; if (_ovrHand != null) { IOVRSkeletonDataProvider skeletonProvider = _ovrHand; SkeletonPoseData poseData = skeletonProvider.GetSkeletonPoseData(); if (poseData.IsDataValid && poseData.RootScale <= 0.0f) { if (_lastHandScale <= 0.0f) { poseData.IsDataValid = false; } else { poseData.RootScale = _lastHandScale; } } else { _lastHandScale = poseData.RootScale; } if (poseData.IsDataValid && _handDataAsset.IsConnected) { UpdateDataPoses(poseData); return; } } // revert state fields to their defaults _handDataAsset.IsConnected = default; _handDataAsset.IsTracked = default; _handDataAsset.RootPoseOrigin = default; _handDataAsset.PointerPoseOrigin = default; _handDataAsset.IsHighConfidence = default; for (var fingerIdx = 0; fingerIdx < Constants.NUM_FINGERS; fingerIdx++) { _handDataAsset.IsFingerPinching[fingerIdx] = default; _handDataAsset.IsFingerHighConfidence[fingerIdx] = default; } }