Wie drehe ich die Kamera zentriert um die Position der Kamera?

7

Zur Zeit benutze ich gluLook wie folgt:

gluLookAt(position.x, position.y, position.z,
          viewPoint.x, viewPoint.y, viewPoint.z,
          upVector.x, upVector.y, upVector.z);

Wenn Sie mehr Informationen benötigen, wissen Sie nicht, wie ich sie ändern kann, damit sich die Kamera so verhält, als würde sie sich um sich selbst drehen, anstatt sich um ihren Blickwinkel zu drehen. Den aktuellen Code finden Sie unter https://github.com/dchhetri/OpenGL-City/blob/master/opengl_camera.cpp . Diese Klasse wurde von codecolony.com angepasst.

tnutty
quelle

Antworten:

4

Ich bin mir nicht sicher, ob ich Ihr Problem richtig verstanden habe, aber ich werde trotzdem versuchen, es zu beantworten.

gluLookAt()Wie der Name schon sagt, wird eine Ansichtsmatrix für eine Kamera erstellt und drei Vektoren als Parameter verwendet.

Der erste ist die Position der Kamera. Hier befindet sich Ihre Kamera. Wenn Sie möchten, dass sich Ihre Kamera um sich selbst dreht, möchten Sie höchstwahrscheinlich nicht, dass sich dieser Parameter ändert.

Der zweite ist der Ort des interessierenden Punktes oder wo Ihre Kamera gezeigt wird.

Der dritte ist ein Vektor, der darstellt, wo 'up' ist.

Wie Sie bereits erwähnt haben, soll sich Ihre Kamera um sich selbst drehen. Es gibt tatsächlich drei Bedeutungen von "Rotation" im dreidimensionalen Raum:

Angenommen, dieses schöne Flugzeug, das uns Wikipedia gespendet hat, ist Ihre Kamera:

Flugzeug

Gieren (Gieren?) Ist ziemlich einfach. Sie halten Ihren 'up'-Vektor auf (0, 1, 0) und ändern den Blickwinkel so, dass er sich um die XZ-Ebene dreht, indem Sie ihn auf (cos (Theta), 0, sin (Theta)) setzen.

Der Einfachheit halber nehme ich an, dass sich Ihre Kamera bei (0, 0, 0) befindet. Wenn nicht, können Sie einfach den Standort Ihrer Kamera zu Ihrem Sonderziel hinzufügen.

Das Rollen ist auch ganz einfach. Sie halten den interessierenden Punkt statisch und ändern den 'up'-Vektor so, dass er sich um die XY-Ebene dreht, indem Sie ihn auf (cos (Theta), sin (Theta), 0) setzen.

Der Einfachheit halber nehme ich noch einmal an, Sie betrachten (0, 0, 1) oder (0, 0, -1).

Schließlich ist das Pitching etwas komplizierter, da Sie gleichzeitig Ihren Point-of-Interest- und Up-Vektor ändern, aber es ist auch nicht so kompliziert.

Beginnen wir damit, den interessierenden Punkt so zu ändern, dass er sich um die YZ-Ebene dreht, indem wir ihn auf (0, sin (Theta), cos (Theta)) setzen. Dadurch wird die Kamera gedreht.

Um die Kamera zu stabilisieren, müssen wir den Aufwärtsvektor so einstellen, dass er sowohl zum interessierenden Punktvektor als auch zur X-Achse orthogonal ist. Sie können es auch mit trigonometrischen Funktionen erstellen oder die Funktionen des Kreuzprodukts verwenden, das genau das tut. Sie setzen also den 'up'-Vektor auf cross (point_of_interest, (1, 0, 0)). Wenn Ihre Kamera auf dem Kopf steht, kehren Sie die Parameter um oder machen Sie stattdessen das Kreuzprodukt mit (-1, 0, 0).

Dies umfasst die drei Hauptdrehungen. Bei komplizierteren Rotationen werden Quaternionen verwendet. Quaternions ist ein etwas komplizierteres Thema, das ich nicht in einer einfachen Antwort behandeln kann, aber ich bin sicher, dass es online viele Tutorials gibt.

Einen schönen Tag noch.

Panda Pyjama
quelle
2

Das einfache Beispiel ist das Drehen in der xy-Ebene (up = z).

Um das Objekt (am Ursprung) im Abstand R zu umkreisen, verwenden Sie LookAt = 0,0,0; Position = R*cos(a),R*sin(a),0;

Um stattdessen die Kamera zu drehen, lauten die Gleichungen LookAt = x + cos(a), y + sin(a), 0: Position = x, y, 0; `

Es ist im Grunde eine Vektormathematik, bei der sich der Vektorursprung und das Ziel ändern.

Aki Suihkonen
quelle