protected override void UpdateTeleportDestination() { // Only update the orientation during preteleport, or if configured to do updates during aim. if (AimData.Destination.HasValue && (UpdateOrientationDuringAim || LocomotionTeleport.CurrentState == LocomotionTeleport.States.PreTeleport)) { var t = LocomotionTeleport.LocomotionController.CameraRig.centerEyeAnchor; var destination = AimData.Destination.GetValueOrDefault(); // create a plane that contains the destination, with the normal pointing to the HMD. var plane = new Plane(Vector3.up, destination); // find the point on the plane that the HMD is looking at. float d; bool hit = plane.Raycast(new Ray(t.position, t.forward), out d); if (hit) { var target = t.position + t.forward * d; var local = target - destination; local.y = 0; var distance = local.magnitude; if (distance > AimDistanceThreshold) { local.Normalize(); // Some debug draw code to visualize what the math is doing. //OVRDebugDraw.AddCross(target, 0.2f, 0.01f, Color.yellow, 0.1f); //OVRDebugDraw.AddCross(destination + new Vector3(local.x, 0, local.z), 0.2f, 0.01f, Color.blue, 0.1f); //OVRDebugDraw.AddLine(t.position + new Vector3(0, 0.1f, 0), target, 0.01f, Color.yellow, 1.0f); //OVRDebugDraw.AddLine(target + new Vector3(0, 1f, 0), target - new Vector3(0, 1f, 0), 0.01f, Color.blue, 1.0f); var rot = Quaternion.LookRotation(new Vector3(local.x, 0, local.z), Vector3.up); _initialRotation = rot; if (AimDistanceMaxRange > 0 && distance > AimDistanceMaxRange) { AimData.TargetValid = false; } LocomotionTeleport.OnUpdateTeleportDestination(AimData.TargetValid, AimData.Destination, rot, GetLandingOrientation(OrientationMode, rot)); return; } } } LocomotionTeleport.OnUpdateTeleportDestination(AimData.TargetValid, AimData.Destination, _initialRotation, GetLandingOrientation(OrientationMode, _initialRotation)); }
protected override void UpdateTeleportDestination() { var direction = OVRInput.Get(Thumbstick == Thumbsticks.LeftThumbstick ? OVRInput.RawAxis2D.LThumbstick : OVRInput.RawAxis2D.RThumbstick); if (!AimData.TargetValid) { _lastValidDirection = new Vector2(); } var length = direction.magnitude; if (length < RotateStickThreshold) { direction = _lastValidDirection; length = direction.magnitude; if (length < RotateStickThreshold) { _initialRotation = LocomotionTeleport.GetHeadRotationY(); direction.x = 0; direction.y = 1; } } else { _lastValidDirection = direction; } var tracking = LocomotionTeleport.LocomotionController.CameraRig.trackingSpace.rotation; if (length > RotateStickThreshold) { direction /= length; // normalize the vector var rot = _initialRotation * Quaternion.LookRotation(new Vector3(direction.x, 0, direction.y), Vector3.up); _currentRotation = tracking * rot; } else { _currentRotation = tracking * LocomotionTeleport.GetHeadRotationY(); } LocomotionTeleport.OnUpdateTeleportDestination(AimData.TargetValid, AimData.Destination, _currentRotation, GetLandingOrientation(OrientationMode, _currentRotation)); }
protected override void UpdateTeleportDestination() { float magnitude; Vector2 direction; if (Thumbstick == OVRInput.Controller.Touch) { Vector2 leftDir = OVRInput.Get(OVRInput.RawAxis2D.LThumbstick); Vector2 rightDir = OVRInput.Get(OVRInput.RawAxis2D.RThumbstick); float leftMag = leftDir.magnitude; float rightMag = rightDir.magnitude; if (leftMag > rightMag) { magnitude = leftMag; direction = leftDir; } else { magnitude = rightMag; direction = rightDir; } } else { if (Thumbstick == OVRInput.Controller.LTouch) { direction = OVRInput.Get(OVRInput.RawAxis2D.LThumbstick); } else { direction = OVRInput.Get(OVRInput.RawAxis2D.RThumbstick); } magnitude = direction.magnitude; } if (!AimData.TargetValid) { _lastValidDirection = new Vector2(); } if (magnitude < RotateStickThreshold) { direction = _lastValidDirection; magnitude = direction.magnitude; if (magnitude < RotateStickThreshold) { _initialRotation = LocomotionTeleport.GetHeadRotationY(); direction.x = 0; direction.y = 1; } } else { _lastValidDirection = direction; } var tracking = LocomotionTeleport.LocomotionController.CameraRig.trackingSpace.rotation; if (magnitude > RotateStickThreshold) { direction /= magnitude; // normalize the vector var rot = _initialRotation * Quaternion.LookRotation(new Vector3(direction.x, 0, direction.y), Vector3.up); _currentRotation = tracking * rot; } else { _currentRotation = tracking * LocomotionTeleport.GetHeadRotationY(); } LocomotionTeleport.OnUpdateTeleportDestination(AimData.TargetValid, AimData.Destination, _currentRotation, GetLandingOrientation(OrientationMode, _currentRotation)); }
protected override void UpdateTeleportDestination() { LocomotionTeleport.OnUpdateTeleportDestination(AimData.TargetValid, AimData.Destination, null, null); }