Wie konnte einfach Aufruf Pitch () und Yaw () veranlassen, die Kamera schließlich Roll ()?

StackOverflow https://stackoverflow.com/questions/784445

  •  16-09-2019
  •  | 
  •  

Frage

Ich bin Codierung eine grundlegende OpenGL-Spiel und ich habe einige Code bekam, dass die Maus in Bezug auf die Bewegung der Kamera verarbeitet.

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 der Suche im Kreis werden Sie die Kamera finden beginnt zu „rollen“ (drehen). Da ich nur anrufen Pitch- und Azimut, ich sehe nicht, wie dies möglich ist.

Hier ist der Code Ich verwende für meine Kamera-Klasse: http://pastebin.com/m20d2b01e

Soweit ich weiß, meine Kamera „Rollen“ sollte nicht passieren. Es sollte einfach Pech nach oben und unten oder Gieren nach links und rechts. NICHT rollen.

Was könnte die Ursache sein?

War es hilfreich?

Lösung

Congratulations - Sie Lie Gruppentheorie entdeckt haben!

Ja, es ist möglich. Das Ergebnis einer Reihe von Transformationen ist abhängig von der Reihenfolge, in der sie ausgeführt sind. Doing einen Platz gefolgt von einer Gier ist nicht das gleiche wie ein ein Gier tun, gefolgt durch ein Feld. In der Tat, in der Grenze von verschwindend klein giert und Tonhöhen, beträgt der Unterschied zu einer reinen Walze; die allgemeine Fall ist ein wenig komplizierter.

(Physiker nennen dies die „Kommutierung Beziehungen die Drehgruppe“).

Wenn Sie mit Drehmatrizen vertraut sind, können Sie es klappen ziemlich einfach.

Andere Tipps

Sie werden wahrscheinlich quaternions zum Komponieren Rotationen verwenden müssen, wenn Sie nicht bereits tun . Dies vermeidet das Problem von Gimbal Lock , die Sie bekommen können, wenn eine Kamera durch Drehung um die drei Achsen zu orientieren .

Hier ist, wie zwischen ihnen zu konvertieren.

Nun, wenn Sie vorwärts horizontal zum Horizont beginnen, Tonhöhe nach oben um 90 Grad, dann links Gier 90 Grade, dann um 90 Grad nach unten aufschlagen, Sie in der gleichen Richtung würden, wie Sie begonnen, aber der Horizont würde senkrecht stehen (als ob Sie 90 Grad gerollt würde links).

Bearbeiten : Ich denke, das Problem ist, dass Gier / Pitch / Roll angemessen wäre, wenn die Kamera wie ein Flugzeug behandelt wird. Was möchten Sie wahrscheinlich zu tun ist, behandeln es wie ein Punkt in einer Kugel, die Verfolgung von wo auf der Kugel der Kamera zeigen. Anstelle von Gier- / Nick verwendet sphärische Koordinaten von Theta (Breite) und Phi (Länge) zu verfolgen. Sie können ähnlich klingen, aber bedenken Sie den extremen Fall, in dem die Kamera direkt nach oben zeigt. Mit Gieren / Pitch, können Sie frei einstellen die Gier- und Nick von dieser straight-up-Richtung. Mit Theta / phi, konnte man nur Theta nach unten anpassen und egal, wie viel Sie eingestellten phi, abnehmend würde Theta Sie noch eine Kamera geben, die sich bis zum Horizont parallel ist. Dies ist, wie FPS Kamera Arbeit (Sie können nicht so weit schauen nach unten, dass Sie hinter Sie suchen).

Edit 2 : an der Kamera Code suchen Sie verbunden sind, möchten Sie werden mit der rotLati(float angle) und rotLongi(float angle) Funktionen

Mathematisch ist der Grund dafür ist, dass Drehungen im 3D-Raum pendeln nicht. Was das bedeutet, ist, dass Teilung (), gefolgt von Gieren () ist nicht das gleiche wie Gieren (), gefolgt von Teilung (), sondern eine Folge dieser Tatsache ist, dass die drei Arten von Drehungen sind untrennbar miteinander verbunden und Sie können jede nicht ausführen zwei von ihnen, ohne etwas von der dritten zu bekommen. Mit anderen Worten, jede Folge von Tonhöhe () n und Gieren () s wird eine spürbare Rolle () Effekt im Laufe der Zeit zu produzieren, es sei denn, die zweite Hälfte der Sequenz die genaue Umkehrung der ersten Hälfte. (Es gibt eine Menge von ziemlich komplizierter Mathematik daran beteiligt, aber die Details sind nicht besonders relevant)

Pitch / Gier / Roll sind alle relativ zur Ausrichtung Ihres Fahrzeugs. Wenn Sie die Tonhöhe nach oben / unten, ändern Sie Ihre Achse Gieren. Ebenso, wenn Sie gieren, können Sie Ihre Nickachse ändern. So ist es möglich, die Orientierung in einer Art und Weise ähnlich wie ein Rollmanöver zu ändern, nur durch eine Kombination und Pitch & Giermanöver.

Ich glaube, diesen Umstand genannt Gimbal Lock - es gibt ein Beispiel dafür mit Abbildungen auf die wikipedia-Seite.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top