예제 #1
0
        /// <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);
        }
예제 #2
0
 /// <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))));
     }
 }
예제 #3
0
 /// <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));
 }
예제 #4
0
        //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));
        }