2012-03-29 12 views
13

Mam obiekt, który najpierw chcę obrócić (o jego własne centrum), a następnie przetłumaczyć go do pewnego momentu. Mam glm :: quat, który zawiera rotację i glm :: vec3, która zawiera punkt, do którego musi zostać przetłumaczony.glm łączą obracanie i tłumaczenie

glm::vec3 position; 
glm::quat orientation; 
glm::mat4 modelmatrix; <-- want to combine them both in here 

modelmatrix = glm::translate(glm::toMat4(orientation),position); 

Wtedy w mojej funkcji I czynią ..

pvm = projectionMatrix*viewMatrix*modelmatrix; 
glUniformMatrix4fv(pvmMatrixUniformLocation, 1, GL_FALSE, glm::value_ptr(pvm)); 

..i czynią ...

Niestety obiekt tylko krąży wokół pochodzenia, kiedy stosuje rotację (im dalej "pozycja" od początku, im większa orbita).

Kiedy stosuję tylko pozycję, którą tłumaczy dobrze. Kiedy stosuję tylko obrót, pozostaje on na początku i obraca się wokół środka (zgodnie z oczekiwaniami). Dlaczego więc dziwnie się dzieje, gdy stosuję je oba? Czy brakuje mi czegoś podstawowego?

Odpowiedz

23

Ponieważ stosujesz je w niewłaściwej kolejności. Robiąc glm::translate(glm::toMat4(orientation),position), robisz to równowartość:

glm::mat4 rot = glm::toMat4(orientation); 
glm::mat4 trans = glm::translate(glm::mat4(1.0f), position); 
glm::mat4 final = rot * trans; 

Należy pamiętać, że tłumaczenie jest po prawej stronie matrycy, a nie w lewo. Oznacza to, że tłumaczenie ma miejsce najpierw, a następnie obrót odbywa się w odniesieniu do tłumaczenia. Tak więc rotacja odbywa się w przestrzeni po przetłumaczeniu.

Chcesz, aby rotacja się wydarzyła pierwsza. Zatem odwróć kolejność mnożenia macierzy.

+0

Miałem wrażenie, że glm :: translate stosuje tłumaczenie do pierwszego argumentu funkcji. Dziękuję Ci. – Jubei

+3

@Jubei: It * does * stosuje tłumaczenie do macierzy. Mnoży ją w prawo. Oznacza to, że tłumaczenie ma miejsce * pierwsze *, kiedy chcesz, aby rotacja stała się pierwsza. –

+0

Dziękuję za tę odpowiedź, utknąłem na tym do dzisiaj, ale nawet gdy zorientowałem się, co robiłem źle, po prostu nie mogłem znaleźć żadnego potwierdzenia, że ​​tak powinny działać funkcje. –