2010-07-31 20 views
14

Ich möchte nicht in komplexe Trigonometrie gehen, um Rotationen und ähnliches für meine 3D Welt zu berechnen, daher erscheint gluLookAt als eine gute Alternative. Laut der Dokumentation muss ich nur 3 Koordinaten für die Kameraposition angeben, drei für was ich schauen sollte und eine "Oben" -Position. Das letzte machte keinen Sinn, bis ich annahm, dass es im rechten Winkel mit der Sichtlinie in der Richtung, die der obere Bildschirmrand sein sollte, sein sollte.Wie verwende ich gluLookAt richtig?

Es funktioniert überhaupt nicht so. Ich habe etwas Python-Code. Dies ist der Code, der einige Daten und einige Mode-Code initialisiert, wenn ich diesen Teil des Spiels eingeben:

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)“ im Grunde die Projektionsmatrix richtet ein haben 45 Grad Blickwinkel und nah und fern Koordinaten von 0,1 und 100.

Der erste gluLookAt bringt die Kamera in die richtige Position, schön.

Ich habe einen Würfel mit der Mitte von (0,0,0) gezogen und es funktioniert gut ohne gluLookAt. Bevor ich es zeichnen habe ich diesen Code:

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() 

nun davon sollte immer die obere Position die gleiche sein, wie es immer im rechten Winkel ist. Was ich gedacht hätte, wäre, die Z-Achse mit den Auf- und Abwärtstasten und links und rechts durch die X-Achse mit den linken und rechten Tasten vorwärts und rückwärts zu bewegen. Was tatsächlich passiert ist, wenn ich die linke und rechte Taste benutze, dreht sich der Würfel um das "Auge", das durch die Tasten beschleunigt wird. Die Nach-oben-Taste bewirkt, dass ein anderer Würfel aus dem Nichts durch den Bildschirm schneidet und den ersten Würfel trifft. Der Abwärtstaste bringt den geheimnisvollen geklonten Würfel zurück. Dies kann mit der Rotation kombiniert werden, um ein völlig anderes Ergebnis zu erzielen, als die Dokumentation würde erscheinen.

Was in aller Welt ist falsch?

Vielen Dank.

Antwort

37

(Die Intuition hinter dem "up" Vektor in gluLookAt ist einfach: Schau dir alles an. Nun kippe deinen Kopf um 90 Grad. Wo du bist hat sich nicht verändert, die Richtung, die du betrachtest, hat sich nicht geändert Das Bild in Ihrer Netzhaut hat eindeutig Was ist der Unterschied? Wo ist der Kopf oben zeigt das. Der ist der obere Vektor.)

Aber um Ihre Frage zu beantworten: gluLookAt Anrufe sollten nicht verkettet werden. Mit anderen Worten, in dem das einzige Muster ist es OK gluLookAt zu verwenden, wenn Sie nicht genau wissen, wie es funktioniert, ist die folgende:

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

Es scheint aus dem Code, dass Sie so etwas wie dies zu tun:

Dies wird seltsame Ergebnisse erzeugen, da gluLookAt die aktuelle Matrix mit der von ihr berechneten Darstellungsmatrix multipliziert. Wenn Sie Transformationen verketten möchten, sollten Sie herausfinden, wie glTranslate, glScale und glRotatef für Sie funktionieren. Noch besser, Sie sollten lernen, wie die Koordinatentransformationen funktionieren und bei glMultMatrix bleiben.

+0

Vielen Dank. Es funktioniert jetzt perfekt. Ich kann jetzt zu fortgeschritteneren Dingen übergehen. Aber sagst du, gluLookAt ist langsam? –

+2

Es ist nicht so, dass es langsam ist. Es ist, dass gluLookAt ein paar Dinge versteckt, die Sie wissen sollten, wenn Sie ernsthafte OpenGL-Programmierung machen. Insbesondere sollten Sie lernen, verschiedene Koordinatentransformationen zu kombinieren.Das ist gewöhnungsbedürftig und zunächst etwas frustrierend, aber am Ende zahlt es sich aus: Viele Grafiktechniken bauen auf clevere Koordinatensysteme auf. –

+36

+1 wenn du deinen Kopf neigst :-) –

Verwandte Themen