feat: quaternion to angles conversion added
This commit is contained in:
@@ -79,6 +79,30 @@ public readonly struct Quaternion(float x, float y, float z, float w) : IEquatab
|
|||||||
public static implicit operator Quaternion(System.Numerics.Quaternion quaternion) => new(quaternion.X, quaternion.Y, quaternion.Z, quaternion.W);
|
public static implicit operator Quaternion(System.Numerics.Quaternion quaternion) => new(quaternion.X, quaternion.Y, quaternion.Z, quaternion.W);
|
||||||
public static implicit operator System.Numerics.Quaternion(Quaternion quaternion) => new(quaternion.X, quaternion.Y, quaternion.Z, quaternion.W);
|
public static implicit operator System.Numerics.Quaternion(Quaternion quaternion) => new(quaternion.X, quaternion.Y, quaternion.Z, quaternion.W);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Get the Pitch, Yaw and Roll of the <see cref="Quaternion"/>.
|
||||||
|
/// </summary>
|
||||||
|
public static Vector3D ToAngles(Quaternion quaternion)
|
||||||
|
{
|
||||||
|
// Quaternion to Euler angles (in 3-2-1 sequence) conversion
|
||||||
|
float sinr_cosp = 2f * (quaternion.W * quaternion.X + quaternion.Y * quaternion.Z);
|
||||||
|
float cosr_cosp = 1f - 2f * (quaternion.X * quaternion.X + quaternion.Y * quaternion.Y);
|
||||||
|
float pitch = MathF.Atan2(sinr_cosp, cosr_cosp);
|
||||||
|
|
||||||
|
float sinp = 2f * (quaternion.W * quaternion.Y - quaternion.Z * quaternion.X);
|
||||||
|
float yaw;
|
||||||
|
if (MathF.Abs(sinp) >= 1f)
|
||||||
|
yaw = MathF.CopySign(MathF.PI / 2f, sinp);
|
||||||
|
else
|
||||||
|
yaw = MathF.Asin(sinp);
|
||||||
|
|
||||||
|
float siny_cosp = 2f * (quaternion.W * quaternion.Z + quaternion.X * quaternion.Y);
|
||||||
|
float cosy_cosp = 1f - 2f * (quaternion.Y * quaternion.Y + quaternion.Z * quaternion.Z);
|
||||||
|
float roll = MathF.Atan2(siny_cosp, cosy_cosp);
|
||||||
|
|
||||||
|
return new Vector3D(pitch, yaw, roll) * Math.RadianToDegree;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Calculates the length of the <see cref="Quaternion"/>.
|
/// Calculates the length of the <see cref="Quaternion"/>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -310,6 +334,9 @@ public readonly struct Quaternion(float x, float y, float z, float w) : IEquatab
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public static class QuaternionExtensions
|
public static class QuaternionExtensions
|
||||||
{
|
{
|
||||||
|
/// <inheritdoc cref="Quaternion.ToAngles(Quaternion)" />
|
||||||
|
public static Vector3D ToAngles(this Quaternion quaternion) => Quaternion.ToAngles(quaternion);
|
||||||
|
|
||||||
/// <inheritdoc cref="Quaternion.Length(Quaternion)" />
|
/// <inheritdoc cref="Quaternion.Length(Quaternion)" />
|
||||||
public static float Length(this Quaternion quaternion) => Quaternion.Length(quaternion);
|
public static float Length(this Quaternion quaternion) => Quaternion.Length(quaternion);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user