Warum ?
Weil eine Kamera eine Projektionsansicht darstellt.
Bei einer 3D-Kamera (Virtual Camera) bewegt sich die Kamera jedoch anstelle der Welt. Ich habe diese Antwort später ausführlich erläutert.
Mathematisch verstehen
Die Projektionsansicht bewegt sich im Raum und ändert seine Ausrichtung. Als erstes ist zu beachten, dass sich die gewünschte Projektion auf dem Bildschirm nicht mit der Blickrichtung ändert.
Aus diesem Grund transformieren wir andere Dinge, um die gewünschte Projektion zu erhalten.
Informationen unter http://opengl.org
Um den Eindruck zu erwecken, die Kamera zu bewegen, muss Ihre OpenGL-Anwendung die Szene mit der Umkehrung der Kameratransformation verschieben. Bei OpenGL gibt es keine Kamera. Insbesondere befindet sich die Kamera immer an der Augenraumkoordinate (0, 0, 0).
Informationen unter http://open.gl
Außerdem möchten Sie die folgenden Zeilen aus dem View-Matrix- Teil von http://open.gl/transformations freigeben
Um eine Kameratransformation zu simulieren, müssen Sie die Welt mit der Umkehrung dieser Transformation transformieren. Beispiel: Wenn Sie die Kamera nach oben bewegen möchten, müssen Sie stattdessen die Welt nach unten bewegen.
Verständnis durch Perspektive
In der realen Welt sehen wir Dinge auf eine Art und Weise, die "Perspektive" genannt wird.
Perspektive bezieht sich auf das Konzept, dass weiter entfernte Objekte kleiner erscheinen als Objekte, die näher an Ihnen liegen. Perspektive bedeutet auch, dass Sie, wenn Sie mitten auf einer geraden Straße sitzen, die Straßenränder tatsächlich als zwei konvergierende Linien sehen.
Das ist Perspektive. Bei 3D-Projekten ist die Perspektive von entscheidender Bedeutung. Ohne Perspektive sieht die 3D-Welt nicht echt aus.
Dies mag natürlich und offensichtlich erscheinen, es ist jedoch wichtig zu berücksichtigen, dass Sie beim Erstellen eines 3D-Renderings auf einem Computer versuchen, eine 3D-Welt auf dem Computerbildschirm zu simulieren, bei dem es sich um eine 2D-Oberfläche handelt.
Stellen Sie sich vor, hinter dem Computerbildschirm befindet sich eine echte 3D-Szene, die Sie durch das "Glas" Ihres Computerbildschirms betrachten. Ihr Ziel ist es, mithilfe der Perspektive Code zu erstellen, der das, was auf dieses "Glas" Ihres Bildschirms "projiziert" wird, so wiedergibt, als ob sich hinter dem Bildschirm eine echte 3D-Welt befindet. Die einzige Einschränkung ist, dass diese 3D-Welt nicht real ist… es ist nur eine mathematische Simulation einer 3D-Welt.
Wenn Sie 3D-Rendering verwenden, um eine Szene in 3D zu simulieren, und dann die 3D-Szene auf die 2D-Oberfläche Ihres Bildschirms projizieren, spricht man von perspektivischer Projektion.
Stellen Sie sich zunächst intuitiv vor, was Sie erreichen möchten. Befindet sich ein Objekt näher am Betrachter, muss es größer erscheinen. Wenn das Objekt weiter entfernt ist, muss es kleiner erscheinen. Wenn sich ein Objekt auf einer geraden Linie vom Betrachter wegbewegt, soll es zur Mitte des Bildschirms hin konvergieren, während es sich weiter in die Ferne bewegt.
Perspektive in Mathematik übersetzen
Stellen Sie sich beim Betrachten der Abbildung in der folgenden Abbildung vor, dass sich ein Objekt in Ihrer 3D-Szene befindet. In der 3D-Welt kann die Position des Objekts als xW, yW, zW bezeichnet werden, wobei auf ein 3D-Koordinatensystem mit dem Ursprung im Augenpunkt Bezug genommen wird. Hier wird das Objekt tatsächlich in der 3D-Szene hinter dem Bildschirm positioniert.
Während der Betrachter dieses Objekt auf dem Bildschirm betrachtet, wird das 3D-Objekt auf eine als xP und yP bezeichnete 2D-Position "projiziert", die auf das 2D-Koordinatensystem des Bildschirms (Projektionsebene) verweist.
Um diese Werte in eine mathematische Formel einzufügen, verwende ich ein 3D-Koordinatensystem für Weltkoordinaten, bei dem die x-Achse nach rechts, die y-Achse nach oben und die positiven z-Punkte innerhalb des Bildschirms zeigen. Der 3D-Ursprung bezieht sich auf die Position des Auges des Betrachters. Das Glas des Bildschirms befindet sich also in einer Ebene orthogonal (rechtwinklig) zur z-Achse, in einigen z, die ich als zProj bezeichne.
Sie können die projizierten Positionen xP und yP berechnen, indem Sie die Weltpositionen xW und yW wie folgt durch zW dividieren:
xP = K1 · xW / zW
yP = K2 · yW / zW
K1 und K2 sind Konstanten, die aus geometrischen Faktoren wie dem Seitenverhältnis Ihrer Projektionsebene (Ihrem Ansichtsfenster) und dem "Sichtfeld" Ihres Auges abgeleitet werden, das den Grad des Weitwinkelblicks berücksichtigt.
Sie können sehen, wie diese Transformation die Perspektive simuliert. Punkte in der Nähe der Bildschirmseiten werden mit zunehmendem Abstand zum Auge (zW) in Richtung der Mitte gedrückt. Gleichzeitig werden Punkte, die näher am Zentrum (0,0) liegen, durch den Abstand zum Auge wesentlich weniger beeinflusst und bleiben nahe am Zentrum.
Diese Division durch z ist die berühmte "Perspektivdivision".
Angenommen, ein Objekt in der 3D-Szene ist als eine Reihe von Scheitelpunkten definiert. Wenn Sie diese Art der Transformation auf alle Scheitelpunkte der Geometrie anwenden, stellen Sie effektiv sicher, dass das Objekt schrumpft, wenn es weiter vom Augenpunkt entfernt ist.
Andere wichtige Fälle
- Bei einer 3D-Kamera (Virtual Camera) bewegt sich die Kamera anstelle der Welt.
Stellen Sie sich zum besseren Verständnis von 3D-Kameras vor, Sie drehen einen Film. Sie müssen eine Szene einrichten, die Sie aufnehmen möchten, und Sie benötigen eine Kamera. Um das Filmmaterial zu erhalten, durchstreifen Sie die Szene mit Ihrer Kamera und nehmen die Objekte in der Szene aus verschiedenen Winkeln und Blickwinkeln auf.
Der gleiche Drehvorgang erfolgt mit einer 3D-Kamera. Sie benötigen eine "virtuelle" Kamera, die sich in der von Ihnen erstellten "virtuellen" Szene bewegen kann.
Zwei beliebte Aufnahmestile umfassen das Beobachten der Welt mit den Augen eines Charakters (auch als Ego-Kamera bezeichnet) oder das Zeigen der Kamera auf einen Charakter und das Behalten der Sicht (als Ego-Kamera bezeichnet).
Dies ist die Grundvoraussetzung einer 3D-Kamera: Eine virtuelle Kamera, mit der Sie sich in einer 3D-Szene bewegen und das Filmmaterial aus einer bestimmten Perspektive rendern können.
Den Weltraum verstehen und den Raum sehen
Um diese Art von Verhalten zu codieren, rendern Sie den Inhalt der 3D-Welt aus der Sicht der Kamera, nicht nur aus der Sicht des Weltkoordinatensystems oder aus einer anderen festen Sicht.
Im Allgemeinen enthält eine 3D-Szene eine Reihe von 3D-Modellen. Die Modelle sind als Satz von Eckpunkten und Dreiecken definiert, die auf ihr eigenes Koordinatensystem bezogen sind. Der Raum, in dem die Modelle definiert sind, wird als Modellraum (oder lokaler Raum) bezeichnet.
Nachdem Sie die Modellobjekte in eine 3D-Szene platziert haben, transformieren Sie die Scheitelpunkte dieser Modelle mithilfe einer "Welttransformation" -Matrix. Jedes Objekt hat eine eigene Weltmatrix, die definiert, wo sich das Objekt in der Welt befindet und wie es ausgerichtet ist.
Dieses neue Referenzsystem wird "Weltraum" (oder globaler Raum) genannt. Eine einfache Möglichkeit, es zu verwalten, besteht darin, jedem Objekt eine Welttransformationsmatrix zuzuordnen.
Um das Verhalten einer 3D-Kamera zu implementieren, müssen Sie zusätzliche Schritte ausführen. Sie verweisen auf die Welt - nicht auf den Weltursprung -, sondern auf das Referenzsystem der 3D-Kamera.
Eine gute Strategie besteht darin, die Kamera als tatsächliches 3D-Objekt in der 3D-Welt zu behandeln. Wie bei jedem anderen 3D-Objekt verwenden Sie eine "Welttransformation" -Matrix, um die Kamera an der gewünschten Position und Ausrichtung in der 3D-Welt zu platzieren. Diese Matrix für die Kamerawelttransformation transformiert das Kameraobjekt von der ursprünglichen Vorwärtsdrehung (entlang der z-Achse) zur tatsächlichen Weltposition (xc, yc, zc) und Weltdrehung.
Die folgende Abbildung zeigt die Beziehungen zwischen dem Weltkoordinatensystem (x, y, z) und dem Ansichtskoordinatensystem (Kamera) (x ', y', z ').