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));
    }
Esempio n. 4
0
 protected override void UpdateTeleportDestination()
 {
     LocomotionTeleport.OnUpdateTeleportDestination(AimData.TargetValid, AimData.Destination, null, null);
 }