/// <summary> /// Berechnet die neue Kameraposition in Abhängigkeit der Mausbewegung. /// </summary> /// <param name="pivot">Dreh- und Angelpunkt</param> /// <param name="distance">Distanz zum Dreh- und Angelpunkt</param> /// <param name="degreesLeftRight">Grad der Rotation nach links oder rechts</param> /// <param name="degreesUpDown">Grad der Rotation nach unten oder oben</param> /// <param name="invertX">invertiert die Links-Rechts-Rotation, wenn aktiv</param> /// <param name="invertY">invertiert die Oben-Unten-Rotation, wenn aktiv</param> /// <returns>Neue Kameraposition</returns> public static Vector3 CalculateRotationForArcBallCamera(Vector3 pivot, float distance, float degreesLeftRight, float degreesUpDown, bool invertX = false, bool invertY = false) { float radiansLeftRight = MathHelper.DegreesToRadians(invertX ? degreesLeftRight : -degreesLeftRight); float radiansUpDown = MathHelper.DegreesToRadians(invertY ? degreesUpDown : -degreesUpDown); Quaternion yaw = Quaternion.FromAxisAngle(KWEngine.WorldUp, radiansLeftRight); Vector3 rotatedVector1 = HelperVector.RotateVectorByQuaternion(Vector3.UnitZ, yaw); Vector3 cross = Vector3.Cross(rotatedVector1, KWEngine.WorldUp); Quaternion pitch = Quaternion.FromAxisAngle(cross, radiansUpDown); Vector3 rotatedVector2 = HelperVector.RotateVectorByQuaternion(rotatedVector1, pitch); return(pivot + rotatedVector2 * distance); }
/// <summary> /// Berechnet den Vektor, der entsteht, wenn der übergebene Vektor um die angegebenen Grad rotiert wird /// </summary> /// <param name="vector">zu rotierender Vektor</param> /// <param name="degrees">Rotation (in Grad)</param> /// <param name="plane">Einheitsvektor, um den rotiert wird</param> /// <returns>Rotierter Vektor</returns> public static Vector3 RotateVector(Vector3 vector, float degrees, Plane plane) { if (plane == Plane.X) { return(HelperVector.RotateVectorByQuaternion(vector, Quaternion.FromAxisAngle(Vector3.UnitX, MathHelper.DegreesToRadians(degrees)))); } else if (plane == Plane.Y) { return(HelperVector.RotateVectorByQuaternion(vector, Quaternion.FromAxisAngle(Vector3.UnitY, MathHelper.DegreesToRadians(degrees)))); } else if (plane == Plane.Z) { return(HelperVector.RotateVectorByQuaternion(vector, Quaternion.FromAxisAngle(Vector3.UnitZ, MathHelper.DegreesToRadians(degrees)))); } else { return(HelperVector.RotateVectorByQuaternion(vector, Quaternion.FromAxisAngle(KWEngine.CurrentWorld.GetCameraLookAtVector(), MathHelper.DegreesToRadians(degrees)))); } }
/// <summary> /// Rotiert einen Vektor mit Hilfe der angegebenen Quaternion (Hamilton-Produkt) /// </summary> /// <param name="source">zu rotierender Vektor</param> /// <param name="rotation">Rotation als Quaternion</param> /// <returns>rotierter Vektor</returns> public static Vector3 RotateVectorByQuaternion(Vector3 source, Quaternion rotation) { return(HelperVector.RotateVectorByQuaternion(source, rotation)); }
//private static Quaternion Turn180 = Quaternion.FromAxisAngle(KWEngine.WorldUp, (float)Math.PI); /// <summary> /// Berechnet den Vektor, der entsteht, wenn der übergebene Vektor um die angegebenen Grad rotiert wird /// </summary> /// <param name="vector">zu rotierender Vektor</param> /// <param name="degrees">Rotation (in Grad)</param> /// <param name="plane">Einheitsvektor, um den rotiert wird</param> /// <returns>Rotierter Vektor</returns> public static Vector3 RotateVector(Vector3 vector, float degrees, Plane plane) { return(HelperVector.RotateVector(vector, degrees, plane)); }