Матрица вращения в углы Эйлера в градусах - PullRequest
1 голос
/ 02 мая 2019

У меня есть эта функция для преобразования углов Эйлера в матрицу вращения, но я хотел бы обратить ее и получить углы Эйлера, когда у меня есть только матрица вращения. Причина этого в том, что я хочу установить преобразование объектов, используя матрицу преобразования, а затем обновить эту переменную вращения Эйлера для объектов в градусах. (у меня есть функция, которая вычисляет матрицу вращения из матрицы преобразования)

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;               
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...