public void UpdateAdditiveAnimation(SteamVR_Action_Skeleton0 skeletonAction, SteamVR_Input_Sources inputSource) { SteamVR_Skeleton_PoseSnapshot0 snapshot = GetHandSnapshot(inputSource); SteamVR_Skeleton_Pose_Hand0 poseHand = pose.GetHand(inputSource); for (int boneIndex = 0; boneIndex < snapshotL.bonePositions.Length; boneIndex++) { int fingerIndex = SteamVR_Skeleton_JointIndexes0.GetFingerForBone(boneIndex); SteamVR_Skeleton_FingerExtensionTypes extensionType = poseHand.GetMovementTypeForBone(boneIndex); if (extensionType == SteamVR_Skeleton_FingerExtensionTypes.Free) { snapshot.bonePositions[boneIndex] = skeletonAction.bonePositions[boneIndex]; snapshot.boneRotations[boneIndex] = skeletonAction.boneRotations[boneIndex]; } if (extensionType == SteamVR_Skeleton_FingerExtensionTypes.Extend) { // lerp to open pose by fingercurl snapshot.bonePositions[boneIndex] = Vector3.Lerp(poseHand.bonePositions[boneIndex], skeletonAction.bonePositions[boneIndex], 1 - skeletonAction.fingerCurls[fingerIndex]); snapshot.boneRotations[boneIndex] = Quaternion.Lerp(poseHand.boneRotations[boneIndex], skeletonAction.boneRotations[boneIndex], 1 - skeletonAction.fingerCurls[fingerIndex]); } if (extensionType == SteamVR_Skeleton_FingerExtensionTypes.Contract) { // lerp to closed pose by fingercurl snapshot.bonePositions[boneIndex] = Vector3.Lerp(poseHand.bonePositions[boneIndex], skeletonAction.bonePositions[boneIndex], skeletonAction.fingerCurls[fingerIndex]); snapshot.boneRotations[boneIndex] = Quaternion.Lerp(poseHand.boneRotations[boneIndex], skeletonAction.boneRotations[boneIndex], skeletonAction.fingerCurls[fingerIndex]); } } }
/// <summary> /// Apply blending to this behaviour's pose to an existing snapshot. /// </summary> /// <param name="snapshot">Snapshot to modify</param> /// <param name="blendPoses">List of blend poses to get the target pose</param> /// <param name="inputSource">Which hand to receive input from</param> public void ApplyBlending(SteamVR_Skeleton_PoseSnapshot0 snapshot, SkeletonBlendablePose0[] blendPoses, SteamVR_Input_Sources inputSource) { SteamVR_Skeleton_PoseSnapshot0 targetSnapshot = blendPoses[pose].GetHandSnapshot(inputSource); if (mask.GetFinger(0) || useMask == false) { snapshot.position = Vector3.Lerp(snapshot.position, targetSnapshot.position, influence * value); snapshot.rotation = Quaternion.Slerp(snapshot.rotation, targetSnapshot.rotation, influence * value); } for (int boneIndex = 0; boneIndex < snapshot.bonePositions.Length; boneIndex++) { // verify the current finger is enabled in the mask, or if no mask is used. if (mask.GetFinger(SteamVR_Skeleton_JointIndexes0.GetFingerForBone(boneIndex) + 1) || useMask == false) { snapshot.bonePositions[boneIndex] = Vector3.Lerp(snapshot.bonePositions[boneIndex], targetSnapshot.bonePositions[boneIndex], influence * value); snapshot.boneRotations[boneIndex] = Quaternion.Slerp(snapshot.boneRotations[boneIndex], targetSnapshot.boneRotations[boneIndex], influence * value); } } }
public SteamVR_Skeleton_FingerExtensionTypes GetMovementTypeForBone(int boneIndex) { int fingerIndex = SteamVR_Skeleton_JointIndexes0.GetFingerForBone(boneIndex); switch (fingerIndex) { case SteamVR_Skeleton_FingerIndexes0.thumb: return(thumbFingerMovementType); case SteamVR_Skeleton_FingerIndexes0.index: return(indexFingerMovementType); case SteamVR_Skeleton_FingerIndexes0.middle: return(middleFingerMovementType); case SteamVR_Skeleton_FingerIndexes0.ring: return(ringFingerMovementType); case SteamVR_Skeleton_FingerIndexes0.pinky: return(pinkyFingerMovementType); } return(SteamVR_Skeleton_FingerExtensionTypes.Static); }