我具有此功能,可以将欧拉角转换为旋转矩阵,但是当我只有旋转矩阵时,我想将其反转并获得欧拉角。 原因是我希望能够使用变换矩阵设置对象变换,然后我想更新该对象的欧拉旋转变量(以度为单位)。 (我有一个根据变换矩阵计算旋转矩阵的函数)
public static Mat4 RotMat(Vec3 _rot)
{
double rx = Math2.degToRad(_rot.x);
double[,] trmx = new double[4, 4] { { 1, 0, 0, 0 }, { 0, Math.Cos(rx), Math.Sin(rx), 0 }, { 0, -Math.Sin(rx), Math.Cos(rx), 0 }, { 0, 0, 0, 1 } };
Mat4 rmx = new Mat4(trmx);
double ry = Math2.degToRad(_rot.y);
double[,] trmy = new double[4, 4] { { Math.Cos(ry), 0, -Math.Sin(ry), 0 }, { 0, 1, 0, 0 }, { Math.Sin(ry), 0, Math.Cos(ry), 0 }, { 0, 0, 0, 1 } };
Mat4 rmy = new Mat4(trmy);
double rz = Math2.degToRad(_rot.z);
double[,] trmz = new double[4, 4] { { Math.Cos(rz), Math.Sin(rz), 0, 0 }, { -Math.Sin(rz), Math.Cos(rz), 0, 0 }, { 0, 0, 1, 0 }, { 0, 0, 0, 1 } };
Mat4 rmz = new Mat4(trmz);
return (rmx * rmy * rmz);
}
这是基于我发现的一些代码的尝试,但并非总是能给我预期的结果,有时它会起作用(我知道存在欧拉角的万向节锁定问题,所以这可能是徒劳的尝试)。
public static Vec3 GetRot(Mat4 _tm)
{
Mat4 rm = GetRotMat(_tm);
double sy = Math.Sqrt(rm[0, 0] * rm[0, 0] + rm[1, 0] * rm[1, 0]);
bool singular = sy < 1e-6; // If
double x, y, z;
if (!singular)
{
x = Math.Atan2(rm[2, 1], rm[2, 2]);
y = Math.Atan2(-rm[2, 0], sy);
z = Math.Atan2(rm[1, 0], rm[0, 0]);
}
else
{
x = Math.Atan2(-rm[1, 2], rm[1, 1]);
y = Math.Atan2(-rm[2, 0], sy);
z = 0;
}
x = Math2.radToDeg(x);
y = Math2.radToDeg(y);
z = Math2.radToDeg(z);
return new Vec3(x, y, z) * -1;
}