Camera Rotate X und Y
-
Hi,
ich habe mir folgende Camera Klasse geschrieben:
public class Camera { public static Viewport VP { get; set; } public static Matrix View { get; set; } public static Matrix Projection { get; set; } public static Vector3 Position { get; set; } public static Vector3 Velocity { get; set; } public static Quaternion quaternion { get; set; } public static float QRotY { get; set; } public static float QRotX { get; set; } public GraphicsDeviceManager graphics { get; set; } public Camera() { Position = new Vector3(0, 0, 0); } public static void UpdateCamera() { quaternion = Quaternion.CreateFromAxisAngle(Vector3.Up, MathHelper.ToRadians(QRotY)); Position += Vector3.Transform(Velocity, Matrix.CreateFromQuaternion(quaternion)); View = Matrix.CreateLookAt(Position + Vector3.Transform(new Vector3(0, 0, -20), Matrix.CreateFromQuaternion(quaternion)), Position + Vector3.Transform(new Vector3(0, 0, 50), Matrix.CreateFromQuaternion(quaternion)), Vector3.Up); Projection = Matrix.CreatePerspectiveFieldOfView( MathHelper.Pi / 3.0f, VP.Width / VP.Height, 1, 10000); } }
Die Steuerung funktioniert bis jetzt ganz gut, aber nur für nach links und rechts gucken. Wenn ich statt
quaternion = Quaternion.CreateFromAxisAngle(Vector3.Up, MathHelper.ToRadians(QRotY));
den Vector.Left nehme, kann man nach oben und unten gucken.
nun wollte ich den Vektor nicht direkt reinschreiben, sondern eine
Rotationsfunktion schreiben und den Vector und den Winkel übergeben.Aber wenn ich einfach von Vector.Up zu Vector.Left wechsle, springt die Camera.
was fehlt? muss ich nen Vector für meine Rotationsachse noch transformieren?
muss mit dem Quaternion noch irgendwas passieren?Danke
-
Ok, ich habe jetzt eine Lösung gefunden, fass es Jemanden interessiert, hier die Lösung:
public class Camera { public static Viewport VP { get; set; } public static Matrix View { get; set; } public static Matrix Projection { get; set; } public static Matrix Orientation { get; set; } public static Vector3 Position { get; set; } public static Vector3 Velocity { get; set; } public static Quaternion quaternion { get; set; } public static Quaternion RotY { get; set; } public static Quaternion RotX { get; set; } public static Quaternion Ori { get; set; } public static float QRotY { get; set; } public static float QRotX { get; set; } public static Vector3 Up; public Camera() { Position = new Vector3(0, 0, 0); Up = new Vector3(0, 1, 0); } public static void UpdateCamera() { Position += Vector3.Transform(Velocity, Matrix.CreateFromQuaternion(quaternion)); View = Matrix.CreateLookAt(Position + Vector3.Transform(new Vector3(0, +10, -20), Matrix.CreateFromQuaternion(quaternion)), Position + Vector3.Transform(new Vector3(0, -10, 50), Matrix.CreateFromQuaternion(quaternion)), Vector3.Transform(Up, quaternion)); Projection = Matrix.CreatePerspectiveFieldOfView( MathHelper.Pi / 3.0f, VP.Width / VP.Height, 1, 10000); } public static void Rotate(float AngleY, float AnlgeX) { RotY = Quaternion.CreateFromAxisAngle(Vector3.Up, MathHelper.ToRadians(AngleY)); RotX = Quaternion.CreateFromAxisAngle(Vector3.Left, MathHelper.ToRadians(AnlgeX)); quaternion = RotY * RotX; quaternion.Normalize(); } }
Jetzt muss ich nurnoch verhindern, dass beim Rotieren um den Vector3.Left, sich das Objekt nicht mit rotiert.