public void EndAnimation() { if (_animation != null) { _animation.Finished = true; _animation = null; } }
public CameraAnimation StartAnimation(IReadOnlyList <Vector3> points, TimeSpan startTime, TimeSpan duration) { EndAnimation(); return(_animation = new CameraAnimation( points, _lookDirection, startTime, duration, Pitch, _zoom)); }
public CameraAnimation StartAnimation(IReadOnlyList <Vector3> points, TimeSpan startTime, TimeSpan duration) { EndAnimation(); return(_animation = new CameraAnimation( this, points, _lookDirection, startTime, duration, _currentPitchAngle, _zoom, _camera.FieldOfView)); }
public CameraAnimation StartAnimation( Vector3 startPosition, Vector3 endPosition, TimeSpan startTime, TimeSpan duration) { EndAnimation(); return(_animation = new CameraAnimation( startPosition, endPosition, _lookDirection, startTime, duration, _pitch, _zoom)); }
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); }