コード例 #1
0
        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);
        }
コード例 #2
0
            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]);
                    }
                }
            }
コード例 #3
0
    //----------------------------------------------

    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;
        }
    }
コード例 #4
0
    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();
        }
    }
コード例 #5
0
        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);
        }
コード例 #6
0
        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);
            }
        }
コード例 #8
0
        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();
                }
            }
        }
コード例 #9
0
        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);
            }
        }