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) 투영 좌표에서 얻을, 투사가 작업을 조정하는 방식 때문이다 (V 자 3)을 w 좌표로 나눕니다. (0이면 할 수 없습니다.)

투영은 작동하지만 투영은 작동하지 않는 이유는 투영 공간의 회전이 일반 공간과 동일하지만 번역이 다르기 때문입니다.

나는 당신이 당신의 실수를 알아 냈지만, 설명이 도움이 될 것이라고 생각했습니다.

관련 문제