namespace DarkWynterEngine.Draw { #region Using Statements using System; using System.Collections.Generic; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Audio; using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; using Microsoft.Xna.Framework.Storage; using System.Xml; using System.Diagnostics; #endregion using DarkWynterEngine.Physics; /// <summary> /// Camera class /// </summary> public class Camera { /// <summary> /// Viewport associated with this Camera /// </summary> public Viewport viewport; /// <summary> /// Allows user to move camera around relative the Mass's currentPosition /// </summary> public Vector3 offset = new Vector3(700, 200, 700); /// <summary> /// Constructor /// </summary> public Camera() { viewport = new Viewport(); } public Matrix GetViewMatrix(Mass mass) { // Calculate new camera position relative to current position Vector3 cameraPosition = mass.currentPosition - (offset * mass.normalVector); // Calculate new lookAtPosition in the opposite direction of cameraPosition relative to current position Vector3 lookAtPosition = mass.currentPosition + mass.normalVector + (offset * mass.normalVector); // Use just the height value or camera goes wobbly sideways Vector3 upVector = mass.upVector + new Vector3(0, offset.Y, 0); // Make sure camera doesn't go below player position (clipping) if(cameraPosition.Y < mass.currentPosition.Y) cameraPosition.Y = mass.currentPosition.Y; // return final view matrix return Matrix.CreateLookAt( cameraPosition, lookAtPosition, upVector ); } public Matrix GetProjectionMatrix() { return Matrix.CreatePerspectiveFieldOfView( (float)Math.PI / 5, viewport.Width / viewport.Height, 0.3f, 100000f ); } } }