расчет вращения в GLM - PullRequest
       75

расчет вращения в GLM

2 голосов
/ 25 января 2020

исходный код для поворота GLM выполняется следующим образом:

template<typename T, qualifier Q>
    GLM_FUNC_QUALIFIER mat<4, 4, T, Q> rotate(mat<4, 4, T, Q> const& m, T angle, vec<3, T, Q> const& v)
    {
        T const a = angle;
        T const c = cos(a);
        T const s = sin(a);

        vec<3, T, Q> axis(normalize(v));
        vec<3, T, Q> temp((T(1) - c) * axis);

        mat<4, 4, T, Q> Rotate;
        Rotate[0][0] = c + temp[0] * axis[0];
        Rotate[0][1] = temp[0] * axis[1] + s * axis[2];
        Rotate[0][2] = temp[0] * axis[2] - s * axis[1];

        Rotate[1][0] = temp[1] * axis[0] - s * axis[2];
        Rotate[1][1] = c + temp[1] * axis[1];
        Rotate[1][2] = temp[1] * axis[2] + s * axis[0];

        Rotate[2][0] = temp[2] * axis[0] + s * axis[1];
        Rotate[2][1] = temp[2] * axis[1] - s * axis[0];
        Rotate[2][2] = c + temp[2] * axis[2];

        mat<4, 4, T, Q> Result;
        Result[0] = m[0] * Rotate[0][0] + m[1] * Rotate[0][1] + m[2] * Rotate[0][2];
        Result[1] = m[0] * Rotate[1][0] + m[1] * Rotate[1][1] + m[2] * Rotate[1][2];
        Result[2] = m[0] * Rotate[2][0] + m[1] * Rotate[2][1] + m[2] * Rotate[2][2];
        Result[3] = m[3];
        return Result;
    }  

Кто-нибудь знает какое-либо объяснение того, как здесь вычисляется вращение? Какой метод используется особенно?

Поскольку вращение вокруг точки вращения не используется, перевод не требуется, но общая форма для вычисления вращения вокруг произвольной оси будет выглядеть примерно так:

enter image description here

, который я не знаю, это случай выше. В частности, я не понимаю, откуда определен temp((T(1)-c)*axis), чего я никогда не делал в линейной алгебре.

1 Ответ

3 голосов
/ 26 января 2020

На самом деле glm::rotate устанавливает матрицу вращения и умножает входную матрицу на вращение. Он вычисляет m*r в значении Векторные и матричные операции GLSL .
Он работает так же, как обсуждалось для glm::translate в одном из ваших предыдущих вопросов. : Как GLM обрабатывает перевод .

Входные параметры angle (угол поворота) и v (ось вращения) определяют матрицу вращения 3x3, как описано в википедии. article Матрица вращения от оси и угла :
(математическое объяснение этой формулы будет вопросом для Matmatics )

c = cos(angle); s = sin(angle)
x = v.x; y = v.y; z = v.z

          | x*x*(1-c)+c      x*y*(1-c)-z*s    x*z*(1-c)+y*s |
Rotate  = | y*x*(1-c)+z*s    y*y*(1-c)+c      y*z*(1-c)-x*s |
          | z*x*(1-c)-y*s    z*y*(1-c)+x*s    z*z*(1-c)+c   |

Эта матрица неявно расширен до матрицы 4х4. Наконец, матрица ввода (m) умножается на Roatate и присваивается Result:

Result = m * Roatate
...