2010-07-31 16 views
14

Nie chcę wchodzić w złożoną trygonometrię, aby obliczyć obroty i podobne rzeczy w moim świecie 3D, więc gluLookAt wydaje się być dobrą alternatywą. Zgodnie z dokumentacją wszystko, co muszę zrobić, to umieścić 3 współrzędne dla pozycji kamery, trzy dla tego, na co powinienem patrzeć i pozycję "do góry". To ostatnie nie miało sensu, dopóki nie przypuszczałem, że musi być pod kątem prostym z linią wzroku w kierunku, w którym powinna znajdować się góra ekranu.Jak prawidłowo używać gluLookAt?

To w ogóle nie działa. Mam trochę kodu Pythona. Jest to kod, który inicjuje pewne dane i trochę kodu tryb dla kiedy wprowadzić tę część gry:

def init(self): 
    self.game_over = False 
    self.z = -30 
    self.x = 0 
def transfer(self): 
    #Make OpenGL use 3D 
    game.engage_3d(45,0.1,100) 
    gluLookAt(0,0,-30,0,0,0,0,1,0) 

„game.engage_3d (45,0.1,100)” w zasadzie tworzy macierz projekcji mieć 45 ° kąt widzenia i bliskie i dalekie współrzędne 0,1 i 100.

Pierwszy gluLookAt ustawia aparat we właściwej pozycji, ładnie.

Mam sześcian narysowany ze środkiem (0,0,0) i działa dobrze bez gluLookAt. Zanim go narysuję, mam ten kod:

gluLookAt(self.x,0,self.z,0,0,0,0,1,0) 
if game.key(KEY_UP): 
    self.z += 2.0/game.get_fps() 
if game.key(KEY_DOWN): 
    self.z -= 2.0/game.get_fps() 
if game.key(KEY_LEFT): 
    self.x += 2.0/game.get_fps() 
if game.key(KEY_RIGHT): 
    self.x -= 2.0/game.get_fps() 

Teraz pozycja górna powinna zawsze być taka sama jak zawsze pod kątem prostym. Myślałem, że to zrobi, to przesuwanie do przodu i do tyłu osi z za pomocą klawiszy w górę iw dół oraz w lewo i w prawo przez oś X za pomocą lewego i prawego klawisza. To, co się dzieje, polega na tym, że kiedy używam lewego i prawego klawisza, sześcian obraca się wokół "oka" przyspieszanego przez klawisze. Klawisz w górę powoduje, że kolejna kostka znikąd przesuwa się po ekranie i trafia w pierwszą kostkę. Naciśnięcie klawisza przywraca tajemniczy sklonowany sześcian. Można to połączyć z rotacją, aby dać zupełnie inny wynik, jak wynikałoby z dokumentacji.

Co na ziemi jest nie tak?

Dziękuję.

Odpowiedz

37

(intuicja za wektorem "up" w gluLookAt jest prosta: popatrz na wszystko, teraz pochyl swoją głowę o 90 stopni, gdzie nie zmieniłeś się, kierunek, w którym patrzysz, nie zmienił się, ale obraz w twojej siatkówce wyraźnie ma ... Jaka jest różnica? Gdzie wskazuje czubek głowy To jest wektor up.)

Ale aby odpowiedzieć na twoje pytanie: połączenia gluLookAt nie powinny być łączone. Innymi słowy, tylko wzór, w którym to OK, aby użyć gluLookAt jeśli nie wiem dokładnie, jak to działa, to:

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
gluLookAt(...); 
# do not touch the modelview matrix anymore! 

Wydaje się z kodem, który robisz coś takiego:

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
gluLookAt(...); 
# some stuff.. 
gluLookAt(...); 

Spowoduje to wygenerowanie dziwnych wyników, ponieważ gluLookAt mnoży bieżącą macierz przez matrycę wyświetlania, którą oblicza. Jeśli chcesz łączyć transformacje, lepiej jest zastanowić się, jak sprawić, by glTranslate, glScale i glRotatef działały dla Ciebie. Co więcej, powinieneś nauczyć się, jak działają transformacje współrzędnych i trzymać się GlMultMatrix.

+0

Dziękuję bardzo. Teraz działa idealnie. Mogę teraz przejść do bardziej zaawansowanych rzeczy. Ale czy mówisz, że gluLookAt jest wolny? –

+2

Nie chodzi o to, że jest wolny. To, że gluLookAt ukrywa kilka rzeczy, o których powinieneś wiedzieć, kiedy robisz poważne programy OpenGL. W szczególności powinieneś nauczyć się łączyć różne transformacje współrzędnych.To wymaga przyzwyczajenia się i na początku jest nieco frustrujące, ale w końcu się opłaca: wiele technik graficznych opiera się na przemyślnym przekształcaniu układów współrzędnych. –

+36

+1, jeśli faktycznie przechyliłeś głowę :-) –