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?
Miałem wrażenie, że glm :: translate stosuje tłumaczenie do pierwszego argumentu funkcji. Dziękuję Ci. – Jubei
@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. –
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. –