protected void DrawSaveButtons() { bool showLeft = showLeftPreviewProperty.boolValue; GameObject leftInstance = previewLeftInstanceProperty.objectReferenceValue as GameObject; SteamVR_Behaviour_Skeleton leftSkeleton = null; if (leftInstance != null) { leftSkeleton = leftInstance.GetComponent <SteamVR_Behaviour_Skeleton>(); } bool showRight = showRightPreviewProperty.boolValue; GameObject rightInstance = previewRightInstanceProperty.objectReferenceValue as GameObject; SteamVR_Behaviour_Skeleton rightSkeleton = null; if (rightInstance != null) { rightSkeleton = rightInstance.GetComponent <SteamVR_Behaviour_Skeleton>(); } EditorGUILayout.Space(); DrawHand(showLeft, poser.skeletonPose.leftHand, leftSkeleton, rightSkeleton); EditorGUILayout.Space(); DrawHand(showRight, poser.skeletonPose.rightHand, leftSkeleton, rightSkeleton); }
public Quaternion GetTargetHandRotation(SteamVR_Behaviour_Skeleton hand, Transform origin) { Quaternion oldOrigin = origin.rotation; origin.rotation = hand.transform.rotation * GetBlendedPose(hand).rotation; Quaternion offsetRot = Quaternion.Inverse(origin.rotation) * hand.transform.rotation; origin.rotation = oldOrigin; return(origin.rotation * offsetRot); }
protected void UpdatePreviewHand(SerializedProperty instanceProperty, SerializedProperty showPreviewProperty, SerializedProperty prefabProperty, SteamVR_Skeleton_Pose_Hand handData) { GameObject preview = instanceProperty.objectReferenceValue as GameObject; EditorGUILayout.PropertyField(showPreviewProperty); if (showPreviewProperty.boolValue) { if (preview == null) { preview = GameObject.Instantiate <GameObject>((GameObject)prefabProperty.objectReferenceValue); preview.transform.parent = poser.transform; preview.transform.localPosition = Vector3.zero; preview.transform.localRotation = Quaternion.identity; SteamVR_Behaviour_Skeleton previewSkeleton = null; if (preview != null) { previewSkeleton = preview.GetComponent <SteamVR_Behaviour_Skeleton>(); } if (previewSkeleton != null) { if (handData.bonePositions == null || handData.bonePositions.Length == 0) { previewSkeleton.ForceToReferencePose(defaultReferencePose); SaveHandData(handData, previewSkeleton); } preview.transform.localPosition = Vector3.zero; preview.transform.localRotation = Quaternion.identity; preview.transform.localRotation = Quaternion.Inverse(handData.rotation); preview.transform.position = preview.transform.TransformPoint(-handData.position); for (int boneIndex = 0; boneIndex < handData.bonePositions.Length; boneIndex++) { Transform bone = previewSkeleton.GetBone(boneIndex); bone.localPosition = handData.bonePositions[boneIndex]; bone.localRotation = handData.boneRotations[boneIndex]; } } instanceProperty.objectReferenceValue = preview; } } else { if (preview != null) { DestroyImmediate(preview); } } }
public void UpdateAdditiveAnimation(SteamVR_Action_Skeleton skeletonAction, SteamVR_Input_Sources inputSource) { SteamVR_Skeleton_PoseSnapshot snapshot = GetHandSnapshot(inputSource); SteamVR_Skeleton_Pose_Hand poseHand = pose.GetHand(inputSource); //setup mirrored pose buffers if (additivePositionBuffer == null) { additivePositionBuffer = new Vector3[skeletonAction.boneCount]; } if (additiveRotationBuffer == null) { additiveRotationBuffer = new Quaternion[skeletonAction.boneCount]; } for (int boneIndex = 0; boneIndex < snapshotL.bonePositions.Length; boneIndex++) { int fingerIndex = SteamVR_Skeleton_JointIndexes.GetFingerForBone(boneIndex); SteamVR_Skeleton_FingerExtensionTypes extensionType = poseHand.GetMovementTypeForBone(boneIndex); //do target pose mirroring on left hand if (inputSource == SteamVR_Input_Sources.LeftHand) { SteamVR_Behaviour_Skeleton.MirrorBonePosition(ref skeletonAction.bonePositions[boneIndex], ref additivePositionBuffer[boneIndex], boneIndex); SteamVR_Behaviour_Skeleton.MirrorBoneRotation(ref skeletonAction.boneRotations[boneIndex], ref additiveRotationBuffer[boneIndex], boneIndex); } else { additivePositionBuffer[boneIndex] = skeletonAction.bonePositions[boneIndex]; additiveRotationBuffer[boneIndex] = skeletonAction.boneRotations[boneIndex]; } if (extensionType == SteamVR_Skeleton_FingerExtensionTypes.Free) { snapshot.bonePositions[boneIndex] = additivePositionBuffer[boneIndex]; snapshot.boneRotations[boneIndex] = additiveRotationBuffer[boneIndex]; } else if (extensionType == SteamVR_Skeleton_FingerExtensionTypes.Extend) { // lerp to open pose by fingercurl snapshot.bonePositions[boneIndex] = Vector3.Lerp(poseHand.bonePositions[boneIndex], additivePositionBuffer[boneIndex], 1 - skeletonAction.fingerCurls[fingerIndex]); snapshot.boneRotations[boneIndex] = Quaternion.Lerp(poseHand.boneRotations[boneIndex], additiveRotationBuffer[boneIndex], 1 - skeletonAction.fingerCurls[fingerIndex]); } else if (extensionType == SteamVR_Skeleton_FingerExtensionTypes.Contract) { // lerp to closed pose by fingercurl snapshot.bonePositions[boneIndex] = Vector3.Lerp(poseHand.bonePositions[boneIndex], additivePositionBuffer[boneIndex], skeletonAction.fingerCurls[fingerIndex]); snapshot.boneRotations[boneIndex] = Quaternion.Lerp(poseHand.boneRotations[boneIndex], additiveRotationBuffer[boneIndex], skeletonAction.fingerCurls[fingerIndex]); } } }
//this is broken public Vector3 GetTargetHandPosition(SteamVR_Behaviour_Skeleton hand, Transform origin) { Vector3 oldOrigin = origin.position; Quaternion oldHand = hand.transform.rotation; hand.transform.rotation = GetBlendedPose(hand).rotation; origin.position = hand.transform.TransformPoint(GetBlendedPose(hand).position); Vector3 offset = origin.InverseTransformPoint(hand.transform.position); origin.position = oldOrigin; hand.transform.rotation = oldHand; return(origin.TransformPoint(offset)); }
protected void SaveHandData(SteamVR_Skeleton_Pose_Hand handData, SteamVR_Behaviour_Skeleton thisSkeleton) { handData.position = thisSkeleton.transform.InverseTransformPoint(poser.transform.position); //handData.position = thisSkeleton.transform.localPosition; handData.rotation = Quaternion.Inverse(thisSkeleton.transform.localRotation); handData.bonePositions = new Vector3[SteamVR_Action_Skeleton.numBones]; handData.boneRotations = new Quaternion[SteamVR_Action_Skeleton.numBones]; for (int boneIndex = 0; boneIndex < SteamVR_Action_Skeleton.numBones; boneIndex++) { Transform bone = thisSkeleton.GetBone(boneIndex); handData.bonePositions[boneIndex] = bone.localPosition; handData.boneRotations[boneIndex] = bone.localRotation; } EditorUtility.SetDirty(activePose); }
/// <summary> /// Retrieve the final animated pose, to be applied to a hand skeleton /// </summary> /// <param name="skeletonBehaviour">The skeleton behaviour you want to get the action/input source from to blend between</param> public SteamVR_Skeleton_PoseSnapshot GetBlendedPose(SteamVR_Behaviour_Skeleton skeletonBehaviour) { return(GetBlendedPose(skeletonBehaviour.skeletonAction, skeletonBehaviour.inputSource)); }
protected void UpdatePreviewHand(SerializedProperty instanceProperty, SerializedProperty showPreviewProperty, GameObject previewPrefab, SteamVR_Skeleton_Pose_Hand handData, SteamVR_Skeleton_Pose sourcePose, bool forceUpdate) { GameObject preview = instanceProperty.objectReferenceValue as GameObject; //EditorGUILayout.PropertyField(showPreviewProperty); if (showPreviewProperty.boolValue) { if (forceUpdate && preview != null) { DestroyImmediate(preview); } if (preview == null) { preview = Instantiate <GameObject>(previewPrefab); preview.transform.localScale = Vector3.one * poserScale.floatValue; preview.transform.parent = poser.transform; preview.transform.localPosition = Vector3.zero; preview.transform.localRotation = Quaternion.identity; SteamVR_Behaviour_Skeleton previewSkeleton = null; if (preview != null) { previewSkeleton = preview.GetComponent <SteamVR_Behaviour_Skeleton>(); } if (previewSkeleton != null) { if (handData.bonePositions == null || handData.bonePositions.Length == 0) { SteamVR_Skeleton_Pose poseResource = (SteamVR_Skeleton_Pose)Resources.Load("ReferencePose_OpenHand"); DeepCopyPose(poseResource, sourcePose); EditorUtility.SetDirty(sourcePose); } preview.transform.localPosition = Vector3.zero; preview.transform.localRotation = Quaternion.identity; preview.transform.parent = null; preview.transform.localScale = Vector3.one * poserScale.floatValue; preview.transform.parent = poser.transform; preview.transform.localRotation = Quaternion.Inverse(handData.rotation); preview.transform.position = preview.transform.TransformPoint(-handData.position); for (int boneIndex = 0; boneIndex < handData.bonePositions.Length; boneIndex++) { Transform bone = previewSkeleton.GetBone(boneIndex); bone.localPosition = handData.bonePositions[boneIndex]; bone.localRotation = handData.boneRotations[boneIndex]; } } SceneView.RepaintAll(); instanceProperty.objectReferenceValue = preview; } } else { if (preview != null) { DestroyImmediate(preview); SceneView.RepaintAll(); } } }
protected void DrawHand(bool showHand, SteamVR_Skeleton_Pose_Hand handData, SteamVR_Behaviour_Skeleton leftSkeleton, SteamVR_Behaviour_Skeleton rightSkeleton) { SteamVR_Behaviour_Skeleton thisSkeleton; SteamVR_Behaviour_Skeleton oppositeSkeleton; string thisSourceString; string oppositeSourceString; if (handData.inputSource == SteamVR_Input_Sources.LeftHand) { thisSkeleton = leftSkeleton; thisSourceString = "Left Hand"; oppositeSourceString = "Right Hand"; oppositeSkeleton = rightSkeleton; } else { thisSkeleton = rightSkeleton; thisSourceString = "Right Hand"; oppositeSourceString = "Left Hand"; oppositeSkeleton = leftSkeleton; } if (showHand) { bool save = GUILayout.Button(string.Format("Save {0}", thisSourceString)); if (save) { SaveHandData(handData, thisSkeleton); } bool getFromOpposite = GUILayout.Button(string.Format("Mirror {0} pose onto {1} skeleton", oppositeSourceString, thisSourceString)); if (getFromOpposite) { bool confirm = EditorUtility.DisplayDialog("SteamVR", string.Format("This will overwrite your current {0} skeleton data. (with data from the {1} skeleton)", thisSourceString, oppositeSourceString), "Overwrite", "Cancel"); if (confirm) { Vector3 reflectedPosition = new Vector3(-oppositeSkeleton.transform.localPosition.x, oppositeSkeleton.transform.localPosition.y, oppositeSkeleton.transform.localPosition.z); thisSkeleton.transform.localPosition = reflectedPosition; Quaternion oppositeRotation = oppositeSkeleton.transform.localRotation; Quaternion reflectedRotation = new Quaternion(-oppositeRotation.x, oppositeRotation.y, oppositeRotation.z, -oppositeRotation.w); thisSkeleton.transform.localRotation = reflectedRotation; handData.position = reflectedPosition; handData.rotation = reflectedRotation; handData.bonePositions = new Vector3[SteamVR_Action_Skeleton.numBones]; handData.boneRotations = new Quaternion[SteamVR_Action_Skeleton.numBones]; for (int boneIndex = 0; boneIndex < SteamVR_Action_Skeleton.numBones; boneIndex++) { Transform boneThis = thisSkeleton.GetBone(boneIndex); Transform boneOpposite = oppositeSkeleton.GetBone(boneIndex); boneThis.localPosition = boneOpposite.localPosition; boneThis.localRotation = boneOpposite.localRotation; handData.bonePositions[boneIndex] = boneThis.localPosition; handData.boneRotations[boneIndex] = boneThis.localRotation; } EditorUtility.SetDirty(poser.skeletonPose); } } GUILayout.BeginHorizontal(); GUILayout.Label("Force to reference pose"); GUILayout.FlexibleSpace(); forceToReferencePose = (EVRSkeletalReferencePose)EditorGUILayout.EnumPopup(forceToReferencePose); GUILayout.FlexibleSpace(); bool forcePose = GUILayout.Button("set"); GUILayout.EndHorizontal(); if (forcePose) { bool confirm = EditorUtility.DisplayDialog("SteamVR", string.Format("This will overwrite your current {0} skeleton data. (with data from the {1} reference pose)", thisSourceString, forceToReferencePose.ToString()), "Overwrite", "Cancel"); if (confirm) { thisSkeleton.ForceToReferencePose(forceToReferencePose); } } SteamVR_Skeleton_FingerExtensionTypes newThumb = (SteamVR_Skeleton_FingerExtensionTypes)EditorGUILayout.EnumPopup("Thumb movement", handData.thumbFingerMovementType); SteamVR_Skeleton_FingerExtensionTypes newIndex = (SteamVR_Skeleton_FingerExtensionTypes)EditorGUILayout.EnumPopup("Index movement", handData.indexFingerMovementType); SteamVR_Skeleton_FingerExtensionTypes newMiddle = (SteamVR_Skeleton_FingerExtensionTypes)EditorGUILayout.EnumPopup("Middle movement", handData.middleFingerMovementType); SteamVR_Skeleton_FingerExtensionTypes newRing = (SteamVR_Skeleton_FingerExtensionTypes)EditorGUILayout.EnumPopup("Ring movement", handData.ringFingerMovementType); SteamVR_Skeleton_FingerExtensionTypes newPinky = (SteamVR_Skeleton_FingerExtensionTypes)EditorGUILayout.EnumPopup("Pinky movement", handData.pinkyFingerMovementType); if (newThumb != handData.thumbFingerMovementType || newIndex != handData.indexFingerMovementType || newMiddle != handData.middleFingerMovementType || newRing != handData.ringFingerMovementType || newPinky != handData.pinkyFingerMovementType) { if ((int)newThumb >= 2 || (int)newIndex >= 2 || (int)newMiddle >= 2 || (int)newRing >= 2 || (int)newPinky >= 2) { Debug.LogError("<b>[SteamVR Input]</b> Unfortunately only Static and Free modes are supported in this beta."); return; } handData.thumbFingerMovementType = newThumb; handData.indexFingerMovementType = newIndex; handData.middleFingerMovementType = newMiddle; handData.ringFingerMovementType = newRing; handData.pinkyFingerMovementType = newPinky; EditorUtility.SetDirty(poser.skeletonPose); } } }