Вопрос перевода GLM - PullRequest
       34

Вопрос перевода GLM

0 голосов
/ 30 октября 2018

У меня есть модель, и я хочу переместить ее по осям, если у меня есть матрица преобразования glm::mat4, а вектор вверх равен glm::vec4 up(matrix[1]);, поэтому, если я хочу переместить модель вдоль вектора вверх на значение up*=d;, тогда matrix=glm::translate(matrix,up);, результирующая матрица не перемещает модель вправо, например, если id вектора вверх (0,0.707106769,0.707106769) "модель повернута вокруг оси X на 45d", и я хочу переместить ее на 5 единиц, поэтому вектор перевода равно (0,3.535533845,3.535533845), то после перевода компонент положения изменился только по оси Y, поэтому он перемещается только по оси Y.

1 Ответ

0 голосов
/ 30 октября 2018
Исходный код

GLM для translate:

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;
}

Эффект примененного перевода изменяется компонентом вращения (верхняя левая подматрица 3x3 или первые 3 столбца, если нижняя строка равна 0 0 0 1) существующей матрицы, т. Е .:

glm::translate добавляет вместо добавляет , перевод.

Другими словами, приведенный выше код эквивалентен:

// create an identity matrix and apply the translation
glm::mat4 translation = glm::translate(glm::mat4(1.f), up);

// post-multiply (i.e. the applied translation comes FIRST)
matrix = matrix * translation;

Желаемый эффект может быть достигнут с помощью:

1)

// pre-multiply (i.e. the applied translation comes AFTER)
matrix = translation * matrix;

Или эквивалентно, построить перевод в локальном базисе модели:

2)

// local up vector (Y-axis)
glm::vec3 local_up(0.f, 1.f, 0.f);
local_up *= d;

// apply using translate as before
matrix = glm::translate(matrix, local_up);
...