2013-08-07 2 views
7

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

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; 

Результат transformedVector такой же, как исходное значение (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.

ответ

19

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

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 компонент. (Что вы не можете сделать, если оно равно нулю.)

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

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

Смежные вопросы