You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			211 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			C#
		
	
		
		
			
		
	
	
			211 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			C#
		
	
| 
								 
											1 year ago
										 
									 | 
							
								#if UNITY_STANDALONE_WIN || UNITY_EDITOR
							 | 
						||
| 
								 | 
							
								using System.Collections;
							 | 
						||
| 
								 | 
							
								using System.Collections.Generic;
							 | 
						||
| 
								 | 
							
								using UnityEngine;
							 | 
						||
| 
								 | 
							
								using Valve.VR;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace Autohand.Demo {
							 | 
						||
| 
								 | 
							
								    [HelpURL("https://app.gitbook.com/s/5zKO0EvOjzUDeT2aiFk3/auto-hand/controller-input")]
							 | 
						||
| 
								 | 
							
								    public class IndexHandControllerLink : HandControllerLink {
							 | 
						||
| 
								 | 
							
								        
							 | 
						||
| 
								 | 
							
								        float GetFingerCurl(SteamVR_Skeleton_FingerIndexEnum finger) {
							 | 
						||
| 
								 | 
							
								            switch(finger){
							 | 
						||
| 
								 | 
							
								                case SteamVR_Skeleton_FingerIndexEnum.index:
							 | 
						||
| 
								 | 
							
								                    return skeletonAction.GetFingerCurl(finger)*indexMax;
							 | 
						||
| 
								 | 
							
								                case SteamVR_Skeleton_FingerIndexEnum.middle:
							 | 
						||
| 
								 | 
							
								                    return skeletonAction.GetFingerCurl(finger)*middleMax;
							 | 
						||
| 
								 | 
							
								                case SteamVR_Skeleton_FingerIndexEnum.ring:
							 | 
						||
| 
								 | 
							
								                    return skeletonAction.GetFingerCurl(finger)*ringMax;
							 | 
						||
| 
								 | 
							
								                case SteamVR_Skeleton_FingerIndexEnum.pinky:
							 | 
						||
| 
								 | 
							
								                    return skeletonAction.GetFingerCurl(finger)*pinkyMax;
							 | 
						||
| 
								 | 
							
								                case SteamVR_Skeleton_FingerIndexEnum.thumb:
							 | 
						||
| 
								 | 
							
								                    return skeletonAction.GetFingerCurl(finger)*thumbMax;
							 | 
						||
| 
								 | 
							
								            };
							 | 
						||
| 
								 | 
							
								            return skeletonAction.GetFingerCurl(finger);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        //YOU CAN INCREASE THE FINGER BEND SPEED BY INCREASING THE fingerSmoothSpeed VALUE ON EACH FINGER
							 | 
						||
| 
								 | 
							
								        //YOU CAN DISABLE FINGER SWAY BY TURNING SWAY STRENGTH ON HAND TO 0 OR DISABLEIK ENABLED
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        public SteamVR_Input_Sources handType;
							 | 
						||
| 
								 | 
							
								        public SteamVR_Action_Skeleton skeletonAction;
							 | 
						||
| 
								 | 
							
								        [Tooltip("Allows fingers to move while holding an object"), Space]
							 | 
						||
| 
								 | 
							
								        public bool freeFingers = true;
							 | 
						||
| 
								 | 
							
								        
							 | 
						||
| 
								 | 
							
								        [Header("Bend Fingers")]
							 | 
						||
| 
								 | 
							
								        public Finger thumb;
							 | 
						||
| 
								 | 
							
								        public Finger index;
							 | 
						||
| 
								 | 
							
								        public Finger middle;
							 | 
						||
| 
								 | 
							
								        public Finger ring;
							 | 
						||
| 
								 | 
							
								        public Finger pinky;
							 | 
						||
| 
								 | 
							
								        
							 | 
						||
| 
								 | 
							
								        public float thumbMax = 0.8f;
							 | 
						||
| 
								 | 
							
								        public float indexMax = 1;
							 | 
						||
| 
								 | 
							
								        public float middleMax = 1;
							 | 
						||
| 
								 | 
							
								        public float ringMax = 1;
							 | 
						||
| 
								 | 
							
								        public float pinkyMax = 1;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        [Space]
							 | 
						||
| 
								 | 
							
								        
							 | 
						||
| 
								 | 
							
								        [Header("Grab Finger Action")]
							 | 
						||
| 
								 | 
							
								        [Tooltip("The required fingers to be bent to the required finger bend to call the grab event, all of these fingers needs to be past the required bend value [Represents AND]")]
							 | 
						||
| 
								 | 
							
								        public SteamVRFingerBend[] grabFingersRequired;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        [Header("Grab Controller Action")]
							 | 
						||
| 
								 | 
							
								        public SteamVR_Action_Boolean grabAction;
							 | 
						||
| 
								 | 
							
								        
							 | 
						||
| 
								 | 
							
								        [Header("Squeeze Finger Action"), Space, Space, Space]
							 | 
						||
| 
								 | 
							
								        [Tooltip("The required fingers to be bent to the required finger bend to call the squeeze event, all of these fingers needs to be past the required bend value [Represents AND]")]
							 | 
						||
| 
								 | 
							
								        public SteamVRFingerBend[] squeezeFingersRequired;
							 | 
						||
| 
								 | 
							
								        
							 | 
						||
| 
								 | 
							
								        [Header("Squeeze Controller Axis")]
							 | 
						||
| 
								 | 
							
								        public SteamVR_Action_Single squeezeAction;
							 | 
						||
| 
								 | 
							
								        public float requiredSqueeze = 0.8f;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        bool grabbing;
							 | 
						||
| 
								 | 
							
								        bool squeezing;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        private void Start() {
							 | 
						||
| 
								 | 
							
								            if(hand.left)
							 | 
						||
| 
								 | 
							
								                handLeft = this;
							 | 
						||
| 
								 | 
							
								            else
							 | 
						||
| 
								 | 
							
								                handRight = this;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        public void FixedUpdate() {
							 | 
						||
| 
								 | 
							
								            if(hand.IsGrabbing())
							 | 
						||
| 
								 | 
							
								                return;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            bool grab = IsGrabbing();
							 | 
						||
| 
								 | 
							
								            if(!grabbing && grab) {
							 | 
						||
| 
								 | 
							
								                grabbing = true;
							 | 
						||
| 
								 | 
							
								                hand.Grab();
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            if(grabbing && !grab) {
							 | 
						||
| 
								 | 
							
								                grabbing = false;
							 | 
						||
| 
								 | 
							
								                hand.Release();
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            bool squeeze = IsSqueezing();
							 | 
						||
| 
								 | 
							
								            if(!squeezing && squeeze) {
							 | 
						||
| 
								 | 
							
								                squeezing = true;
							 | 
						||
| 
								 | 
							
								                hand.Squeeze();
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            if(squeezing && !squeeze) {
							 | 
						||
| 
								 | 
							
								                squeezing = false;
							 | 
						||
| 
								 | 
							
								                hand.Unsqueeze();
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            if(!hand.holdingObj && !hand.IsPosing()) {
							 | 
						||
| 
								 | 
							
								                thumb.secondaryOffset = GetFingerCurl(SteamVR_Skeleton_FingerIndexEnum.thumb);
							 | 
						||
| 
								 | 
							
								                index.secondaryOffset = GetFingerCurl(SteamVR_Skeleton_FingerIndexEnum.index);
							 | 
						||
| 
								 | 
							
								                middle.secondaryOffset = GetFingerCurl(SteamVR_Skeleton_FingerIndexEnum.middle);
							 | 
						||
| 
								 | 
							
								                ring.secondaryOffset = GetFingerCurl(SteamVR_Skeleton_FingerIndexEnum.ring);
							 | 
						||
| 
								 | 
							
								                pinky.secondaryOffset = GetFingerCurl(SteamVR_Skeleton_FingerIndexEnum.pinky);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                thumb.UpdateFinger();
							 | 
						||
| 
								 | 
							
								                index.UpdateFinger();
							 | 
						||
| 
								 | 
							
								                middle.UpdateFinger();
							 | 
						||
| 
								 | 
							
								                ring.UpdateFinger();
							 | 
						||
| 
								 | 
							
								                pinky.UpdateFinger();
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            else if(freeFingers && !hand.IsPosing()) {
							 | 
						||
| 
								 | 
							
								                foreach(var finger in hand.fingers)
							 | 
						||
| 
								 | 
							
								                    finger.SetFingerBend(0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                thumb.secondaryOffset = thumb.GetLastHitBend();
							 | 
						||
| 
								 | 
							
								                index.secondaryOffset = index.GetLastHitBend();
							 | 
						||
| 
								 | 
							
								                middle.secondaryOffset = middle.GetLastHitBend();
							 | 
						||
| 
								 | 
							
								                ring.secondaryOffset = ring.GetLastHitBend();
							 | 
						||
| 
								 | 
							
								                pinky.secondaryOffset = pinky.GetLastHitBend();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                if(GetFingerCurl(SteamVR_Skeleton_FingerIndexEnum.thumb) < thumb.GetLastHitBend())
							 | 
						||
| 
								 | 
							
								                    thumb.secondaryOffset = GetFingerCurl(SteamVR_Skeleton_FingerIndexEnum.thumb);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                if(GetFingerCurl(SteamVR_Skeleton_FingerIndexEnum.index) < index.GetLastHitBend())
							 | 
						||
| 
								 | 
							
								                    index.secondaryOffset = GetFingerCurl(SteamVR_Skeleton_FingerIndexEnum.index);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                if(GetFingerCurl(SteamVR_Skeleton_FingerIndexEnum.middle) < middle.GetLastHitBend())
							 | 
						||
| 
								 | 
							
								                    middle.secondaryOffset = GetFingerCurl(SteamVR_Skeleton_FingerIndexEnum.middle);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                if(GetFingerCurl(SteamVR_Skeleton_FingerIndexEnum.ring) < ring.GetLastHitBend())
							 | 
						||
| 
								 | 
							
								                    ring.secondaryOffset = GetFingerCurl(SteamVR_Skeleton_FingerIndexEnum.ring);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                if(GetFingerCurl(SteamVR_Skeleton_FingerIndexEnum.pinky) < pinky.GetLastHitBend())
							 | 
						||
| 
								 | 
							
								                    pinky.secondaryOffset = GetFingerCurl(SteamVR_Skeleton_FingerIndexEnum.pinky);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                thumb.UpdateFinger();
							 | 
						||
| 
								 | 
							
								                index.UpdateFinger();
							 | 
						||
| 
								 | 
							
								                middle.UpdateFinger();
							 | 
						||
| 
								 | 
							
								                ring.UpdateFinger();
							 | 
						||
| 
								 | 
							
								                pinky.UpdateFinger();
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            hand.SetGrip((thumb.secondaryOffset + index.secondaryOffset + middle.secondaryOffset + ring.secondaryOffset + pinky.secondaryOffset) / 5f, (thumb.secondaryOffset + index.secondaryOffset + middle.secondaryOffset + ring.secondaryOffset + pinky.secondaryOffset) / 5f);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        public bool IsGrabbing(){
							 | 
						||
| 
								 | 
							
								            bool requiredFingers = true;
							 | 
						||
| 
								 | 
							
								            
							 | 
						||
| 
								 | 
							
								            if(grabFingersRequired.Length == 0)
							 | 
						||
| 
								 | 
							
								                requiredFingers = false;
							 | 
						||
| 
								 | 
							
								            else
							 | 
						||
| 
								 | 
							
								                for (int i = 0; i < grabFingersRequired.Length; i++){
							 | 
						||
| 
								 | 
							
								                    if(GetFingerCurl(grabFingersRequired[i].finger) < grabFingersRequired[i].amount){
							 | 
						||
| 
								 | 
							
								                        requiredFingers = false;
							 | 
						||
| 
								 | 
							
								                    }
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            if(grabAction != null && grabAction.GetState(handType)){
							 | 
						||
| 
								 | 
							
								                requiredFingers = true;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            
							 | 
						||
| 
								 | 
							
								            return requiredFingers;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        public bool IsSqueezing(){
							 | 
						||
| 
								 | 
							
								            bool requiredFingers = true;
							 | 
						||
| 
								 | 
							
								            
							 | 
						||
| 
								 | 
							
								            if(squeezeFingersRequired.Length == 0)
							 | 
						||
| 
								 | 
							
								                requiredFingers = false;
							 | 
						||
| 
								 | 
							
								            else
							 | 
						||
| 
								 | 
							
								                for (int i = 0; i < squeezeFingersRequired.Length; i++){
							 | 
						||
| 
								 | 
							
								                    if (GetFingerCurl(squeezeFingersRequired[i].finger) < squeezeFingersRequired[i].amount){
							 | 
						||
| 
								 | 
							
								                        requiredFingers = false;
							 | 
						||
| 
								 | 
							
								                    }
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            if(squeezeAction != null && squeezeAction.GetAxis(handType) > requiredSqueeze){
							 | 
						||
| 
								 | 
							
								                requiredFingers = true;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            return requiredFingers;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        public override void TryHapticImpulse(float duration, float amp, float freq) {
							 | 
						||
| 
								 | 
							
								            //SteamVR_Actions.default_Haptic[handType].Execute(0, duration, freq, amp);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    [System.Serializable]
							 | 
						||
| 
								 | 
							
								    public struct SteamVRFingerBend {
							 | 
						||
| 
								 | 
							
								        public float amount;
							 | 
						||
| 
								 | 
							
								        public SteamVR_Skeleton_FingerIndexEnum finger;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								#endif
							 |