Example #1
0
        private void Update()
        {
            if (!HandsManager.Instance || !HandsManager.Instance.IsInitialized() || !_isInitialized || _capsuleToTrack == null)
            {
                return;
            }

            OVRHand hand         = IsRightHandedTool ? HandsManager.Instance.RightHand : HandsManager.Instance.LeftHand;
            float   currentScale = hand.HandScale;
            // push tool into the tip based on how wide it is. so negate the direction
            Transform capsuleTransform = _capsuleToTrack.CapsuleCollider.transform;
            Vector3   capsuleDirection = capsuleTransform.right;
            Vector3   trackedPosition  = capsuleTransform.position + _capsuleToTrack.CapsuleCollider.height * 0.5f
                                         * capsuleDirection;
            Vector3 sphereRadiusOffset = currentScale * _fingerTipPokeToolView.SphereRadius *
                                         capsuleDirection;
            // push tool back so that it's centered on transform/bone
            Vector3 toolPosition = trackedPosition + sphereRadiusOffset;

            transform.position  = toolPosition;
            transform.rotation  = capsuleTransform.rotation;
            InteractionPosition = trackedPosition;

            UpdateAverageVelocity();

            CheckAndUpdateScale();
        }
Example #2
0
        protected void UpdateHandData(OVRHand ovrHand, OVRSkeleton ovrSkeleton)
        {
            if (ovrSkeleton != null)
            {
                var bones = ovrSkeleton.Bones;
                foreach (var bone in bones)
                {
                    UpdateBone(bone);
                }

                UpdatePalm();
            }

            CoreServices.InputSystem?.RaiseHandJointsUpdated(InputSource, ControllerHandedness, jointPoses);


            if (IsPinching)
            {
                // If we are already pinching, we make the pinch a bit sticky
                IsPinching = ovrHand.GetFingerPinchStrength(OVRHand.HandFinger.Index) > 0.85f;
            }
            else
            {
                // If not yet pinching, only consider pinching if finger confidence is high
                IsPinching = ovrHand.GetFingerIsPinching(OVRHand.HandFinger.Index) &&
                             ovrHand.GetFingerConfidence(OVRHand.HandFinger.Index) == OVRHand.TrackingConfidence.High;
            }
        }
        public override void Enable()
        {
            base.Enable();

            var ovrCameraRig = GameObject.FindObjectOfType <OVRCameraRig>();
            var ovrHands     = ovrCameraRig.GetComponentsInChildren <OVRHand>();

            foreach (var ovrHand in ovrHands)
            {
                var skeltonDataProvider = ovrHand as OVRSkeleton.IOVRSkeletonDataProvider;
                var skeltonType         = skeltonDataProvider.GetSkeletonType();

                var ovrSkelton = ovrHand.GetComponent <OVRSkeleton>();
                if (ovrSkelton == null)
                {
                    continue;
                }

                switch (skeltonType)
                {
                case OVRSkeleton.SkeletonType.HandLeft:
                    leftHand     = ovrHand;
                    leftSkeleton = ovrSkelton;
                    break;

                case OVRSkeleton.SkeletonType.HandRight:
                    rightHand     = ovrHand;
                    rightSkeleton = ovrSkelton;
                    break;
                }
            }
        }
        public OculusQuestArticulatedHand(
            TrackingState trackingState,
            Handedness controllerHandedness,
            IMixedRealityInputSource inputSource          = null,
            MixedRealityInteractionMapping[] interactions = null) : base(trackingState, controllerHandedness, inputSource, interactions)
        {
            var rigs  = GameObject.FindObjectOfType <OVRCameraRig>();
            var hands = rigs.GetComponentsInChildren <OVRHand>();

            foreach (var item in hands)
            {
                switch (((OVRSkeleton.IOVRSkeletonDataProvider)item).GetSkeletonType())
                {
                case OVRSkeleton.SkeletonType.HandLeft:
                    if (controllerHandedness == Handedness.Left)
                    {
                        hand     = item;
                        skeleton = item?.GetComponent <OVRSkeleton>();
                    }
                    break;

                case OVRSkeleton.SkeletonType.HandRight:
                    if (controllerHandedness == Handedness.Right)
                    {
                        hand     = item;
                        skeleton = item?.GetComponent <OVRSkeleton>();
                    }
                    break;
                }
            }

            //var anchor = GameObject.Find((controllerHandedness == Handedness.Left) ? "LeftHandAnchor" : "RightHandAnchor");
            //hand = anchor?.GetComponentInChildren<OVRHand>();
            //skeleton = anchor?.GetComponentInChildren<OVRSkeleton>();
        }
Example #5
0
        private void SetupInput()
        {
            cameraRig = GameObject.FindObjectOfType <OVRCameraRig>();
            if (cameraRig == null)
            {
                var       mainCamera   = Camera.main;
                Transform cameraParent = null;
                if (mainCamera != null)
                {
                    cameraParent = mainCamera.transform.parent;

                    // Destroy main camera
                    GameObject.Destroy(cameraParent.gameObject);
                }

                // Instantiate camera rig as a child of the MixedRealityPlayspace
                cameraRig = GameObject.Instantiate(MRTKOculusConfig.Instance.OVRCameraRigPrefab);
            }

            bool useAvatarHands = MRTKOculusConfig.Instance.RenderAvatarHandsInsteadOfController;

            // If using Avatar hands, de-activate ovr controller rendering
            foreach (var controllerHelper in cameraRig.gameObject.GetComponentsInChildren <OVRControllerHelper>())
            {
                controllerHelper.gameObject.SetActive(!useAvatarHands);
            }

            if (useAvatarHands)
            {
                // Initialize the local avatar controller
                GameObject.Instantiate(MRTKOculusConfig.Instance.LocalAvatarPrefab, cameraRig.trackingSpace);
            }

            var ovrHands = cameraRig.GetComponentsInChildren <OVRHand>();

            foreach (var ovrHand in ovrHands)
            {
                var skeltonDataProvider = ovrHand as OVRSkeleton.IOVRSkeletonDataProvider;
                var skeltonType         = skeltonDataProvider.GetSkeletonType();

                var ovrSkelton = ovrHand.GetComponent <OVRSkeleton>();
                if (ovrSkelton == null)
                {
                    continue;
                }

                switch (skeltonType)
                {
                case OVRSkeleton.SkeletonType.HandLeft:
                    leftHand     = ovrHand;
                    leftSkeleton = ovrSkelton;
                    break;

                case OVRSkeleton.SkeletonType.HandRight:
                    rightHand     = ovrHand;
                    rightSkeleton = ovrSkelton;
                    break;
                }
            }
        }
Example #6
0
        private OculusHand GetOrAddHand(Handedness handedness, OVRHand ovrHand)
        {
            if (trackedHands.ContainsKey(handedness))
            {
                return(trackedHands[handedness]);
            }

            // Add new hand
            var pointers        = RequestPointers(SupportedControllerType.ArticulatedHand, handedness);
            var inputSourceType = InputSourceType.Hand;

            IMixedRealityInputSystem inputSystem = Service as IMixedRealityInputSystem;
            var inputSource = inputSystem?.RequestNewGenericInputSource($"Oculus Quest {handedness} Hand", pointers, inputSourceType);


            OculusHand handController = new OculusHand(TrackingState.Tracked, handedness, inputSource);

            handController.InitializeHand(ovrHand, MRTKOculusConfig.Instance.CustomHandMaterial);

            for (int i = 0; i < handController.InputSource?.Pointers?.Length; i++)
            {
                handController.InputSource.Pointers[i].Controller = handController;
                handController.UpdateHandMaterial(MRTKOculusConfig.Instance.CustomHandMaterial);
            }

            inputSystem?.RaiseSourceDetected(handController.InputSource, handController);

            trackedHands.Add(handedness, handController);

            return(handController);
        }
    internal void SetHand(string hand)
    {
        switch (hand.ToLower())
        {
        case "left":
            if (rightGrabber != null && leftGrabber != null)
            {
                rightGrabber.enabled = false;
                leftGrabber.enabled  = true;
            }
            whichHand = OVRPlugin.Hand.HandLeft;
            m_Hand    = m_LeftHand;
            break;

        case "right":
            if (rightGrabber != null && leftGrabber != null)
            {
                leftGrabber.enabled  = false;
                rightGrabber.enabled = true;
            }
            whichHand = OVRPlugin.Hand.HandRight;
            m_Hand    = m_RightHand;
            break;

        default:
            MainController.PrintToLog("Hand wasn't set correctly.", MainController.LogType.Error);
            SetHand("Right");
            break;
        }
    }
Example #8
0
 private bool IsNeutral(OVRHand hand, OVRSkeleton handSkeleton)
 {
     return(!hand.GetFingerIsPinching(OVRHand.HandFinger.Index) &&
            !hand.GetFingerIsPinching(OVRHand.HandFinger.Middle) &&
            !IsFistClosed(handSkeleton) &&
            !IsPalmFlatWhileThumbIsUp(handSkeleton));
 }
        private OculusHand GetOrAddHand(Handedness handedness, OVRHand ovrHand)
        {
            if (trackedHands.ContainsKey(handedness))
            {
                return(trackedHands[handedness]);
            }

            // Add new hand
            var pointers        = RequestPointers(SupportedControllerType.ArticulatedHand, handedness);
            var inputSourceType = InputSourceType.Hand;

            var inputSource = Service?.RequestNewGenericInputSource($"Oculus Quest {handedness} Hand", pointers, inputSourceType);


            OculusHand handDevice = new OculusHand(TrackingState.Tracked, handedness, inputSource);

            handDevice.InitializeHand(ovrHand, SettingsProfile);

            for (int i = 0; i < handDevice.InputSource?.Pointers?.Length; i++)
            {
                handDevice.InputSource.Pointers[i].Controller = handDevice;
            }

            Service?.RaiseSourceDetected(handDevice.InputSource, handDevice);

            trackedHands.Add(handedness, handDevice);

            return(handDevice);
        }
Example #10
0
 public void InjectInteractionOVRCameraRig(InteractionOVRCameraRig ovrCameraRig)
 {
     _ovrCameraRig = ovrCameraRig;
     // Clear the cached values to force new values to be read on next access
     _leftHand  = null;
     _rightHand = null;
 }
 // Start is called before the first frame update
 protected override void Start()
 {
     base.Start();
     hand = GetComponent <OVRHand>();
     ske  = GetComponent <OVRSkeleton>();
     //ske.Freeze = false;
 }
Example #12
0
        public void UpdateState(OVRHand hand, Interactable currFocusedInteractable)
        {
            float pinchStrength = hand.GetFingerPinchStrength(OVRHand.HandFinger.Index);
            bool  isPinching    = Mathf.Abs(PINCH_STRENGTH_THRESHOLD - pinchStrength) < Mathf.Epsilon;
            var   oldPinchState = _currPinchState;

            switch (oldPinchState)
            {
            case PinchState.PinchUp:
                // can only be in pinch up for a single frame, so consider
                // next frame carefully
                if (isPinching)
                {
                    _currPinchState = PinchState.PinchDown;
                    if (currFocusedInteractable != _firstFocusedInteractable)
                    {
                        _firstFocusedInteractable = null;
                    }
                }
                else
                {
                    _currPinchState           = PinchState.None;
                    _firstFocusedInteractable = null;
                }
                break;

            case PinchState.PinchStay:
                if (!isPinching)
                {
                    _currPinchState = PinchState.PinchUp;
                }
                // if object is not focused anymore, then forget it
                if (currFocusedInteractable != _firstFocusedInteractable)
                {
                    _firstFocusedInteractable = null;
                }
                break;

            // pinch down lasts for a max of 1 frame. either go to pinch stay or up
            case PinchState.PinchDown:
                _currPinchState = isPinching ? PinchState.PinchStay : PinchState.PinchUp;
                // if the focused interactable changes, then the original one is now invalid
                if (_firstFocusedInteractable != currFocusedInteractable)
                {
                    _firstFocusedInteractable = null;
                }
                break;

            default:
                if (isPinching)
                {
                    _currPinchState = PinchState.PinchDown;
                    // this is the interactable that must be focused through out the pinch up and down
                    // gesture.
                    _firstFocusedInteractable = currFocusedInteractable;
                }
                break;
            }
        }
Example #13
0
        public void InitializeHand(OVRHand ovrHand, OculusXRSDKDeviceManagerProfile deviceManagerSettings)
        {
            settingsProfile = deviceManagerSettings;

            handRenderer = ovrHand.GetComponent <Renderer>();
            UpdateHandMaterial(settingsProfile.CustomHandMaterial);
            pinchStrengthProp = Shader.PropertyToID(settingsProfile.PinchStrengthMaterialProperty);
        }
Example #14
0
    void OnTriggerExit(Collider other)
    {
        OVRHand hand = other.GetComponent <OVRHand>();

        if (hand != null)
        {
            currHandCount--;
        }
    }
Example #15
0
    GestureSO CheckRecognition(OVRSkeleton skeleton, List <OVRBone> fingerBones, OVRHand hand)
    {
        if (fingerBones.Count == 0)
        {
            return(null);
        }
        if (!hand.IsTracked)
        {
            return(null);
        }
        if (!hand.IsDataHighConfidence && waitForHighConfidenceData)
        {
            return(null);
        }

        // fist gesture
        float sumDistance = 0;
        bool  isDiscarded = false;

        for (int i = 0; i < fingerBones.Count; i++)
        {
            Vector3 currentData = skeleton.transform.InverseTransformPoint(fingerBones[i].Transform.position);
            float   distance    = Vector3.Distance(fistGesture.fingerPositions[i], currentData);
            if (distance > recognitionThreshold)
            {
                isDiscarded = true;
                break;
            }
            sumDistance = distance;
        }
        if (!isDiscarded)
        {
            return(fistGesture);
        }

        // palm gesture
        sumDistance = 0;
        isDiscarded = false;
        for (int i = 0; i < fingerBones.Count; i++)
        {
            Vector3 currentData = skeleton.transform.InverseTransformPoint(fingerBones[i].Transform.position);
            float   distance    = Vector3.Distance(palmGesture.fingerPositions[i], currentData);
            if (distance > recognitionThreshold)
            {
                isDiscarded = true;
                break;
            }
            sumDistance = distance;
        }
        if (!isDiscarded)
        {
            return(palmGesture);
        }

        return(null);
    }
Example #16
0
    void OnTriggerEnter(Collider other)
    {
        OVRHand hand = other.GetComponent <OVRHand>();

        if (hand != null)
        {
            currHandCount++;
        }
        lastScaleDelta = -1;
    }
Example #17
0
    // Start is called before the first frame update
    void Start()
    {
        skeleton = this.GetComponent <OVRSkeleton>();
        hand     = this.GetComponent <OVRHand>();

        foreach (var bone in skeleton.Bones)
        {
            Debug.Log(bone.Id);
        }
    }
Example #18
0
        private void Awake()
        {
            controllerHand = GetComponent <SkeletalControllerHand>();
            handAnimator   = GetComponent <Animator>();

            hand     = controllerTransform.GetComponentInChildren <OVRHand>();
            skeleton = hand.GetComponent <OVRSkeleton>();

            GetControllerHashes();
        }
Example #19
0
        private void Awake()
        {
            _rightRaycastViz = transform.GetChild(0).GetComponent <LineRenderer>();
            _leftRaycastViz  = transform.GetChild(1).GetComponent <LineRenderer>();
            _rightHand       = RightMarker.Instance.transform;
            _leftHand        = LeftMarker.Instance.transform;
            _rightHandPoser  = _rightHand.GetComponentInChildren <OVRHand>();
            _leftHandPoser   = _leftHand.GetComponentInChildren <OVRHand>();

            _input = AtomicInput.Instance;
        }
Example #20
0
    // Start is called before the first frame update
    void Start()
    {
        l_hand   = GetComponent <OVRHand>();
        l_finger = GetComponent <OVRSkeleton>();
        r_finger = r_hand.GetComponent <OVRSkeleton>();
        r_isIndexFingerPinching = r_hand.GetFingerIsPinching(OVRHand.HandFinger.Index);
        l_isIndexFingerPinching = l_hand.GetFingerIsPinching(OVRHand.HandFinger.Index);

        initial_position = item.transform.position;
        inkRenderer      = ink.GetComponent <Renderer>();
    }
 protected void UpdateHand(OVRHand ovrHand, OVRSkeleton ovrSkeleton, Handedness handedness)
 {
     if (ovrHand.IsTracked)
     {
         var hand = GetOrAddHand(handedness, ovrHand);
         hand.UpdateController(ovrHand, ovrSkeleton, cameraRig.trackingSpace);
     }
     else
     {
         RemoveHandDevice(handedness);
     }
 }
 private void Awake()
 {
     _input = AtomicInput.Instance;
     right  = transform.name.Contains("Right");
     _hand  = (right)
         ? RightMarker.Instance.GetComponentInChildren <OVRHand>()
         : LeftMarker.Instance.GetComponentInChildren <OVRHand>();
     _skeleton = (right)
         ? RightMarker.Instance.GetComponentInChildren <OVRSkeleton>()
         : LeftMarker.Instance.GetComponentInChildren <OVRSkeleton>();
     vRenderer = GetComponent <MeshRenderer>();
 }
        /// <summary>
        /// Get a float value the finger pinch strength based on the abstract input button
        /// </summary>
        /// <param name="h">Which hand is the axis on</param>
        /// <param name="b">Which button is being pressed</param>
        /// <returns>A float from 0-1 indicating how much the input has been pressed</returns>
        public override float GetAxis(Hand h, Button b)
        {
            GameObject handObj = (h == Hand.Left) ? leftHand : rightHand;
            OVRHand    hand    = handObj.GetComponent <OVRHand>();
            HandFinger finger  = FingerMap(b);

            if (hand && hand.GetFingerConfidence(finger) == TrackingConfidence.High)
            {
                return(hand.GetFingerPinchStrength(finger));
            }

            return(0f);
        }
 public OVRHandReflection(OVRHand hand)
 {
     Hand                      = hand;
     PointerPoseGo             = typeof(OVRHand).CreateFieldAccess <OVRHand, GameObject>(Hand, "_pointerPoseGO");
     PointerPose               = typeof(OVRHand).CreateFieldAccess <OVRHand, Transform>(Hand, "PointerPose", true);
     IsInitialized             = typeof(OVRHand).CreateFieldAccess <OVRHand, bool>(Hand, "_isInitialized");
     IsTracked                 = typeof(OVRHand).CreateFieldAccess <OVRHand, bool>(Hand, "IsTracked", true);
     IsSystemGestureInProgress = typeof(OVRHand).CreateFieldAccess <OVRHand, bool>(Hand, "IsSystemGestureInProgress", true);
     IsPointerPoseValid        = typeof(OVRHand).CreateFieldAccess <OVRHand, bool>(Hand, "IsPointerPoseValid", true);
     HandScale                 = typeof(OVRHand).CreateFieldAccess <OVRHand, float>(Hand, "HandScale", true);
     HandConfidence            = typeof(OVRHand).CreateFieldAccess <OVRHand, OVRHand.TrackingConfidence>(Hand, "HandConfidence", true);
     HandState                 = typeof(OVRHand).CreateFieldAccess <OVRHand, OVRPlugin.HandState>(Hand, "_handState");
 }
        /// <summary>
        /// Get whether the correct finger has been pinched based on the abstract input button
        /// </summary>
        /// <param name="h">Which hand is the button on</param>
        /// <param name="b">Which button is being pressed</param>
        /// <returns>A bool indicating whether the given button has been pressed</returns>
        public override bool GetButton(Hand h, Button b)
        {
            var        handObj = (h == Hand.Left) ? leftHand : rightHand;
            OVRHand    hand    = handObj.ActualOvrHand;
            HandFinger finger  = FingerMap(b);

            if (hand && hand.GetFingerConfidence(finger) == TrackingConfidence.High)
            {
                return(hand.GetFingerIsPinching(finger));
            }

            return(false); //null check for hand
        }
        /// <summary>
        /// Get a float value the finger pinch strength based on the abstract input button
        /// </summary>
        /// <param name="h">Which hand is the axis on</param>
        /// <param name="b">Which button is being pressed</param>
        /// <returns>A float from 0-1 indicating how much the input has been pressed</returns>
        public override float GetAxis(Hand h, Button b)
        {
            var        handObj = (h == Hand.Left) ? leftHand : rightHand;
            OVRHand    hand    = handObj.ActualOvrHand;
            HandFinger finger  = FingerMap(b);

            if (hand && hand.GetFingerConfidence(finger) == TrackingConfidence.High)
            {
                return(hand.GetFingerPinchStrength(finger));
            }

            return(0f);
        }
Example #27
0
        private OculusQuestHand GetOrAddHand(Handedness handedness, OVRHand ovrHand)
        {
            if (trackedHands.ContainsKey(handedness))
            {
                return(trackedHands[handedness]);
            }

            Material handMaterial = null;

            if (handedness == Handedness.Right)
            {
                if (rightHandMaterial == null)
                {
                    rightHandMaterial = new Material(MRTKOculusConfig.Instance.CustomHandMaterial);
                }
                handMaterial = rightHandMaterial;
            }
            else
            {
                if (leftHandMaterial == null)
                {
                    leftHandMaterial = new Material(MRTKOculusConfig.Instance.CustomHandMaterial);
                }
                handMaterial = leftHandMaterial;
            }

            // Add new hand
            var pointers        = RequestPointers(SupportedControllerType.ArticulatedHand, handedness);
            var inputSourceType = InputSourceType.Hand;

            IMixedRealityInputSystem inputSystem = Service as IMixedRealityInputSystem;
            var inputSource = inputSystem?.RequestNewGenericInputSource($"Oculus Quest {handedness} Hand", pointers, inputSourceType);

            var controller = new OculusQuestHand(TrackingState.Tracked, handedness, ovrHand, handMaterial, inputSource);

            // Code is obsolete later on, but older MRTK versions require it.
#pragma warning disable 618
            controller.SetupConfiguration(typeof(OculusQuestHand));
#pragma warning restore 618

            for (int i = 0; i < controller.InputSource?.Pointers?.Length; i++)
            {
                controller.InputSource.Pointers[i].Controller = controller;
            }

            inputSystem?.RaiseSourceDetected(controller.InputSource, controller);

            trackedHands.Add(handedness, controller);

            return(controller);
        }
Example #28
0
        private void Awake()
        {
            if (!gameObject.activeInHierarchy)
            {
                return;
            }
            _rightColliders = transform.GetChild(0).GetComponentsInChildren <Collider>();
            _leftColliders  = transform.GetChild(1).GetComponentsInChildren <Collider>();

            _input = AtomicInput.Instance;

            _rightStartingPointRenderer = rightStartingPoint.GetComponentsInChildren <MeshRenderer>();

            if (rightCurrentPositionMarker == null)
            {
                Debug.LogError("The TranslationToolController couldn't locate its right position marker. Please assign it in Inspector.");
            }
            else
            {
                _rightCurrentPositionRenderer = rightCurrentPositionMarker.GetComponent <MeshRenderer>();
            }

            rightLineRenderer = transform.GetComponentInChildren <LineRenderer>();

            _leftStartingPointRenderer = leftStartingPoint.GetComponentsInChildren <MeshRenderer>();

            if (leftCurrentPositionMarker == null)
            {
                Debug.LogError("The TranslationToolController couldn't locate its left position marker. Please assign it in Inspector.");
            }
            else
            {
                _leftCurrentPositionRenderer = leftCurrentPositionMarker.GetComponent <MeshRenderer>();
            }

            _rightControllerMarker = RightMarker.Instance;
            _leftControllerMarker  = LeftMarker.Instance;

            _rightHandPoser    = _rightControllerMarker.transform.GetComponentInChildren <OVRHand>();
            _leftHandPoser     = _leftControllerMarker.transform.GetComponentInChildren <OVRHand>();
            _rightHandSkeleton = _rightControllerMarker.transform.GetComponentInChildren <OVRSkeleton>();
            _leftHandSkeleton  = _leftControllerMarker.transform.GetComponentInChildren <OVRSkeleton>();

            _rightPreMarkerRenderer = _rightPreMarker.GetChild(0).GetComponent <MeshRenderer>();
            _leftPreMarkerRenderer  = _leftPreMarker.GetChild(0).GetComponent <MeshRenderer>();

            ToggleTranslateToolVisibility(false, false);
            ToggleTranslateToolVisibility(false, true);
            ToggleTranslateToolColliders(false, false);
            ToggleTranslateToolColliders(false, true);
        }
Example #29
0
        protected override void Awake()
        {
            base.Awake();

            hand     = controllerTransform.GetComponentInChildren <OVRHand>();
            skeleton = hand.GetComponent <OVRSkeleton>();

            GetControllerHashes();

            fingerBasis = new BoneBasis()
            {
                Forward = fingerForward, Up = fingerUp
            };
        }
        private void Awake()
        {
            _input           = AtomicInput.Instance;
            _rightHandMarker = RightMarker.Instance;
            _leftHandMarker  = LeftMarker.Instance;

            _rightHandSkeleton = _rightHandMarker.transform.GetComponentInChildren <OVRSkeleton>();
            _leftHandSkeleton  = _leftHandMarker.transform.GetComponentInChildren <OVRSkeleton>();

            _rightHand = _rightHandMarker.transform.GetComponentInChildren <OVRHand>();
            _leftHand  = _leftHandMarker.transform.GetComponentInChildren <OVRHand>();

            _rightHighlights = transform.GetChild(0).GetComponentsInChildren <TransformationModeHighlight>(true).ToList();
            _leftHighlights  = transform.GetChild(1).GetComponentsInChildren <TransformationModeHighlight>(true).ToList();

            _rightColliders = transform.GetChild(0).GetComponentsInChildren <Collider>(true);
            _leftColliders  = transform.GetChild(1).GetComponentsInChildren <Collider>(true);

            _rightMainRenderers = new List <MeshRenderer>();
            _leftMainRenderers  = new List <MeshRenderer>();

            MeshRenderer[] allRightRenderers = transform.GetChild(0).GetComponentsInChildren <MeshRenderer>(true);
            foreach (MeshRenderer renderer in allRightRenderers)
            {
                if (renderer.GetComponent <TransformationModeHighlight>() == null)
                {
                    _rightMainRenderers.Add(renderer);
                }
            }

            MeshRenderer[] allLeftRenderers = transform.GetChild(1).GetComponentsInChildren <MeshRenderer>(true);
            foreach (MeshRenderer renderer in allLeftRenderers)
            {
                if (renderer.GetComponent <TransformationModeHighlight>() == null)
                {
                    _leftMainRenderers.Add(renderer);
                }
            }

            _rightTextObjects = transform.GetChild(0).GetComponentsInChildren <Text>();
            _leftTextObjects  = transform.GetChild(1).GetComponentsInChildren <Text>();

            _rightLabelGroup = transform.GetChild(0).GetComponentInChildren <CanvasGroup>();
            _leftLabelGroup  = transform.GetChild(1).GetComponentInChildren <CanvasGroup>();

            _rightPositionMarker = transform.GetChild(0);
            _leftPositionMarker  = transform.GetChild(1);

            InitializeHighlightCapabilityOnBothCameras();
        }