Co zrobić, aby obiekt obracał się wokół gracza.

0

Witam,
robię grę wyścigową w OpenGL i chciałbym aby niezależnie od skrętu kamery auto było przed oczami gracza.
Próbuję to zrobić już od dłuższego czasu, napiszę jak ja to robię, a was proszę o wskazanie błędów ^^

  1. glRotatef (obracam kamerę tam gdzie patrzy gracz)
  2. glTranslatef (przenoszę gracza w odpowiednie miejsce)
  3. glPushMatrix (dodaję jeden macierz do stosu (chcę poruszyć jakiś obiekt jednocześnie nie ruszając gracza))
  4. glTranslatef (zmieniam pozycję auta na pozycję gracza + ileśtam, żeby gracz miał auto przed sobą)
  5. glRotatef (obracam auto o tyle stopni o ile obrócił się gracz. W ten sposób chcę osiągnąć to, że auto jest zawsze na wprost gracza)
  6. glPopMatrix (wyrzucam macierz ze stosu)

I teraz możecie mi rozjaśnić co tu jest nie tak? Ten kod daje taki efekt, że zamiast auto obracać się wokoło mnie (tj. wg. mojej osi) to obraca się wg. osi głównej (0). Dlaczego?
Z góry dziękuję i pozdrawiam.

0

Jeżeli robisz w OpenGL to użyj biblioteki Frustum, natomiast jeżeli korzystasz ze starszej wersji, to dlaczego nie robisz tego za pomocą funkcji GluLookAt()?

0
MJay napisał(a)

Jeżeli robisz w OpenGL to użyj biblioteki Frustum, natomiast jeżeli korzystasz ze starszej wersji, to dlaczego nie robisz tego za pomocą funkcji GluLookAt()?

Co do wersji OpenGL to mówiąc szczerze nie wiem :P Korzystam z biblioteki GLUT
Jeśli zaś chodzi o GluLookAt to (z tego co wiem, pewny nie jestem) ta funkcja pozwala na zmianę pozycji kamery. Ja natomiast z pozycją kamery nie mam problemu xD

0

Jeśli chcesz być nowoczesny to marsz używać shaderów, fixed pipeline już dawno przestarzałe :>

  1. glRotatef (obracam kamerę tam gdzie patrzy gracz)
  2. glTranslatef (przenoszę gracza w odpowiednie miejsce)
  3. glPushMatrix (dodaję jeden macierz do stosu (chcę poruszyć jakiś obiekt jednocześnie nie ruszając gracza))
  4. glTranslatef (zmieniam pozycję auta na pozycję gracza + ileśtam, żeby gracz miał auto przed sobą)
  5. glRotatef (obracam auto o tyle stopni o ile obrócił się gracz. W ten sposób chcę osiągnąć to, że auto jest zawsze na wprost gracza)
  6. glPopMatrix (wyrzucam macierz ze stosu)

Tak jak pisałem, te wszystkie funkcje są już dawno przestarzałe...
Popatrz na to tak że każda funkcja obraca/przesuwa cały świat. Pozwól że zmienię twoje opisy:

  1. glRotatef (obracam świat aby stworzyć iluzję obrotu kamery)
  2. glTranslatef (przesuwam świat o wektor)
    // rysuje gracza zapewne - od tej chwili zmiany macierzy nie mają wpływu na to gdzie gracz się znajdzie na ekranie
  3. glPushMatrix (zapisuje macierz na stos)
  4. glTranslatef (przesuwam świat DRUGI RAZ (wychodzi suma przesunięć)
  5. glRotatef (obracam świat DRUGI RAZ, Względem podanej w parametrze osi. Właściwie niepotrzebnie.)
  6. glPopMatrix (wyrzucam macierz ze stosu)
0

czyli? jak polecacie to zrobić? Bo już sam nie wiem...
@up tylko małe pytanie: skoro chcę być nowoczesny to mam używać shaderów? Wybaczcie moją niewiedzę ale gdzieś czytałem że to są cienie :/

0

Shadery to takie programy do przekształcania danych. Tłumaczysz sobie z języka angielskiego zbyt dosłownie. Shadery pisze się w OpenGL Shading Language (GLSL) ma on bardzo podobną składnię do języka C.

1 użytkowników online, w tym zalogowanych: 0, gości: 1