S
Ok, ich hab hier von einem Kollegen(der da selbst schonmal vor einiger Zeit über eine Woche dransaß) seine Umrechnung bekommen. ich poste sie einfach mal für alle nachfolgenden Problemkinder.
//In a 2D grid, returns the angle to a specified point from the +X axis
private static float ArcTanAngle(float X, float Y)
{
if (X == 0)
{
if (Y == 1)
return (float)Microsoft.Xna.Framework.MathHelper.PiOver2;
else
return (float)-Microsoft.Xna.Framework.MathHelper.PiOver2;
}
else if (X > 0)
return (float)Math.Atan(Y / X);
else if (X < 0)
{
if (Y > 0)
return (float)Math.Atan(Y / X) + Microsoft.Xna.Framework.MathHelper.Pi;
else
return (float)Math.Atan(Y / X) - Microsoft.Xna.Framework.MathHelper.Pi;
}
else
return 0;
}
//returns Euler angles that point from one point to another
private static Microsoft.Xna.Framework.Vector3 AngleTo(Microsoft.Xna.Framework.Vector3 from, Microsoft.Xna.Framework.Vector3 location)
{
Microsoft.Xna.Framework.Vector3 angle = new Microsoft.Xna.Framework.Vector3();
Microsoft.Xna.Framework.Vector3 v3 = Microsoft.Xna.Framework.Vector3.Normalize(location - from);
angle.X = (float)Math.Asin(v3.Y);
angle.Y = ArcTanAngle(-v3.Z, -v3.X);
return angle;
}
//converts a Quaternion to Euler angles (X = pitch, Y = yaw, Z= roll)
public static Microsoft.Xna.Framework.Vector3 QuaternionToEuler(Microsoft.Xna.Framework.Quaternion rotation)
{
Microsoft.Xna.Framework.Vector3 rotationaxes = new Microsoft.Xna.Framework.Vector3();
Microsoft.Xna.Framework.Vector3 forward = Microsoft.Xna.Framework.Vector3.Transform(Microsoft.Xna.Framework.Vector3.Forward, rotation);
Microsoft.Xna.Framework.Vector3 up = Microsoft.Xna.Framework.Vector3.Transform(Microsoft.Xna.Framework.Vector3.Up, rotation);
rotationaxes = AngleTo(new Microsoft.Xna.Framework.Vector3(), forward);
if (rotationaxes.X == Microsoft.Xna.Framework.MathHelper.PiOver2)
{
rotationaxes.Y = ArcTanAngle(up.Z, up.X);
rotationaxes.Z = 0;
}
else if (rotationaxes.X == -Microsoft.Xna.Framework.MathHelper.PiOver2)
{
rotationaxes.Y = ArcTanAngle(-up.Z, -up.X);
rotationaxes.Z = 0;
}
else
{
up = Microsoft.Xna.Framework.Vector3.Transform(up,
Microsoft.Xna.Framework.Matrix.CreateRotationY(-rotationaxes.Y));
up = Microsoft.Xna.Framework.Vector3.Transform(up,
Microsoft.Xna.Framework.Matrix.CreateRotationX(-rotationaxes.X));
rotationaxes.Z = ArcTanAngle(up.Y, -up.X);
}
float tmp = rotationaxes.X;
rotationaxes.X = rotationaxes.Y;
rotationaxes.Y = tmp;
return rotationaxes;
}