преобразовать заявку в OpenGL смущают меня - PullRequest
0 голосов
/ 28 сентября 2018

Я прочитал этот урок, https://learnopengl.com/Getting-started/Transformations В конце, над последней картинкой, написано:

glm::mat4 trans;
trans = glm::translate(trans, glm::vec3(0.5f, -0.5f, 0.0f));
trans = glm::rotate(trans, (float)glfwGetTime(), glm::vec3(0.0f, 0.0f, 1.0f));

Я не знаю, каковы окончательные значения транс, это translate * rotate или rotate * translate ?

Здесь мы сначала поворачиваем контейнер вокруг начала координат (0,0,0) и после его поворота мыпереведите его повернутую версию в правый нижний угол экрана. Помните, что фактический порядок преобразования следует читать в обратном порядке: даже если в коде мы сначала переводим, а затем поворачиваем, фактические преобразования сначала применяют вращение, а затем перевод.

итоговый transform = translate * rotate ?но почему он не пишет код следующим образом:

glm::mat4 trans;
trans = glm::rotate(trans, (float)glfwGetTime(), glm::vec3(0.0f, 0.0f, 1.0f));
trans = glm::translate(trans, glm::vec3(0.5f, -0.5f, 0.0f)); // revise order

код в вершинном шейдере выглядит следующим образом: gl_Position = transform * vec4(aPos, 1.0); это выглядит как transform = translate * rotate , потому что нам нужно сначала применить rotateа затем перевести.

update: Итак, я знаю, что умножение нужно читать справа налево, потому что это основная матрица столбца, но я не понимаю, когда конструируют транс-матрицу, почему бы не использовать пересмотренную версию?

1 Ответ

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

Вывод:

glm::mat4 trans;
trans = glm::translate(trans, glm::vec3(0.5f, -0.5f, 0.0f));
trans = glm::rotate(trans, (float)glfwGetTime(), glm::vec3(0.0f, 0.0f, 1.0f));

Должно быть translate * rotate , я подозреваю, что авторы хотели имитировать порядок чтения слева направо, а не порядок, в котором ониприменяются.Вы можете подтвердить это, посмотрев исходный код :

template<typename T, qualifier Q>
GLM_FUNC_QUALIFIER mat<4, 4, T, Q> translate(mat<4, 4, T, Q> const& m, vec<3, T, Q> const& v)
{
    mat<4, 4, T, Q> Result(m);
    Result[3] = m[0] * v[0] + m[1] * v[1] + m[2] * v[2] + m[3];
    return Result;
}

Это вычисляет m * translationMat .Поскольку верхний угол 3x3 для матрицы перевода - это тождество, а четвертый столбец - (v,1.0).

...