Esempio n. 1
0
 protected virtual void CalculateNextRotation(float slowdown, out Quaternion nextRotation)
 {
     if (lastDeltaTime > 0.00001f && enableRotation)
     {
         // Rotate towards the direction we are moving in
         // Filter out noise in the movement direction
         // This is especially important when the agent is almost standing still and when using local avoidance
         float noiseThreshold      = radius * tr.localScale.x * 0.2f;
         float rotationSpeedFactor = MovementUtilities.FilterRotationDirection(ref rotationFilterState, ref rotationFilterState2, lastDeltaPosition, noiseThreshold, lastDeltaTime);
         nextRotation = SimulateRotationTowards(rotationFilterState, rotationSpeed * lastDeltaTime * rotationSpeedFactor, rotationSpeed * lastDeltaTime);
     }
     else
     {
         // TODO: simulatedRotation
         nextRotation = rotation;
     }
 }
Esempio n. 2
0
        void FinalMovement(Vector3 position3D, float deltaTime, float distanceToEndOfPath, float speedLimitFactor, out Vector3 nextPosition, out Quaternion nextRotation)
        {
            var forwards = movementPlane.ToPlane(simulatedRotation * (orientation == OrientationMode.YAxisForward ? Vector3.up : Vector3.forward));

            ApplyGravity(deltaTime);

            velocity2D = MovementUtilities.ClampVelocity(velocity2D, maxSpeed, speedLimitFactor, slowWhenNotFacingTarget && enableRotation, preventMovingBackwards, forwards);

            if (rvoController != null && rvoController.enabled)
            {
                // Send a message to the RVOController that we want to move
                // with this velocity. In the next simulation step, this
                // velocity will be processed and it will be fed back to the
                // rvo controller and finally it will be used by this script
                // when calling the CalculateMovementDelta method below

                // Make sure that we don't move further than to the end point
                // of the path. If the RVO simulation FPS is low and we did
                // not do this, the agent might overshoot the target a lot.
                var rvoTarget = position3D + movementPlane.ToWorld(Vector2.ClampMagnitude(velocity2D, distanceToEndOfPath));
                rvoController.SetTarget(rvoTarget, velocity2D.magnitude, maxSpeed);
            }

            // Direction and distance to move during this frame
            var deltaPosition = lastDeltaPosition = CalculateDeltaToMoveThisFrame(position3D, distanceToEndOfPath, deltaTime);

            if (enableRotation)
            {
                // Rotate towards the direction we are moving in
                // Filter out noise in the movement direction
                // This is especially important when the agent is almost standing still and when using local avoidance
                float noiseThreshold      = radius * tr.localScale.x * 0.2f;
                float rotationSpeedFactor = MovementUtilities.FilterRotationDirection(ref rotationFilterState, ref rotationFilterState2, deltaPosition, noiseThreshold, deltaTime);
                nextRotation = SimulateRotationTowards(rotationFilterState, rotationSpeed * deltaTime * rotationSpeedFactor, rotationSpeed * deltaTime);
            }
            else
            {
                nextRotation = simulatedRotation;
            }

            nextPosition = position3D + movementPlane.ToWorld(deltaPosition, verticalVelocity * deltaTime);
        }