36 lines
1.1 KiB
C#
36 lines
1.1 KiB
C#
using UnityEngine;
|
|
|
|
namespace LIV.SDK.Unity
|
|
{
|
|
public static class Extensions
|
|
{
|
|
private static float _copysign(float sizeval, float signval)
|
|
{
|
|
return ((int)Mathf.Sign(signval) != 1) ? (0f - Mathf.Abs(sizeval)) : Mathf.Abs(sizeval);
|
|
}
|
|
|
|
public static Quaternion GetRotation(this Matrix4x4 matrix)
|
|
{
|
|
Quaternion result = new Quaternion
|
|
{
|
|
w = Mathf.Sqrt(Mathf.Max(0f, 1f + matrix.m00 + matrix.m11 + matrix.m22)) / 2f,
|
|
x = Mathf.Sqrt(Mathf.Max(0f, 1f + matrix.m00 - matrix.m11 - matrix.m22)) / 2f,
|
|
y = Mathf.Sqrt(Mathf.Max(0f, 1f - matrix.m00 + matrix.m11 - matrix.m22)) / 2f,
|
|
z = Mathf.Sqrt(Mathf.Max(0f, 1f - matrix.m00 - matrix.m11 + matrix.m22)) / 2f
|
|
};
|
|
result.x = _copysign(result.x, matrix.m21 - matrix.m12);
|
|
result.y = _copysign(result.y, matrix.m02 - matrix.m20);
|
|
result.z = _copysign(result.z, matrix.m10 - matrix.m01);
|
|
return result;
|
|
}
|
|
|
|
public static Vector3 GetPosition(this Matrix4x4 matrix)
|
|
{
|
|
float m = matrix.m03;
|
|
float m2 = matrix.m13;
|
|
float m3 = matrix.m23;
|
|
return new Vector3(m, m2, m3);
|
|
}
|
|
}
|
|
}
|