2009-04-24 3 views
1

Ich habe ein grundlegendes OpenGL-Spiel programmiert und ich habe Code, der die Maus in Bezug auf das Bewegen der Kamera handhabt.Wie könnte man einfach Pitch() und Yaw() aufrufen, um die Kamera schließlich zu rollen()?

Ich verwende die folgende Methode:

int windowWidth = 640; 
int windowHeight = 480; 

int oldMouseX = -1; 
int oldMouseY = -1; 

void mousePassiveHandler(int x, int y) 
{ 
    int snapThreshold = 50; 

    if (oldMouseX != -1 && oldMouseY != -1) 
    { 
     cam.yaw((x - oldMouseX)/10.0); 
     cam.pitch((y - oldMouseY)/10.0); 


     oldMouseX = x; 
     oldMouseY = y; 

     if ((fabs(x - (windowWidth/2)) > snapThreshold) || (fabs(y - (windowHeight/2)) > snapThreshold)) 
     { 
      oldMouseX = windowWidth/2; 
      oldMouseY = windowHeight/2; 
      glutWarpPointer(windowWidth/2, windowHeight/2); 
     } 
    } 
    else 
    { 
     oldMouseX = windowWidth/2; 
     oldMouseY = windowHeight/2; 
     glutWarpPointer(windowWidth/2, windowHeight/2); 
    } 


    glutPostRedisplay(); 

} 

Doch nach im Kreis umsah werden Sie die Kamera finden beginnt zu „rollen“ (drehen). Da ich nur Pitch and Yaw rufe, sehe ich nicht, wie das möglich ist.

Hier ist der Code, den ich für meine Kamera-Klasse: http://pastebin.com/m20d2b01e

Soweit ich weiß, meine Kamera „Rollen“ sollte nicht passieren. Es sollte einfach auf und ab oder gieren nach links und rechts. NICHT rollen.

Was könnte das verursachen?

Antwort

11

Glückwunsch - Sie haben die Lie-Gruppentheorie entdeckt!

Ja, es ist möglich. Das Ergebnis einer Reihe von Transformationen hängt von der Reihenfolge ab, in der sie ausgeführt werden. Ein Pitch zu tun, gefolgt von einem Gieren ist nicht das gleiche wie ein Gieren, gefolgt durch eine Tonhöhe. In der Tat, in der Grenze der infinitesimal kleinen Gieren und Peche, der Unterschied beläuft sich auf eine reine Rolle; der allgemeine Fall ist ein wenig komplizierter.

(Physiker nennen dies die "Kommutierungsbeziehungen von der Rotationsgruppe".)

Wenn Sie mit Rotationsmatrizen vertraut sind, können Sie es problemlos erarbeiten.

+0

heh, sieht aus, als ob wir genau dasselbe gedacht hätten ;-) –

5

Nun, wenn Sie beginnen, nach vorne zum Horizont Horizontale Ansicht, 90 Grad nach oben, dann nach links 90 Grad gieren, dann 90 Grad nach unten, würden Sie in die gleiche Richtung wie Sie begonnen haben, aber den Horizont wäre vertikal (als ob du um 90 Grad nach links gerollt wärst).

Bearbeiten: Ich denke, das Problem ist, dass Gieren/Pitch/Roll wäre angemessen, wenn die Kamera wie ein Flugzeug behandelt wird. Was Sie wahrscheinlich tun möchten, ist, es wie einen Punkt in einer Kugel zu behandeln und zu verfolgen, wo auf der Kugel Sie die Kamera zeigen. Verwenden Sie anstelle von Gieren/Abstand sphärische Koordinaten, die Theta (Breitengrad) und Phi (Längengrad) verfolgen. Sie mögen ähnlich klingen, aber betrachten Sie den extremen Fall, in dem die Kamera direkt nach oben zeigt. Bei Gieren/Neigen können Sie die Gier- und Nickbewegung immer noch von dieser geraden Richtung aus frei einstellen. Mit Theta/Phi konnten Sie Theta nur nach unten einstellen, und egal, wie stark Sie Phi anpassten, eine abnehmende Theta würde Ihnen immer noch eine Kamera geben, die parallel zum Horizont ist. So funktioniert die FPS-Kamera (Sie können nicht so weit nach unten schauen, dass Sie hinter sich schauen).

Edit 2: in die Kamera Code suchen Sie verbunden sind, möchten Sie die rotLati(float angle) und rotLongi(float angle) Funktionen werden.

+0

Wenn ich meine Maus in engen Kreisen auf dem Bildschirm bewegen, werden Sie eine deutliche und langsame Rolle sehen. Es rollt komplett alle 360 ​​Grad. Es invertiert die Ansicht nicht. – KingNestor

+0

+1 Beat mich dazu. Wenn Sie Ihre Maus in engen Kreisen bewegen, erhalten Sie kleine Rollen. So funktioniert die Kombination von Bewegungen. – Eclipse

+0

gut, wenn Sie die 90er in meiner Antwort durch 20 ersetzen, wäre die Antwort immer noch die gleiche. Sich in Kreisen zu bewegen, würde im Grunde das tun, was ich beschreibe. – Kip

3

Pitch/Gier/Roll sind alle relativ zur Ausrichtung Ihres Fahrzeugs. Wenn Sie hoch/runter pendeln, ändern Sie Ihre Gierachse. Wenn Sie gieren, ändern Sie ebenfalls Ihre Nickachse. So ist es möglich, Ihre Ausrichtung ähnlich wie bei einem Roll-Manöver nur durch eine Kombination von 0 und & Giermanövern zu ändern.

3

Ich glaube, dieser Umstand heißt Gimbal Lock - es gibt ein Beispiel dafür mit Illustrationen auf der Wikipedia-Seite.

4

Mathematisch ist der Grund dafür ist, dass Drehungen im 3D-Raum pendeln nicht. Was das bedeutet, ist, dass Pitch() gefolgt von Gieren() nicht dasselbe ist wie Gieren() gefolgt von Pitch(), aber eine Konsequenz dieser Tatsache ist, dass die drei Arten von Rotationen untrennbar miteinander verbunden sind und du keine durchführen kannst zwei von ihnen, ohne etwas von dem dritten zu bekommen. Mit anderen Worten, jede Folge von Tonhöhen() und Gieren() s wird im Laufe der Zeit einen merklichen Roll() Effekt erzeugen, es sei denn, die zweite Hälfte der Sequenz ist die genaue Umkehrung der ersten Hälfte. (Es gibt eine Menge ziemlich komplizierter Mathematik beteiligt, aber die Details sind nicht besonders relevant)

Verwandte Themen