C# 欧拉角的旋转矩阵(度)

C# 欧拉角的旋转矩阵(度),c#,matrix,C#,Matrix,我有这个函数将欧拉角转换为旋转矩阵,但我想反转它,当我只有旋转矩阵时,得到欧拉角。 原因是我希望能够使用变换矩阵设置对象变换,然后我希望更新对象Euler旋转变量(以度为单位)。(我有一个从变换矩阵计算旋转矩阵的函数) 这是一个基于我找到的一些代码的尝试,但并不总是给我预期的结果,它有时有效(我知道euler角存在万向节锁问题,所以这可能是一个徒劳的尝试) publicstaticvec3getrot(Mat4_tm) { Mat4 rm=GetRotMat(_tm); double sy=Ma

我有这个函数将欧拉角转换为旋转矩阵,但我想反转它,当我只有旋转矩阵时,得到欧拉角。 原因是我希望能够使用变换矩阵设置对象变换,然后我希望更新对象Euler旋转变量(以度为单位)。(我有一个从变换矩阵计算旋转矩阵的函数)

这是一个基于我找到的一些代码的尝试,但并不总是给我预期的结果,它有时有效(我知道euler角存在万向节锁问题,所以这可能是一个徒劳的尝试)

publicstaticvec3getrot(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;//如果
双x,y,z;
如果(!单数)
{
x=数学Atan2(rm[2,1],rm[2,2]);
y=数学常数2(-rm[2,0],sy);
z=Math.Atan2(rm[1,0],rm[0,0]);
}
其他的
{
x=数学Atan2(-rm[1,2],rm[1,1]);
y=数学常数2(-rm[2,0],sy);
z=0;
}   
x=Math2.radToDeg(x);
y=Math2.radToDeg(y);
z=Math2.radToDeg(z);
返回新的Vec3(x,y,z)*-1;
}

我投票决定将这个问题作为离题题来结束,因为这是一个纯粹的数学问题。首先在一个数学网站上进行研究和提问我投票决定把这个问题作为离题题来结束,因为这是一个纯粹的数学问题。首先在一个数学网站上进行调查和提问
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;               
}