2012-04-03 11 views
2

Ich versuche eine einfache Szene zu schaffen, in der ich herumlaufen kann, mit den Kriterien, in der Lage zu sein, herumzuschwenken und mit den Schlüsseln herumzulaufen. In meiner Zeichnungsszenenfunktion, wenn ich meine Szene übersetze, aber nicht rotiere, funktioniert das Schwenken nicht richtig, da sich die gesamte Szene nur um mich herum dreht, was dazu führt, dass Objekte durch mich gehen. Wenn ich meine Szene rotiere, kann ich richtig herumschwenken, aber ich kann mich nur in eine bestimmte Richtung bewegen. Wenn ich also um 90 Grad nach rechts schwenke, bewege ich mich nach links, anstatt vorwärts zu gehen. Gibt es überhaupt wo ich diese 2 Effekte zusammensetzen kann?Soll ich zuerst übersetzen oder zuerst drehen?

Dies ist der Code, den ich meiner Ansicht nach zeichnen verwenden:


glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 
glLoadIdentity(); 
glPushMatrix(); 

glTranslated(xposition, 0, zposition); //This is where I translate my views 
glRotated(yrot, 0, 1, 0); // 

glEnableClientState(GL_NORMAL_ARRAY); 
glEnableClientState(GL_COLOR_ARRAY); 
glEnableClientState(GL_VERTEX_ARRAY); 
glBindBuffer(GL_ARRAY_BUFFER_ARB, quadVBO); 

glNormalPointer(GL_FLOAT, 0, (void*)sizeof(sideArray)); 
glColorPointer(3, GL_FLOAT, 0, (void*)sizeof(sideArray)+sizeof(normals)); 
glVertexPointer(3, GL_FLOAT, 0, 0); 

glDrawArrays(GL_QUADS, 0, sizeof(sideArray)/sizeof(GLfloat)/3); 

glPopMatrix(); 
glFlush(); 
glDisableClientState(GL_VERTEX_ARRAY); 
glDisableClientState(GL_COLOR_ARRAY); 
glDisableClientState(GL_NORMAL_ARRAY); 
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); 

Hier sind einige Bilder, die jetzt mein Problem veranschaulichen:

drehen dann übersetzen:

Pic1

http://dl.dropbox.com/u/2747708/Screen%20Shot%202012-04-03%20at%2010.17.39%20PM.PNG

Bild2

kann ich die Wende des

http://dl.dropbox.com/u/2747708/Screen%20Shot%202012-04-03%20at%2010.17.48%20PM.PNG

Pic3

jedoch

Kamera imitieren, wenn ich nach vorne gehen, ist es nur in eine Richtung geht, und nicht die Richtung an ich suche.

http://dl.dropbox.com/u/2747708/Screen%20Shot%202012-04-03%20at%2010.18.30%20PM.PNG

http://dl.dropbox.com/u/2747708/Screen%20Shot%202012-04-03%20at%2010.18.39%20PM.PNG

Übersetzen dann Drehen:

Pic1

http://dl.dropbox.com/u/2747708/Screen%20Shot%202012-04-03%20at%2010.19.44%20PM.PNG

Pic2

ich bewegen kann frei herumlaufen und in jede Richtung gehen, in die ich schaue.

http://dl.dropbox.com/u/2747708/Screen%20Shot%202012-04-03%20at%2010.19.52%20PM.PNG

Pic3

Allerdings, wenn ich drehen die Szene, die ganze Sache dreht, welche Objekte verursacht durch mich zu befestigen und nicht „pan“ durch den Blick mehr wie wenn ich drehen dann übersetze meine Sichtweise.

http://dl.dropbox.com/u/2747708/Screen%20Shot%202012-04-03%20at%2010.20.01%20PM.PNG

Antwort

1

Ich bin mir nicht sicher, wie ich Kendalls Antwort kommentieren oder hinzufügen soll, also füge ich das einfach als neue Antwort hinzu.

Ich glaube, Sie können bis Y verwenden, so würden Sie diese verwenden, wenn Richtung in Radian ist:

movementX = sin(direction); 
movementZ = cos(direction); 

wenn Richtung in Grad ist, werden Sie es in Radiant umwandeln müssen:

radians = degrees*(PI/180); 

multiplizieren Sie einfach die Bewegung von 1 oder -1 je nachdem, ob Sie vorwärts oder rückwärts bewegen:

movementX = sin(direction)*forwardsBackwards; 
movementZ = cos(direction)*forwardsBackwards; 

Wenn Sie auch benötigen strafing können Sie tun:

movementX = sin(direction)*forwardsBackwards+sin(direction+1.5707)*sideToSide; 
movementZ = cos(direction)*forwardsBackwards+cos(direction+1.5707)*sideToSide; 

Wo sideToSide 1 oder -1 basierend auf, wenn Sie strafing links oder rechts. Die 1,5707 ist 90 Grad im Bogenmaß (PI/2), was bedeutet, dass unabhängig von der Richtung, in die Sie blicken, der 90-Grad-Winkel rechts davon liegt. Sie können der Graddrehung auch 90 Grad hinzufügen, bevor Sie konvertieren, wenn Sie möchten.

Multiplizieren Sie die ganze Sache durch die gewünschte Bewegungsgeschwindigkeit:

movementX = (sin...eToSide)*speed; 
movementZ = (cos...eToSide)*speed; 

Dies wird jedoch eine straferunning Effekt erzeugen, wo Sie bewegen sich schneller, wenn Sie in zwei Richtungen gleichzeitig zu bewegen. Wenn Sie es machen wollen, so ist das nicht der Fall fügen Sie diese vor der Berechnung Bewegung:

if (!forwardsBackwards && !sideToSide) 
{ 
    forwardsBackwards *= 0.7071; 
    sideToSide *= 0.7071; 
} 

Sie auch 0,7071 mit cos ersetzen könnte (45), wenn Sie es brauchen extrem genau zu sein.

Alternativ können Sie:

float diagonalMod = 1; 
if (!forwardsBackwards && !sideToSide) 
    diagonalMod = 0.7071; // or cos(45) 

movementX = (sin...eToSide)*speed*diagonalMod; 
movementZ = (cos...eToSide)*speed*diagonalMod; 

Sie wollen zuerst drehen und dann übersetzen. Der andere Weg, wenn ich darüber nachdenke, ist im Grunde wie der Punkt zu bewegen, an dem sich die Kamera dreht, der Drehpunkt. Deshalb würden Sie Objekte beim Drehen durchschneiden.

Auch sollten Sie "Kamera" Rotation und Übersetzung sofort nach einem glLoadIdentity(); wie du willst, dass sich alles andere in deiner Szene bewegt und rotiert, so funktioniert eine OpenGL "Kamera". Dies ist, wie wäre es so eingerichtet werden:

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 
glLoadIdentity(); 

glRotated(yrot, 0, 1, 0); 
glTranslated(xposition, 0, zposition); 

glPushMatrix(); 

Und für die Zukunft im Fall erweitern Sie darauf:

glRotatef(Pitch, 1, 0, 0); // Up and down look 
glRotatef(Yaw, 0, 1, 0); // Left and right look 
glRotatef(Roll, 0, 0, 1); // Like a barrel roll in a jet 
glTranslatef(X,Y,Z); 
3

Ihr Problem ist nicht mit der Reihenfolge der Transformationen. Sie sollten rotieren und dann übersetzen.

Das Problem ist, dass Sie die Rotation beim Verschieben nicht berücksichtigen. Die Formel für die Bewegung:

movementX = sin(direction); 
movementY = cos(direction); 

wo Richtung ist die Anzahl von Radianten von Norden im Uhrzeigersinn gedreht, und die positiven X Osten und positiver Y Norden.

Verwandte Themen