void CopyHand(SteamVR_Skeleton_Pose pose, SteamVR_Skeleton_Pose_Hand source, SteamVR_Skeleton_Pose_Hand dest) { int boneNum = SteamVR_Action_Skeleton.numBones; if (dest.bonePositions == null) { dest.bonePositions = new Vector3[boneNum]; } if (dest.boneRotations == null) { dest.boneRotations = new Quaternion[boneNum]; } dest.position = new Vector3(-source.position.x, source.position.y, source.position.z); dest.rotation = new Quaternion(-source.rotation.x, source.rotation.y, source.rotation.z, -source.rotation.w); for (int boneIndex = 0; boneIndex < SteamVR_Action_Skeleton.numBones; boneIndex++) { dest.bonePositions[boneIndex] = source.bonePositions[boneIndex]; dest.boneRotations[boneIndex] = source.boneRotations[boneIndex]; // EditorUtility.DisplayProgressBar("Copying...", "Copying right hand pose", (float)boneIndex / (float)boneNum / 2f); } dest.thumbFingerMovementType = source.thumbFingerMovementType; dest.indexFingerMovementType = source.indexFingerMovementType; dest.middleFingerMovementType = source.middleFingerMovementType; dest.ringFingerMovementType = source.ringFingerMovementType; dest.pinkyFingerMovementType = source.pinkyFingerMovementType; //set ours dirty EditorUtility.SetDirty(pose); }
public void UpdateAdditiveAnimation(SteamVR_Action_Skeleton skeletonAction, HandType 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++) { // if ((boneIndex == 1) || (boneIndex == 0)) // continue; int fingerIndex = SteamVR_Skeleton_JointIndexes.GetFingerForBone(boneIndex); SteamVR_Skeleton_FingerExtensionTypes extensionType = poseHand.GetMovementTypeForBone(boneIndex); //do target pose mirroring on left hand if (inputSource == HandType.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]); } } }
//---------------------------------------------- public void ButtonPressDown(SteamVR_Skeleton_Pose_Hand controller)//(EVRButtonId button, VRControllerInput controller) { //If button pressed is desired "trigger" button if (isclickGrab()) { //controllerTransform = controller.gameObject.transform; controllerTransform.position = controller.position; controllerTransform.rotation = controller.rotation; } }
public void ButtonPressUp(SteamVR_Skeleton_Pose_Hand controller)//(EVRButtonId button, VRControllerInput controller) { //If button pressed is desired "trigger" button if (isclickGrab()) { controllerTransform = null; //Attempt to snap lever into a slot SnapToPosition(); } }
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 = thisSkeleton.transform.localRotation;// 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); }
protected void SaveHandData(SteamVR_Skeleton_Pose_Hand handData, SteamVR_Behaviour_Skeleton hand) { // handData.position = hand.transform.InverseTransformPoint(baker.transform.position); handData.position = hand.transform.localPosition; handData.rotation = hand.transform.localRotation;// Quaternion.Inverse(hand.transform.localRotation); handData.bonePositions = new Vector3[SteamVR_Action_Skeleton.numBones]; handData.boneRotations = new Quaternion[SteamVR_Action_Skeleton.numBones]; for (int i = 0; i < SteamVR_Action_Skeleton.numBones; i++) { Transform bone = hand.GetBone(i); handData.bonePositions[i] = bone.localPosition; handData.boneRotations[i] = bone.localRotation; } // EditorUtility.SetDirty(activePose); }
protected void DrawHand(SteamVR_Skeleton_Pose_Hand handData, SteamVR_Skeleton_Pose_Hand otherData) //, bool getFromOpposite) { EditorGUIUtility.labelWidth = 120; SteamVR_Skeleton_FingerExtensionTypes newThumb = (SteamVR_Skeleton_FingerExtensionTypes)EditorGUILayout.EnumPopup("Thumb", handData.thumbFingerMovementType); SteamVR_Skeleton_FingerExtensionTypes newIndex = (SteamVR_Skeleton_FingerExtensionTypes)EditorGUILayout.EnumPopup("Index", handData.indexFingerMovementType); SteamVR_Skeleton_FingerExtensionTypes newMiddle = (SteamVR_Skeleton_FingerExtensionTypes)EditorGUILayout.EnumPopup("Middle", handData.middleFingerMovementType); SteamVR_Skeleton_FingerExtensionTypes newRing = (SteamVR_Skeleton_FingerExtensionTypes)EditorGUILayout.EnumPopup("Ring", handData.ringFingerMovementType); SteamVR_Skeleton_FingerExtensionTypes newPinky = (SteamVR_Skeleton_FingerExtensionTypes)EditorGUILayout.EnumPopup("Pinky", handData.pinkyFingerMovementType); EditorGUIUtility.labelWidth = 0; if (newThumb != handData.thumbFingerMovementType || newIndex != handData.indexFingerMovementType || newMiddle != handData.middleFingerMovementType || newRing != handData.ringFingerMovementType || newPinky != handData.pinkyFingerMovementType) { handData.thumbFingerMovementType = newThumb; handData.indexFingerMovementType = newIndex; handData.middleFingerMovementType = newMiddle; handData.ringFingerMovementType = newRing; handData.pinkyFingerMovementType = newPinky; EditorUtility.SetDirty(poserBehavior);//.skeletonMainPose); } }
protected void UpdatePreviewHand(ref GameObject preview, ref bool showPreview, string assetName, SteamVR_Skeleton_Pose_Hand handData, SteamVR_Skeleton_Pose sourcePose, bool forceUpdate) { if (showPreview) { if (forceUpdate && preview != null) { DestroyImmediate(preview); } if (preview == null) { GameObject prefabProperty = null; string[] defPaths = AssetDatabase.FindAssets(string.Format("t:Prefab {0}", assetName)); if (defPaths != null && defPaths.Length > 0) { string guid = defPaths[0]; string path = AssetDatabase.GUIDToAssetPath(guid); prefabProperty = AssetDatabase.LoadAssetAtPath <GameObject>(path); if (prefabProperty == null) { Debug.LogError("[SteamVR] Could not load prefab: " + assetName + ". Found path: " + path); } } else { Debug.LogError("[SteamVR] Could not load prefab: " + assetName); } preview = GameObject.Instantiate(prefabProperty); 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 = handData.rotation; preview.transform.localPosition = 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(); } } else { if (preview != null) { DestroyImmediate(preview); SceneView.RepaintAll(); } } }
protected void DrawHand(bool showHand, SteamVR_Skeleton_Pose_Hand handData, SteamVR_Skeleton_Pose_Hand otherData, bool getFromOpposite) { 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) { 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; 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.thumbFingerMovementType = otherData.thumbFingerMovementType; handData.indexFingerMovementType = otherData.indexFingerMovementType; handData.middleFingerMovementType = otherData.middleFingerMovementType; handData.ringFingerMovementType = otherData.ringFingerMovementType; handData.pinkyFingerMovementType = otherData.pinkyFingerMovementType; EditorUtility.SetDirty(poser.behavior);//.skeletonMainPose); } } } EditorGUIUtility.labelWidth = 120; 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); EditorGUIUtility.labelWidth = 0; 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.behavior);//.skeletonMainPose); } }