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]); } } }
protected virtual void UpdateSkeletonTransforms() { Vector3[] bonePositions = GetBonePositions(); Quaternion[] boneRotations = GetBoneRotations(); if (skeletonBlend <= 0) { if (blendPoser != null) { SteamVR_Skeleton_Pose_Hand0 mainPose = blendPoser.skeletonMainPose.GetHand(inputSource); for (int boneIndex = 0; boneIndex < bones.Length; boneIndex++) { if (bones[boneIndex] == null) { continue; } if ((boneIndex == SteamVR_Skeleton_JointIndexes0.wrist && mainPose.ignoreWristPoseData) || (boneIndex == SteamVR_Skeleton_JointIndexes0.root && mainPose.ignoreRootPoseData)) { SetBonePosition(boneIndex, bonePositions[boneIndex]); SetBoneRotation(boneIndex, boneRotations[boneIndex]); } else { Quaternion poseRotation = GetBlendPoseForBone(boneIndex, boneRotations[boneIndex]); SetBonePosition(boneIndex, blendSnapshot.bonePositions[boneIndex]); SetBoneRotation(boneIndex, poseRotation); } } } } else if (skeletonBlend >= 1) { for (int boneIndex = 0; boneIndex < bones.Length; boneIndex++) { if (bones[boneIndex] == null) { continue; } SetBonePosition(boneIndex, bonePositions[boneIndex]); SetBoneRotation(boneIndex, boneRotations[boneIndex]); } } else { for (int boneIndex = 0; boneIndex < bones.Length; boneIndex++) { if (bones[boneIndex] == null) { continue; } if (blendPoser != null) { SteamVR_Skeleton_Pose_Hand0 mainPose = blendPoser.skeletonMainPose.GetHand(inputSource); if ((boneIndex == SteamVR_Skeleton_JointIndexes0.wrist && mainPose.ignoreWristPoseData) || (boneIndex == SteamVR_Skeleton_JointIndexes0.root && mainPose.ignoreRootPoseData)) { SetBonePosition(boneIndex, bonePositions[boneIndex]); SetBoneRotation(boneIndex, boneRotations[boneIndex]); } else { Quaternion poseRotation = GetBlendPoseForBone(boneIndex, boneRotations[boneIndex]); SetBonePosition(boneIndex, Vector3.Lerp(blendSnapshot.bonePositions[boneIndex], bonePositions[boneIndex], skeletonBlend)); SetBoneRotation(boneIndex, Quaternion.Lerp(poseRotation, boneRotations[boneIndex], skeletonBlend)); } } else { SetBonePosition(boneIndex, Vector3.Lerp(bones[boneIndex].localPosition, bonePositions[boneIndex], skeletonBlend)); SetBoneRotation(boneIndex, Quaternion.Lerp(bones[boneIndex].localRotation, boneRotations[boneIndex], skeletonBlend)); } } } if (onBoneTransformsUpdated != null) { onBoneTransformsUpdated.Invoke(this, inputSource); } if (onBoneTransformsUpdatedEvent != null) { onBoneTransformsUpdatedEvent.Invoke(this, inputSource); } }