示例#1
0
 public void EndAnimation()
 {
     if (_animation != null)
     {
         _animation.Finished = true;
         _animation          = null;
     }
 }
示例#2
0
        public CameraAnimation StartAnimation(IReadOnlyList <Vector3> points, TimeSpan startTime, TimeSpan duration)
        {
            EndAnimation();

            return(_animation = new CameraAnimation(
                       points,
                       _lookDirection,
                       startTime,
                       duration,
                       Pitch,
                       _zoom));
        }
示例#3
0
        public CameraAnimation StartAnimation(IReadOnlyList <Vector3> points, TimeSpan startTime, TimeSpan duration)
        {
            EndAnimation();

            return(_animation = new CameraAnimation(
                       this,
                       points,
                       _lookDirection,
                       startTime,
                       duration,
                       _currentPitchAngle,
                       _zoom,
                       _camera.FieldOfView));
        }
示例#4
0
        public CameraAnimation StartAnimation(
            Vector3 startPosition,
            Vector3 endPosition,
            TimeSpan startTime,
            TimeSpan duration)
        {
            EndAnimation();

            return(_animation = new CameraAnimation(
                       startPosition,
                       endPosition,
                       _lookDirection,
                       startTime,
                       duration,
                       _pitch,
                       _zoom));
        }
示例#5
0
        public void UpdateCamera(GameTime gameTime)
        {
            if (_animation != null)
            {
                _animation.Update(this, gameTime);

                if (_animation.Finished)
                {
                    _animation = null;
                }
            }

            var yaw = MathUtility.Atan2(_lookDirection.Y, _lookDirection.X);

            var pitch = MathUtility.Lerp(
                0,
                -_pitchAngle,
                _pitch);

            var cameraHeight = MathUtility.Lerp(
                0,
                _defaultHeight,
                _zoom);

            float clampedPitch = pitch;

            if (pitch > 0 && pitch < _pitchAngle)
            {
                clampedPitch = _pitchAngle;
            }
            else if (pitch < 0 && pitch > -_pitchAngle)
            {
                clampedPitch = -_pitchAngle;
            }

            var cameraToTerrainDirection = Vector3.Normalize(new Vector3(
                                                                 MathUtility.Cos(yaw),
                                                                 MathUtility.Sin(yaw),
                                                                 MathUtility.Sin(clampedPitch)));

            // Back up camera from terrain position.
            var toCameraRay = new Ray(_terrainPosition, -cameraToTerrainDirection);
            var plane       = Plane.CreateFromVertices(
                new Vector3(0, 0, cameraHeight),
                new Vector3(0, 1, cameraHeight),
                new Vector3(1, 0, cameraHeight));
            var toCameraIntersectionDistance = toCameraRay.Intersects(ref plane).Value;
            var newPosition = _terrainPosition - cameraToTerrainDirection * toCameraIntersectionDistance;

            // Pitch - 0 means top-down view.
            // Pitch between 0 and CameraPitch = Move camera position to match pitch.
            // Pitch between CameraPitch and horizontal = Raise or lower target height.

            var lookDirection = new Vector3(
                MathUtility.Cos(yaw),
                MathUtility.Sin(yaw),
                MathUtility.Sin(pitch));

            var targetPosition = newPosition + lookDirection;

            _camera.View = Matrix4x4.CreateLookAt(
                newPosition,
                targetPosition,
                Vector3.UnitZ);
        }