Example #1
0
        private Vector3 GetMostPreciseFingerPosition(VRCPlayerApi.TrackingData trackingData, HumanBodyBones bone1, HumanBodyBones bone2, HumanBodyBones bone3)
        {
            Vector3 position = VRC.SDKBase.Networking.LocalPlayer.GetBonePosition(bone1);

            if (position != Vector3.zero)
            {
                return(position);
            }
            else
            {
                position = VRC.SDKBase.Networking.LocalPlayer.GetBonePosition(bone2);
            }
            if (position != Vector3.zero)
            {
                return(position);
            }
            else
            {
                position = VRC.SDKBase.Networking.LocalPlayer.GetBonePosition(bone3);
            }
            if (position != Vector3.zero)
            {
                return(position);
            }
            return(trackingData.position);
        }
Example #2
0
        private void SetToMostPreciseFingerPosition(Transform target, VRCPlayerApi.TrackingDataType trackingDataType, HumanBodyBones bone1, HumanBodyBones bone2, HumanBodyBones bone3)
        {
            Vector3 positionHead = _player.GetBonePosition(bone3);
            Vector3 positionTail = _player.GetBonePosition(bone2);

            if (positionHead != Vector3.zero)
            {
                target.position = positionHead;
                target.rotation = Quaternion.LookRotation(positionHead - positionTail);
                return;
            }
            positionHead = positionTail;
            positionTail = _player.GetBonePosition(bone1);
            if (positionHead != Vector3.zero)
            {
                target.position = positionHead;
                target.rotation = Quaternion.LookRotation(positionHead - positionTail);
                return;
            }
            VRCPlayerApi.TrackingData trackingData = _player.GetTrackingData(trackingDataType);
            positionHead = positionTail;
            positionTail = trackingData.position;
            if (positionHead != Vector3.zero)
            {
                target.position = positionHead;
                target.rotation = Quaternion.LookRotation(positionHead - positionTail);
                return;
            }
            target.position = trackingData.position;
            target.rotation = trackingData.rotation;
        }
Example #3
0
        private void SetMenuPosition(bool isRightHand)
        {
            float size = GetLocalAvatarHeight();

            this.gameObject.transform.localScale = new Vector3(size, size, size);
            VRCPlayerApi.TrackingData head = VRC.SDKBase.Networking.LocalPlayer.GetTrackingData(VRC.SDKBase.VRCPlayerApi.TrackingDataType.Head);
            VRCPlayerApi.TrackingData hand;
            if (isRightHand == true)
            {
                hand = VRC.SDKBase.Networking.LocalPlayer.GetTrackingData(VRC.SDKBase.VRCPlayerApi.TrackingDataType.RightHand);
            }
            else
            {
                hand = VRC.SDKBase.Networking.LocalPlayer.GetTrackingData(VRC.SDKBase.VRCPlayerApi.TrackingDataType.LeftHand);
            }
            if (TEST_VR || VRC.SDKBase.Networking.LocalPlayer.IsUserInVR())
            {
                Vector3 relativePosition = (head.rotation * Vector3.forward).normalized * RELATIVE_MENU_POSITION * size;
                relativePosition.y     += MENU_HEIGHT / 2 * size;
                this.transform.position = (hand.position) + relativePosition;
            }
            else
            {
                Vector3 relativePosition = (head.rotation * Vector3.forward).normalized * RELATIVE_MENU_POSITION_DESKTOP * size;
                this.transform.position = head.position + relativePosition;
            }
            this.transform.rotation = Quaternion.Euler(0, head.rotation.eulerAngles.y, 0);
        }
Example #4
0
        //=========Mirror manager=========

        private void DoMirrorManager()
        {
            VRCPlayerApi.TrackingData trackingData = Networking.LocalPlayer.GetTrackingData(VRCPlayerApi.TrackingDataType.Head);

            Vector3 lookDirection = (trackingData.rotation * Vector3.forward).normalized;
            Ray     lookRay       = new Ray(trackingData.position, lookDirection);

            RaycastHit hit;

            if (Physics.Raycast(lookRay, out hit, maximumOpenDistance, 16, QueryTriggerInteraction.Collide))
            {
                GameObject           obj      = hit.collider.gameObject;
                VRC_MirrorReflection mirror   = (VRC_MirrorReflection)obj.GetComponent(typeof(VRC_MirrorReflection));
                Renderer             renderer = obj.GetComponent <Renderer>();
                if (mirror && renderer)
                {
                    if (activeMirrorRefelction != mirror)
                    {
                        SetActiveMirror(false);
                        activeMirrorRefelction = mirror;
                        activeMirrorRenderer   = renderer;
                        SetActiveMirror(true);
                    }
                    else
                    {
                        SetActiveMirror(!activeMirrorRefelction.enabled);
                    }
                    return;
                }
            }
            SetActiveMirror(false);
        }
Example #5
0
    private void VrPlayerInputRotationUpdate()
    {
        VRCPlayerApi.TrackingData rightHand = localUser.GetTrackingData(VRCPlayerApi.TrackingDataType.RightHand);
        Vector3    wantedForward            = (new Vector3(rightHand.position.x, 0, rightHand.position.z) - new Vector3(transform.position.x, 0, transform.position.z)).normalized;
        Quaternion wantedRotation           = Quaternion.LookRotation(wantedForward, Vector3.up);

        transform.rotation = Quaternion.Lerp(transform.rotation, wantedRotation, RotationMultiplier * Time.deltaTime);
    }
Example #6
0
 public void Update()
 {
     if (!editorMode && vrEnabled == localPlayer.IsUserInVR())
     {
         VRCPlayerApi.TrackingData data = localPlayer.GetTrackingData(trackingType);
         transform.SetPositionAndRotation(data.position, data.rotation);
     }
 }
 private void Update()
 {
     if (track)
     {
         VRCPlayerApi.TrackingData trackdata = Networking.LocalPlayer.GetTrackingData(trackingDataType);
         transform.SetPositionAndRotation(trackdata.position, trackdata.rotation);
     }
 }
Example #8
0
        private bool IsLookingAtHand(VRCPlayerApi.TrackingData hand)
        {
            Quaternion rotation   = Quaternion.LookRotation(hand.position - head.position, Vector3.up);
            Quaternion headrot    = Quaternion.LookRotation(head.rotation * Vector3.forward, Vector3.up);
            Quaternion difference = headrot * Quaternion.Inverse(rotation);
            bool       result     = (difference.eulerAngles.x > 320 || difference.eulerAngles.x < 40) && (difference.eulerAngles.y > 325 || difference.eulerAngles.y < 35);

            return(result);
        }
Example #9
0
        private void LateUpdate()
        {
            // PlayerApi data will only be valid in game so we don't run the update if we're in editor
            if (isInEditor)
            {
                return;
            }

            VRCPlayerApi.TrackingData trackingData = playerApi.GetTrackingData(trackingTarget);
            transform.SetPositionAndRotation(trackingData.position, trackingData.rotation);
        }
Example #10
0
 void Update()
 {
     for (int i = 0; i < claimedSlots.Length; i++)
     {
         if (Utilities.IsValid(players[i]))
         {
             VRCPlayerApi.TrackingData td = players[i].GetTrackingData(VRCPlayerApi.TrackingDataType.Head);
             trackedGameobjects[claimedSlots[i]].transform.position = td.position + new Vector3(0, 1, 0);
         }
     }
 }
Example #11
0
        private void TrackHands(VRCPlayerApi.TrackingData source, Rigidbody target)
        {
            var tPos = source.position;

            target.velocity *= 0.65f;
            var posDelta = tPos - target.worldCenterOfMass;
            var velocity = posDelta / Time.fixedDeltaTime;

            if (!float.IsNaN(velocity.x))
            {
                target.velocity += velocity;
            }
        }
Example #12
0
        private void UpdateGestureControl()
        {
            if (VRC.SDKBase.Networking.LocalPlayer == null)
            {
                return;
            }
            if (VRC.SDKBase.Networking.LocalPlayer.IsUserInVR())
            {
                PopulateFields();
                if (isPlayerMoving == false)
                {
                    if (DidSwipeWithGesture(HAND_LEFT, Vector3.down, GESTURE_FINGER_POINT, true, 0, REQUIRED_OPENING_DISTANCE))
                    {
                        menu.OpenMenu(false);
                    }
                    if (DidSwipeWithGesture(HAND_RIGHT, Vector3.down, GESTURE_FINGER_POINT, true, 1, REQUIRED_OPENING_DISTANCE))
                    {
                        menu.OpenMenu(true);
                    }
                    if (DidSwipeWithGestureAnyHand(Vector3.up, GESTURE_HAND_OPEN, false, 2, REQUIRED_CLOSING_DISTANCE))
                    {
                        menu.CloseMenu();
                    }

                    /*if (menu.gameObject.activeInHierarchy && mirror != null)
                     * {
                     *  if (DidSwipeWithGestureAnyHand(Networking.LocalPlayer.GetRotation() * Vector3.left, GESTURE_HAND_OPEN, true, 4, REQUIRED_OPENING_DISTANCE))
                     *      mirror.OpenLookedAtMirror();
                     *  if (DidSwipeWithGestureAnyHand(Networking.LocalPlayer.GetRotation() * Vector3.right, GESTURE_HAND_OPEN, true, 6, REQUIRED_CLOSING_DISTANCE))
                     *      mirror.CloseMirror();
                     * }*/
                }
                else
                {
                    menu.CloseMenu();
                }
                prev_RightIndexFingerPosition = rightIndexFingerPosition;
                prev_LeftIndexFingerPosition  = leftIndexFingerPosition;
                prev_rightHand = rightHand;
                prev_leftHand  = leftHand;
            }
            else
            {
                if (UnityEngine.Input.GetKeyDown(menuKeyCode))
                {
                    menu.OpenMenu(false);
                    menu.CloseMenu();
                }
            }
        }
Example #13
0
        private void PopulateFields()
        {
            rightHand = VRC.SDKBase.Networking.LocalPlayer.GetTrackingData(VRC.SDKBase.VRCPlayerApi.TrackingDataType.RightHand);
            leftHand  = VRC.SDKBase.Networking.LocalPlayer.GetTrackingData(VRC.SDKBase.VRCPlayerApi.TrackingDataType.LeftHand);
            head      = VRC.SDKBase.Networking.LocalPlayer.GetTrackingData(VRC.SDKBase.VRCPlayerApi.TrackingDataType.Head);
            rightIndexFingerPosition = GetMostPreciseRightIndexFingerPosition();
            leftIndexFingerPosition  = GetMostPreciseLeftIndexFingerPosition();
            isPlayerMoving           = IsPlayerMoving();

            leftHandGesture  = GetHandGesture(HAND_LEFT);
            rightHandGesture = GetHandGesture(HAND_RIGHT);

            leftMovement  = leftHand.position - prev_leftHand.position;
            rightMovement = rightHand.position - prev_rightHand.position;
        }
Example #14
0
        public VRCPlayerApi.TrackingData GetTrackingData(VRCPlayerApi.TrackingDataType trackingDataType)
        {
            VRCPlayerApi.TrackingData data = new VRCPlayerApi.TrackingData();

            if (trackingDataType == VRCPlayerApi.TrackingDataType.Head)
            {
                data.position = playerCamera_.transform.position;
                data.rotation = playerCamera_.transform.rotation;
            }
            else if (trackingDataType == VRCPlayerApi.TrackingDataType.LeftHand)
            {
                data.position = leftArmPosition_.transform.position;
                data.rotation = leftArmPosition_.transform.rotation;
            }
            else if (trackingDataType == VRCPlayerApi.TrackingDataType.RightHand)
            {
                data.position = rightArmPosition_.transform.position;
                data.rotation = rightArmPosition_.transform.rotation;
            }

            return(data);
        }
Example #15
0
 private void Animate()
 {
     if (RescaleObjects())
     {
         //take picture of player if menu is done opening
         if (localPlayerCamera != null && animation_direction == 1)
         {
             if (Networking.LocalPlayer != null)
             {
                 VRCPlayerApi.TrackingData data = Networking.LocalPlayer.GetTrackingData(VRCPlayerApi.TrackingDataType.Head);
                 Vector3 cPos = data.position + data.rotation * Vector3.forward * 2;
                 localPlayerCamera.transform.SetPositionAndRotation(cPos, Quaternion.LookRotation(data.position - cPos));
                 localPlayerCamera.orthographicSize = localPlayerCameraSize * GetLocalAvatarHeight();
             }
             localPlayerCameraAnimator.SetTrigger("trigger");
         }
         finished = true;
     }
     if (finished && animation_direction == -1)
     {
         this.gameObject.SetActive(false);
     }
 }
Example #16
0
        public void Update()
        {
            // Put cue in hand
            if (!inTopDownMode)
            {
                if (useDesktop && isHolding)
                {
                    gameObject.transform.position = Networking.LocalPlayer.GetBonePosition(HumanBodyBones.RightHand);

                    // Temporary target
                    target.transform.position = gameObject.transform.position + Vector3.up;

                    Vector3 playerpos = gameController.gameObject.transform.InverseTransformPoint(Networking.LocalPlayer.GetPosition());

                    // Check turn entry
                    if ((Mathf.Abs(playerpos.x) < 2.0f) && (Mathf.Abs(playerpos.z) < 1.5f))
                    {
                        VRCPlayerApi.TrackingData hmd = Networking.LocalPlayer.GetTrackingData(VRCPlayerApi.TrackingDataType.Head);
                        pressE.SetActive(true);
                        pressE.transform.position = hmd.position + (hmd.rotation * Vector3.forward);

                        if (Input.GetKeyDown(KeyCode.E))
                        {
                            otherCue.inTopDownMode = true;
                            inTopDownMode          = true;
                            gameController.OnDesktopTopDownViewStart();
                        }
                    }
                    else
                    {
                        pressE.SetActive(false);
                    }
                }

                cueMainGripOriginalPosition = Vector3.Lerp(cueMainGripOriginalPosition, gameObject.transform.position, Time.deltaTime * 16.0f);

                if (!isOtherLock)
                {
                    cueOffhandGripOriginalPosition = Vector3.Lerp(cueOffhandGripOriginalPosition, target.transform.position, Time.deltaTime * 16.0f);
                }

                if (isArmed)
                {
                    vSnOff = cueMainGripOriginalPosition - vBase;
                    vSnDet = Vector3.Dot(vSnOff, vLineNorm);
                    cueParent.transform.position = vBase + (vLineNorm * vSnDet);
                }
                else
                {
                    // TODO: Fix a bug where 2p on Desktop doesn't see their cue.

                    // put cue at base position
                    cueParent.transform.position = cueMainGripOriginalPosition;
                    cueParent.transform.LookAt(cueOffhandGripOriginalPosition);
                }
            }

            // if (isHolding) // TODO: Refactor.
            // {
            //     // Clamp controllers to play boundaries while we have hold of them
            //     Vector3 temp = this.transform.localPosition;
            //     temp.x = Mathf.Clamp(temp.x, -4.0f, 4.0f);
            //     temp.y = Mathf.Clamp(temp.y, -0.8f, 1.5f);
            //     temp.z = Mathf.Clamp(temp.z, -3.25f, 3.25f);
            //     this.transform.localPosition = temp;
            //     temp = target.transform.localPosition;
            //     temp.x = Mathf.Clamp(temp.x, -4.0f, 4.0f);
            //     temp.y = Mathf.Clamp(temp.y, -0.8f, 1.5f);
            //     temp.z = Mathf.Clamp(temp.z, -3.25f, 3.25f);
            //     target.transform.localPosition = temp;
            // }
        }
Example #17
0
        private void LateUpdate()
        {
            Vector3    targetPos;
            Quaternion targetRot;

            // we're tracking bones in regular Update, otherwise it doesnt sync with IK
            if (trackBone)
            {
                return;
            }

            if (trackPlayerBase)
            {
                targetPos = player.GetPosition();
                targetRot = player.GetRotation();
            }
            else if (trackPlayspace)
            {
                var vertical   = Input.GetAxisRaw("Vertical");
                var horizontal = Input.GetAxisRaw("Horizontal");
                var rotation   = Input.GetAxisRaw("Oculus_CrossPlatform_SecondaryThumbstickHorizontal");
                targetPos = player.GetPosition();
                targetRot = player.GetRotation();
                offsetRot = oldRot - targetRot.eulerAngles.y;
                oldRot    = targetRot.eulerAngles.y;
                if (vertical > 0 || vertical < 0 || horizontal > 0 || horizontal < 0)
                {
                    targetPos += offsetPos;
                    targetTransform.position = targetPos;
                    if (rotation > 0 || rotation < 0)
                    {
                        targetTransform.RotateAround(player.GetPosition(), Vector3.up, -offsetRot);
                    }

                    return;
                }

                if (rotation > 0 || rotation < 0)
                {
                    targetTransform.RotateAround(player.GetPosition(), Vector3.up, -offsetRot);
                }

                offsetPos = targetTransform.position - targetPos;
                return;
            }
            else
            {
                trackingData = player.GetTrackingData(trackingTarget);
                targetPos    = trackingData.position;
                targetRot    = trackingData.rotation;
            }

            if (trackPosition && trackRotation)
            {
                targetTransform.SetPositionAndRotation(targetPos, targetRot);
            }
            else if (trackPosition)
            {
                targetTransform.position = targetPos;
            }
            else
            {
                targetTransform.rotation = targetRot;
            }

            if (correctForControllers && !trackPlayspace && !trackPlayerBase)
            {
                // Thx to Phasedragon for testing and finding out the exact formula
                targetTransform.rotation = targetRot * Quaternion.Euler(-41, 0, 0);
            }

            if (rotateBy.magnitude > 0)
            {
                targetTransform.Rotate(rotateBy);
            }
        }
Example #18
0
 public void Update()
 {
     VRCPlayerApi.TrackingData trackingData = Networking.LocalPlayer.GetTrackingData(VRCPlayerApi.TrackingDataType.Head);
     transform.SetPositionAndRotation(trackingData.position, trackingData.rotation);
 }
Example #19
0
 private void Update()
 {
     trackingData = _player.GetTrackingData(headType);
     transform.SetPositionAndRotation(trackingData.position, trackingData.rotation);
 }
 private void Update()
 {
     VRCPlayerApi.TrackingData data = player.GetTrackingData(VRCPlayerApi.TrackingDataType.Head);
     gameObject.transform.SetPositionAndRotation(data.position, data.rotation);
 }
Example #21
0
    void Update()
    {
        // Put cue in hand
                #if !HT_QUEST
        if (dkPrimaryControl)
        {
            if (useDesktop && bHolding)
            {
                this.transform.position = Networking.LocalPlayer.GetBonePosition(HumanBodyBones.RightHand);

                // Temporary target
                objTarget.transform.position = this.transform.position + Vector3.up;

                Vector3 playerpos = gameController.gameObject.transform.InverseTransformPoint(Networking.LocalPlayer.GetPosition());

                // Check turn entry
                if ((Mathf.Abs(playerpos.x) < 2.0f) && (Mathf.Abs(playerpos.z) < 1.5f))
                {
                    VRCPlayerApi.TrackingData hmd = localplayer.GetTrackingData(VRCPlayerApi.TrackingDataType.Head);
                    ui_pressE.SetActive(true);
                    ui_pressE.transform.position = hmd.position + hmd.rotation * Vector3.forward;
                    if (Input.GetKeyDown(KeyCode.E))
                    {
                        dkPrimaryControl = false;
                        gameController._ht_desktop_enter();
                    }
                }
                else
                {
                    ui_pressE.SetActive(false);
                }
            }
                        #endif

        lag_objBase = Vector3.Lerp(lag_objBase, this.transform.position, Time.deltaTime * 16.0f);

        if (!bOtherLock)
        {
            lag_objTarget = Vector3.Lerp(lag_objTarget, objTarget.transform.position, Time.deltaTime * 16.0f);
        }

        if (bArmed)
        {
            vSnOff = lag_objBase - vBase;
            vSnDet = Vector3.Dot(vSnOff, vLineNorm);
            objCue.transform.position = vBase + vLineNorm * vSnDet;
        }
        else
        {
            // put cue at base position
            objCue.transform.position = lag_objBase;
            objCue.transform.LookAt(lag_objTarget);
        }

                #if !HT_QUEST
    }
                #endif

        //Xiexe: I find this to be a little silly, hard coding bounds is a little nuts. I think it should either be exposed to the inspector
        // or should be set using a trigger volume and using it's bounds via the editor. We're in a modern game engine, no need to do this. We have the technology.
        if (bHolding)
        {
            // Clamp controllers to play boundaries while we have hold of them
            Vector3 temp = this.transform.localPosition;
            temp.x = Mathf.Clamp(temp.x, -4.0f, 4.0f);
            temp.y = Mathf.Clamp(temp.y, -0.8f, 1.5f);
            temp.z = Mathf.Clamp(temp.z, -3.25f, 3.25f);
            this.transform.localPosition = temp;
            temp   = objTarget.transform.localPosition;
            temp.x = Mathf.Clamp(temp.x, -4.0f, 4.0f);
            temp.y = Mathf.Clamp(temp.y, -0.8f, 1.5f);
            temp.z = Mathf.Clamp(temp.z, -3.25f, 3.25f);
            objTarget.transform.localPosition = temp;
        }
    }
Example #22
0
    void Update()
    {
        // Put cue in hand
   #if !HT_QUEST
        if (dkPrimaryControlLock)
        {
            dkPrimaryControlLock = false;
            return;
        }

        if (dkPrimaryControl)
        {
            if (useDesktop && bHolding)
            {
                this.transform.position = Networking.LocalPlayer.GetBonePosition(HumanBodyBones.RightHand);

                // Temporary target
                objTarget.transform.position = this.transform.position + Vector3.up;

                Vector3 playerpos = gameController.gameObject.transform.InverseTransformPoint(Networking.LocalPlayer.GetPosition());

                // Check turn entry
                if ((Mathf.Abs(playerpos.x) < 2.0f) && (Mathf.Abs(playerpos.z) < 1.5f))
                {
                    VRCPlayerApi.TrackingData hmd = localplayer.GetTrackingData(VRCPlayerApi.TrackingDataType.Head);
                    ui_pressE.SetActive(true);
                    ui_pressE.transform.position = hmd.position + hmd.rotation * Vector3.forward;
                    if (Input.GetKeyDown(KeyCode.E))
                    {
                        dkPrimaryControl = false;
                        gameController._ht_desktop_enter();
                    }
                }
                else
                {
                    ui_pressE.SetActive(false);
                }
            }
   #endif
        lag_objBase = Vector3.Lerp(lag_objBase, this.transform.position, Time.deltaTime * 16.0f);

        if (!bOtherLock)
        {
            lag_objTarget = Vector3.Lerp(lag_objTarget, objTarget.transform.position, Time.deltaTime * 16.0f);
        }

        if (bArmed)
        {
            vSnOff = lag_objBase - vBase;
            vSnDet = Vector3.Dot(vSnOff, vLineNorm);
            objCue.transform.position = vBase + vLineNorm * vSnDet;
        }
        else
        {
            // put cue at base position
            objCue.transform.position = lag_objBase;
            objCue.transform.LookAt(lag_objTarget);
        }

   #if !HT_QUEST
    }
   #endif

        if (bHolding)
        {
            // Clamp controllers to play boundaries while we have hold of them
            Vector3 temp = this.transform.localPosition;
            temp.x = Mathf.Clamp(temp.x, -4.0f, 4.0f);
            temp.y = Mathf.Clamp(temp.y, -0.8f, 1.5f);
            temp.z = Mathf.Clamp(temp.z, -3.25f, 3.25f);
            this.transform.localPosition = temp;
            temp   = objTarget.transform.localPosition;
            temp.x = Mathf.Clamp(temp.x, -4.0f, 4.0f);
            temp.y = Mathf.Clamp(temp.y, -0.8f, 1.5f);
            temp.z = Mathf.Clamp(temp.z, -3.25f, 3.25f);
            objTarget.transform.localPosition = temp;
        }
    }