Исходный код
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);