Witam !
Na wszelki wypadek, chciałbym przeprosić, jeśli temat umieściłem w nie tym dziale co trzeba, ale nie znalazłem kategorii odnośnie grafiki komputerowej.
Przedstawiając mój problem, to mam zrobić animację w OpenGl przedstawiającą podwozie lokomotywy, które z geometrycznej perspektywy, składa się 1 głównego prostopadłościanu, 4 walców reprezentujących koła oraz 2 poruszających się belek w postaci prostopadłościanów. Generalnie największy problem mam właśnie z ruchem belki, która ma wykonywać charakterystyczną "ósemkę" (proszę nie patrzeć na sens fizyczny tego ruchu ;) ) - tzn. że gdy belka na jednym kole jest "na dole", to na drugim jest "na górze" i dwa końce belki zataczają kółka w dwie różne strony. Do rozwiązania swojego problemu postanowiłem po prostu zrobić przede wszystkim na belce transformacje przesunięcia, aby belka przesuwała się, robiąc końcami kółka, a za odpowiednie pochylenie belki miała posłużyć rotacja wokół osi naszej belki. I tutaj mam problem, że środek ciężkości mojej belki też się przesuwa i wektor określający oś wokół, której kręci się belka także się zmienia.
Jeszcze co do szczegółów - środek ciężkości znajduje się w punkcie (1.0f, 0.2f, 0.0f) po przesunięciu belki w odpowiednie miejsce. W ogóle to mam powoli dylemat, czy na początku powinienem dokonać translacji, czy rotacji (jakby co wiem, że to co wstawie w kodzie później, zrobi się szybciej, bo...macierze :) ).
Więc podsumowując uważam, że ruch "ósemkowy" powinien zostać osiągnięty poprzez prawidłowe złożenie dwóch ruchów:
- Ruch postępujący belki
// Belka porusza się w płaszczyźnie określonej przez współrzędne y i z.
GLfloat y = -0.2f + 0.15f * glm::cos((GLfloat)glfwGetTime() * glm::radians(-60.0f)); // -0.2f żeby krążyło wokół środka koła, 0.15f - promień
GLfloat z = 0.15f * glm::sin((GLfloat)glfwGetTime() * glm::radians(-60.0f));
model = glm::translate(model, glm::vec3(0.0f, y, z));
- Ruch powodujący odpowiednie nachylenie belki (rotacja):
angle = 0.1f * glm::asin(sin((GLfloat)glfwGetTime() * glm::radians(-60.0f))); // ograniczony kąt obrotu
model = glm::rotate(model, angle, glm::vec3(1.0f, 0.2f, 0.0f)); // bez ruchu postępującego to powoduje takie "wahanie" belki
Próbowałem już wiele kombinacji złożenia tego ruchu, ale nadal mam problem jak uwzględnić, że współrzędne y i z naszego środka ciężkości belki się zmieniają. Z góry dziękuje za wszelkie podpowiedzi.