Как повернуть трехмерный вектор с помощью рыскания, тангажа и крена? - PullRequest
0 голосов
/ 28 сентября 2019

Я понятия не имею, как бы я поступил по этому поводу, кто-нибудь знает, как я могу вращать x, y и z с помощью рыскания, тангажа и крена ?, Я могу только сделать 2D-вращение, но это не такчто я ищуЭто текущий код, который у меня есть.

Тяга и тангаж и крен должны быть в градусах.Не радианы.

class Vector3
{//
public:
    float x, y, z;

    void rotate(float yaw, float pitch, float roll) {

    }
};

Приветствуется решение, которое не требует внешней библиотеки.

edit:

    void rotate(float yaw, float pitch, float roll) { //X Y Z Rotation
        float cosa = cos_r(yaw); float cosb = cos_r(pitch); float cosc = cos_r(roll);
        float sina = sin_r(yaw); float sinb = sin_r(pitch); float sinc = sin_r(roll);

        float Axx = cosa * cosb;
        float Axy = cosa * sinb * sinc - sina * cosc;
        float Axz = cosa * sinb * cosc + sina * sinc;

        float Ayx = sina * cosb;
        float Ayy = sina * sinb * sinc + cosa * cosc;
        float Ayz = sina * sinb * cosc - cosa * sinc;

        float Azx = -sinb;
        float Azy = cosb * sinc;
        float Azz = cosb * cosc;

        float px = x; float py = y; float pz = z;
        x = Axx * px + Axy * py + Axz * pz;
        y = Ayx * px + Ayy * py + Ayz * pz;
        z = Azx * px + Azy * py + Azz * pz;
    }

Я пробовал это, но это не такработай.cos_r и sin_r - это функции, которые принимают градусы.

Ответы [ 2 ]

1 голос
/ 28 сентября 2019

Поскольку вы реализуете свой собственный векторный класс 3D, вы , вероятно, хотите реализовать и некоторые базовые матричные операции.В частности, вы хотите матрицы вращения .В связанном разделе Википедии показаны простые базовые случаи для вращения вокруг оси X, Y или Z.

Как только вы это сделаете, вы обнаружите, что "рыскание, крен, наклон", т.е. углы Эйлера илиУглы Тейт-Брайана - это просто способ применения поворотов вокруг главных осей в заданном порядке.

0 голосов
/ 28 сентября 2019

Вы можете использовать матрицу вращения, чтобы сделать трюк.https://en.wikipedia.org/wiki/Rotation_matrix

Все, что вам нужно сделать, это умножить вектор на матрицу необходимого вращения.

...