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); }
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; }
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); }
//=========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); }
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); }
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); } }
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); }
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); }
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); } } }
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; } }
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(); } } }
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; }
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); }
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); } }
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; // } }
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); } }
public void Update() { VRCPlayerApi.TrackingData trackingData = Networking.LocalPlayer.GetTrackingData(VRCPlayerApi.TrackingDataType.Head); transform.SetPositionAndRotation(trackingData.position, trackingData.rotation); }
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); }
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; } }
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; } }