glm translate matrix не переводит вектор

Я пересек очень простую ошибку, когда начал использовать glm (в VS2010). У меня есть этот короткий код:

glm::mat4 translate = glm::translate(glm::mat4(1.f), glm::vec3(2.f, 0.f, 0.f));
glm::vec4 vector(1.f,1.f,1.f,0.f);
glm::vec4 transformedVector = translate * vector;

Результат преобразованного вектора совпадает с исходным значением (1.f, 1.f, 1.f, 0.f). Я не знаю, что мне здесь не хватает. Я попробовал матрицу вращения, и она работает нормально, точка трансформируется правильно.

glm::mat4 rotate = glm::rotate(glm::mat4(1.f), 90.f, glm::vec3(0.f, 0.f, 1.f));
glm::vec4 vector(1.f, 1.f, 1.f, 0.f);
glm::vec4 transformedVector = rotate * vector;

Хорошо, я обнаружил проблему. Я хотел бы перевести вершину, а не вектор, в этом случае мне пришлось установить значение w равным 1.


person user2661133    schedule 07.08.2013    source источник


Ответы (1)


Вы забываете о проективных координатах. Итак, последний компонент

glm::vec4 vector

должно быть 1. Итак, исправление просто делает это:

glm::mat4 translate = glm::translate(glm::mat4(1.f), glm::vec3(2.f, 0.f, 0.f));
glm::vec4 vector(1.f,1.f,1.f,1.f);
glm::vec4 transformedVector = translate * vector;

Это связано с тем, как работают проективные координаты, по сути, чтобы перейти от проективных координат (vec4) к нормальным координатам (vec3), которые вы делите на компонент w. (Что вы не можете сделать, если это ноль.)

Причина, по которой это работает для поворотов, но не для переводов, заключается в том, что в проективном пространстве повороты «такие же», как и в обычном пространстве, но переводы другие.

Я только что заметил, что вы исправили свою ошибку, но я подумал, что объяснение может помочь.

person David    schedule 24.09.2013