2013-08-07 18 views
7

Przekroczyłem bardzo prosty błąd, gdy zacząłem używać glm (w VS2010). Mam ten krótki kod:glm translate matrix nie tłumaczy wektora

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; 

Wynik transformedVector jest taka sama jak jego pierwotnej wartości (1.f, 1.f, 1.f, 0.f). Nie wiem, czego tu brakuje. Próbowałem macierzy obrotu i to działa poprawnie, punkt jest transformowany poprawnie.

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; 

Ok, znalazłem problem. Chciałbym przetłumaczyć wierzchołek, a nie wektor, w tym przypadku musiałem ustawić wartość w na 1.

Odpowiedz

19

Zapominasz o rzutowych współrzędnych. Więc ostatni składnik

glm::vec4 vector 

powinien być 1. więc korekta jest po prostu w ten sposób:

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; 

Wynika to w sposób rzutowy koordynuje pracę, przede wszystkim, aby uzyskać od współrzędnych rzutowych (vec4) do normalnych współrzędnych (vec3) dzielisz według składowej w. (Którego nie możesz zrobić, jeśli jest zero.)

Powodem, dla którego działa na obroty, ale nie na tłumaczenia, jest to, że w przestrzeni rzutowej obrót jest "taki sam" jak w normalnej przestrzeni, ale tłumaczenia są różne.

Właśnie zauważyłem, że udało ci się rozwiązać swój błąd, ale myślałem, że wyjaśnienie może ci pomóc.