Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //XYZ is a 3D vector class with components X, Y, and Z
- //Obvious thing but worth mentioning: if converting this to
- //use floats, make sure you convert all literal doubles
- //to end in f (1.0 becomes 1.0f, 0.5 becomes 0.5f, etc)
- public static Quaternion LookRotation(XYZ forward, XYZ up)
- {
- forward = forward.Normalize();
- XYZ vector = forward.Normalize();
- XYZ vector2 = up.CrossProduct(vector).Normalize();
- XYZ vector3 = vector.CrossProduct(vector2);
- var m00 = vector2.X;
- var m01 = vector2.Y;
- var m02 = vector2.Z;
- var m10 = vector3.X;
- var m11 = vector3.Y;
- var m12 = vector3.Z;
- var m20 = vector.X;
- var m21 = vector.Y;
- var m22 = vector.Z;
- double num8 = (m00 + m11) + m22;
- var quaternion = new Quaternion();
- if (num8 > 0.0)
- {
- var num = (double)Math.Sqrt(num8 + 1.0);
- quaternion.w = num * 0.5;
- num = 0.5 / num;
- quaternion.x = (m12 - m21) * num;
- quaternion.y = (m20 - m02) * num;
- quaternion.z = (m01 - m10) * num;
- return quaternion;
- }
- if ((m00 >= m11) && (m00 >= m22))
- {
- var num7 = (double)Math.Sqrt(((1.0 + m00) - m11) - m22);
- var num4 = 0.5 / num7;
- quaternion.x = 0.5 * num7;
- quaternion.y = (m01 + m10) * num4;
- quaternion.z = (m02 + m20) * num4;
- quaternion.w = (m12 - m21) * num4;
- return quaternion;
- }
- if (m11 > m22)
- {
- var num6 = (double)Math.Sqrt(((1.0 + m11) - m00) - m22);
- var num3 = 0.5 / num6;
- quaternion.x = (m10 + m01) * num3;
- quaternion.y = 0.5 * num6;
- quaternion.z = (m21 + m12) * num3;
- quaternion.w = (m20 - m02) * num3;
- return quaternion;
- }
- var num5 = (double)Math.Sqrt(((1.0 + m22) - m00) - m11);
- var num2 = 0.5 / num5;
- quaternion.x = (m20 + m02) * num2;
- quaternion.y = (m21 + m12) * num2;
- quaternion.z = 0.5 * num5;
- quaternion.w = (m01 - m10) * num2;
- return quaternion;
- }
Advertisement
Add Comment
Please, Sign In to add comment