Warum bewegen wir die Welt statt der Kamera?

87

Ich habe gehört, dass in einem OpenGL-Spiel der Spieler nicht die Kamera, sondern die ganze Welt bewegen muss, um sich zu bewegen.

Zum Beispiel ist hier ein Auszug aus diesem Tutorial: OpenGL View Matrix

Im wirklichen Leben ist man es gewohnt, die Kamera zu bewegen, um die Ansicht einer bestimmten Szene zu verändern, in OpenGL ist es umgekehrt. Die Kamera in OpenGL kann sich nicht bewegen und ist so definiert, dass sie sich in (0,0,0) befindet und der negativen Z-Richtung zugewandt ist. Das heißt, anstatt die Kamera zu bewegen und zu drehen, wird die Welt bewegt und um die Kamera gedreht, um die entsprechende Ansicht zu erstellen.

Warum machen wir das?

danijar
quelle
1
Eine Kamera ist nichts anderes als eine Projektionsansicht. So transformieren Sie die Welt, um die gewünschte Projektion zu erhalten. Das Konzept ist komisch, aber es macht tatsächlich Sinn ... in gewisser Weise ... Ich denke
Sidar
@sharethis, ich habe meine Antwort mit einer besseren Erklärung verbessert. Die Projektionsperspektive wurde mit der Option Mathematik und 3D-Kamera (virtuelle Kamera) hinzugefügt. Kann für Sie und andere hilfreich sein.
Md Mahbubur Rahman
4
Dies ist eigentlich nicht der Fall, da beide Vorgänge (Bewegen der Kamera oder der Objekte in der Welt) symmetrisch sind und keine Aussage darüber getroffen werden kann, welcher Vorgang stattgefunden hat. Sie denken an die Welt, die sich um die Kamera bewegt, aber genauso kann sich jemand anders die Kamera vorstellen, die sich umgekehrt um die Welt bewegt ... Okay, Sie können also Objekte relativ zueinander bewegen, so dass eine Möglichkeit intuitiver sein kann, aber keine Person ist "falsch", beide Arten der Visualisierung der Situation sind in verschiedenen Situationen gut. Oft ist es hilfreich, über beides nachzudenken.
user3728501

Antworten:

72

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.

Bildbeschreibung hier eingeben

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 ').

Bildbeschreibung hier eingeben

Md Mahbubur Rahman
quelle
5
Die anderen Antworten sind da. Sie müssen sie nicht in Ihre eigenen bearbeiten.
Jesse Dorsey
1
@Noctrine, danke. Mir war nicht bekannt, wie man eine Verknüpfung zwischen Seiten herstellt.
Md Mahbubur Rahman
"Im nächsten Abschnitt verwenden Sie diese perspektivische Projektionsformel in ActionScript, das Sie in Flash 3D-Projekten verwenden können." Da in der ursprünglichen Frage kein Flash 3D-Projekt erwähnt wird, habe ich den Eindruck, dass Sie es von einer anderen Stelle kopiert haben, was in Ordnung ist, wenn Sie Ihre Quellen zitieren.
Gilles
@ Gilles, Entschuldigung für meinen Fehler. Ich habe meine Antwort bearbeitet. Ich habe die Antwort vorbereitet, indem ich verschiedene Quellen studiert habe. Und vielen Dank, wie Sie betonten. :)
Md Mahbubur Rahman
Beachten Sie, dass glMatrixMode()und einige weitere Funktionen, auf die unter ger.utah.edu/~cs6360/Lectures/frustum.pdf und opengl.org/archives/resources/faq/technical/viewing.htm verwiesen wird, veraltet sind. Die mathematische Beschreibung bleibt jedoch korrekt und hilfreich.
patryk.beza
28

Mahbubar R Aamans Antwort ist ganz richtig, und die von ihm bereitgestellten Links erklären die Mathematik genau, aber falls Sie eine weniger technische / mathematische Antwort wünschen, werde ich einen anderen Ansatz ausprobieren.

Positionen von Objekten in der realen Welt und der Spielwelt werden mit einem Koordinatensystem definiert. Ein Koordinatensystem gibt Positionswerten eine Bedeutung. Wenn ich dir sage, dass ich bei "100,50" bin, hilft dir das nur, wenn du weißt, was diese Zahlen bedeuten (sind das Meilen, Kilometer, Breiten- und Längengrade usw.). Wenn es sich um kartesische Koordinaten handelt (die "normale" Art von Koordinaten), müssen Sie auch wissen, zu welchem ​​Ursprung sie relativ sind. Wenn ich nur sage "Ich bin 100 Fuß in östlicher Richtung", müssen Sie wissen "Östlich von was ", was als Koordinatenursprung bezeichnet wird.

Es gibt eine einfache Möglichkeit, sich das vorzustellen. Man könnte jemandem sagen, "der Bahnhof liegt 3 Kilometer nördlich und 1,5 Kilometer östlich der südwestlichen Ecke der Stadt." Sie könnten auch jemandem sagen: "Der Bahnhof liegt 1,6 km nördlich von meinem derzeitigen Standort." Beide Koordinaten sind korrekt und identifizieren den Ort des gleichen Orientierungspunkts, sie werden jedoch von einem anderen Ursprung aus gemessen und haben daher unterschiedliche numerische Werte.

In einer 3D-Anwendung gibt es im Allgemeinen ein "Welt" -Koordinatensystem, das verwendet wird, um die Position der Kamera und der Objekte im Spiel darzustellen, gemessen mit kartesischen Koordinaten mit einem willkürlich vom Designer festgelegten Ursprung (im Allgemeinen dem Mittelpunkt einer beliebigen Ebene) oder Karte, die du spielst). Andere Koordinatensysteme sind im Spiel vorhanden, beispielsweise das kartesische Koordinatensystem mit der Kamera im Ursprung. Sie können jedes neue Koordinatensystem jederzeit nach Ihren Wünschen definieren. Dies geschieht in der 3D-Simulation sehr häufig, um die Mathematik zu vereinfachen.

Der Algorithmus, mit dem tatsächlich ein einzelnes Dreieck auf Ihrem Bildschirm dargestellt wird, funktioniert auf eine bestimmte Art und Weise. Daher ist es nicht bequem, beim Rendern direkt mit den Weltkoordinaten zu arbeiten. Die Mathematik ist nicht wirklich darauf ausgelegt, Informationen wie "das Objekt befindet sich 100 Einheiten rechts vom Mittelpunkt der Welt" zu verarbeiten. Die Mathematik will stattdessen mit "das Objekt ist direkt vor der Kamera und 20 Einheiten entfernt" arbeiten. Daher wird der Rendering-Mathematik ein zusätzlicher Schritt hinzugefügt, um Objektweltpositionen zu ermitteln und sie in das Kamerakoordinatensystem zu übersetzen.

Natürlich hat die Kamera auch eine Position und eine Orientierung. Befindet sich ein Objekt an der Position 20,100,50 und befindet sich die Kamera an der Position 10,200, -30, beträgt die Position des Objekts relativ zur Kamera 10,100,80 (die Position des Objekts abzüglich der Position der Kamera). Wenn sich die Kamera in einem Spiel bewegt, wird diese Kameraposition in Weltkoordinaten genau so verschoben, wie Sie es erwarten würden.

Beachten Sie, dass die Objekte nicht verschoben werden. Sie bleiben genau dort, wo sie vorher waren. Ihre Position wird jetzt jedoch relativ zu einem anderen Koordinatenursprung ausgedrückt. Die Weltkoordinaten des Objekts bewegen sich nur, wenn sich das Objekt selbst bewegt. Die Kamerakoordinaten ändern sich jedoch auch, wenn sich die Kamera bewegt, da sie relativ zur Kameraposition sind.

Beachten Sie auch, dass die Beschreibung aus dem Tutorial, das Sie zitieren, eine vereinfachte Erklärung ist und nicht unbedingt eine genaue Beschreibung dessen, was OpenGL tut. Ich glaube nicht, dass der Autor des Artikels das nicht verstanden hat. Der Autor hat nur versucht, eine vereinfachte Analogie zu verwenden, die in diesem Fall eher Verwirrung stiftete, als sie zu beseitigen.

Wenn es weiter hilft, zu verstehen, warum sich die Mathematik um die Kamerakoordinaten kümmert, versuchen Sie diese Übung: Halten Sie Ihre Hände hoch und berühren Sie Daumen und Zeigefinger, um ein Rechteck zu bilden (nennen wir das ein "Ansichtsfenster") und schauen Sie sich in dem Raum um, in dem Sie sich befinden Suchen Sie ein Objekt, und schauen Sie es an. Schauen Sie sich dann um, aber nicht direkt. Wenn Sie dies tun, fragen Sie sich: "Wo befindet sich das Objekt in meinem Ansichtsfenster?" Dieses Objekt verfügt über einen bestimmten Längen- und Breitengrad in der realen Welt, mit dem Sie seinen Standort auf der Erde bestimmen können, aber das sagt Ihnen nichts über das aus, was Sie sehen. Wenn Sie sagen, dass sich das Objekt in der oberen linken Ecke meines Ansichtsfensters befindet und ungefähr 2 Meter entfernt zu sein scheint, ist dies jedoch einiges. Sie haben ein Koordinatensystem in Bezug auf Ihren Kopf und die Richtung erstellt, in der Sie sich befinden. Ein Blick, der definiert, wo ein Objekt Ihrer Vision entspricht. Das ist im Grunde das, was der Dreieck-Rasterizer-Teil von OpenGL / Direct3D benötigt, und das ist es, was die Mathematik erfordert, dass Objektpositionen und -orientierung von ihren praktischen Weltkoordinaten in Kamerakoordinaten umgewandelt werden.

Sean Middleditch
quelle
Obwohl für mich die mathematische Erklärung klar und verständlich ist, ist dies auch eine großartige Erklärung! Ich glaube, dass Sie vielen anderen mit der gleichen Frage geholfen haben.
Danijar
+1, um zu verdeutlichen, ob sich die Kamera bewegt oder die Welt, ist nur eine Funktion des Koordinatensystems, von dem Sie sprechen.
David Moles
11

Nur das Hinzufügen zu den anderen beiden (ausgezeichneten) Antworten auf einen Punkt, den Mahbubur R Aaman angesprochen hat: "Es gibt keine Kamera".

Dies ist ganz richtig und stellt ein Versagen der üblichen "Kamera" -Analogie dar, da die "Kamera" tatsächlich nicht existiert. Es ist wichtig zu erkennen, dass die Kamera-Analogie genau das ist - eine Analogie. Es beschreibt nicht (oder gibt vor zu beschreiben), wie die Dinge tatsächlich hinter den Kulissen funktionieren.

Betrachten Sie es also als ein Mittel, um sich mit diesem Zeug vertraut zu machen, wenn es neu für Sie ist. Denken Sie jedoch immer daran, dass es nur ein Helfer ist und keine Beschreibung des tatsächlichen Zustands der Dinge.

Nun haben Sie zwei Klassen von Objekten, die hier relevant sind: den Standpunkt und alles auf der Welt. Sie möchten den Ansichtspunkt näher an einige Objekte heranrücken. Bei dieser Bewegung ist das Endergebnis jedoch dasselbe, unabhängig davon, ob die Ansicht näher an die Objekte heranrückt oder ob die Objekte näher an die Ansicht heranrücken. Alles, was Sie tun, ist die Entfernung zwischen ihnen zu ändern; Da die aktuelle Distanz X ist und Sie möchten, dass die neue Distanz Y ist, spielt es keine Rolle, welche Sie sich bewegen, nur solange die neue Distanz nach der Bewegung Y ist. Sie bewegen sich also überhaupt nicht wirklich ändern gerade eine Entfernung. (Ich wollte nicht alle Einstein in diesem kommen ... ehrlich!)

Da die Kamera jedoch nicht vorhanden ist, können Sie nur die Entfernung der Objekte ändern. Sie ändern also den Abstand der Objekte und erhalten genau das gleiche Ergebnis. Da alle Objekte ohnehin Transformationen durchlaufen, ist dies nicht mehr oder weniger teuer.

Eine einfachere mathematische Erklärung kann mehr helfen. Nehmen wir an, alle Koordinaten sind 1D - der Blickwinkel ist 0, Ihre Objekte sind 4 und Sie möchten, dass der Blickwinkel auf 3 wechselt. Dies bedeutet, dass sich der Abstand zwischen ihnen von 4 (4 - 0) auf 1 (4 - 3). Da die Kamera jedoch nicht vorhanden ist, können Sie diese 0 nicht ändern. es wird immer 0 sein. Anstatt also 3 zu 0 zu addieren (was Sie nicht tun können), subtrahieren Sie 3 von 4 (was Sie tun können) - die Objekte sind jetzt auf 1, und das Endergebnis ist genau der gleiche Abstand zwischen Sicht und Objekte ist 1.

Maximus Minimus
quelle
Obwohl die Kamera als solche nicht existiert, können Sie ihre Position vor der Transformation berechnen. In einigen Fällen (nicht achsenausgerichtete Parallelprojektion) erhalten Sie jedoch mehr als eine der üblichen Koordinaten "im Unendlichen" (positiv oder negativ), was weniger nützlich ist als die Transformationsmatrix.
Martin Sojka
7

Das Bewegen der Kamera oder der Welt sind zwei gleichermaßen gültige Entscheidungen, die beide dasselbe bedeuten. Am Ende des Tages wechseln Sie von einem Koordinatensystem in das andere. Die obigen Antworten sind richtig, aber wie Sie es sich vorstellen, sind zwei Seiten derselben Medaille. Transformationen können in beide Richtungen verlaufen - sie sind nur die Umkehrung voneinander.

Ein Teil des Renderprozesses wird von Weltkoordinaten in Augenkoordinaten konvertiert. Eine einfache Möglichkeit, dies zu modellieren, ist jedoch die Verwendung eines virtuellen Kameraobjekts in Ihrer Anwendung. Die Kamera kann sowohl die Projektionsmatrix (die für den perspektivischen Effekt verantwortlich ist) als auch die Ansichtsmatrix darstellen, die zum Konvertieren vom Weltraum in den Augenraum verwendet wird.

Obwohl der Vertex-Shader die Ansichtsmatrix verwendet, um die Koordinaten Ihrer Geometrie in den Augenbereich zu ändern, ist es oft einfacher, sich ein Kameraobjekt vorzustellen, das sich in Ihrer virtuellen Welt bewegt und dabei die Ansichtsmatrix neu berechnet.

In Ihrer Anwendung bewegen Sie die Kamera also in Weltkoordinaten, aktualisieren die Ansichtsmatrix der Kamera, übergeben die neue Ansichtsmatrix als Uniform oder Teil eines Blocks an den Vertex-Shader und rendern Ihre Szene.

Sean Harmer
quelle
5

Ich würde stattdessen davon ausgehen, dass es sich um eine fehlerhafte Analogie handelt. Im Grunde genommen sind "Bewegen der Kamera" und "Bewegen der Welt" genau dasselbe mathematische Konstrukt - es ist nur so, dass das Bewegen der Welt konzeptionell etwas einfacher ist, insbesondere wenn es um hierarchische Transformationen geht. Grundsätzlich bewegen Sie die Welt nur dadurch um die Kamera, dass Sie die Weltscheitelpunkte in den Koordinatenraum der Kamera übersetzen - dies ist jedoch eine reversible affine Transformation.

Wenn Sie jedoch damit beginnen, die Sichtbarkeitsbestimmung in den Mix einzubeziehen, müssen Sie als Letztes die gesamte Welt um die Kamera herum übersetzen. Stattdessen werden Sie in den meisten Fällen (insbesondere im klassischen Fall von festen BSPs oder Ähnlichem) die Position der Kamera innerhalb der Welt verwenden, um Ihre Sichtbarkeitsstrukturen abzufragen, um zu bestimmen, welche Dinge wahrscheinlich sichtbar sind, und dann nur DIESE zu übersetzen Dinge in den Koordinatenraum der Kamera.

flauschige
quelle
4

Ich denke nicht, dass die Behauptung kategorisch wahr ist, da man die Weltkoordinaten in einem Spiel nur selten "verschiebt", sondern tatsächlich die Koordinaten der virtuellen Kamera ändert.

Das eigentliche Konzept der Kamera besteht darin, den endlichen Betrachtungskegelstumpf - das ist eine Pyramidenstumpf mit 8 Eckpunkten (oder definiert durch den Schnitt von 6 Ebenen) - in einen Einheitswürfel umzuwandeln, der den Clip-Raum in den letzten Phasen von openGL darstellt Rendering-Pipeline.

In diesem Sinne wird die Welt nicht bewegt, sondern man berechnet nur Weltkoordinaten im Koordinatensystem des Clipraums.

Aki Suihkonen
quelle
2

Das Bewegen der Kamera oder der Welt sind zwei gleichermaßen gültige Entscheidungen (und beide sind wahr). Am Ende des Tages wechseln wir von einem Koordinatensystem zum anderen. Transformationen können in beide Richtungen verlaufen - sie sind nur die Umkehrung voneinander.

CoolProgrammer
quelle
2

Viele gute Antworten hier. Ich werde versuchen, keinen von ihnen zu wiederholen. Manchmal ist es einfacher, sich eine Kamera vorzustellen, wie es Direct3D macht (Hinweis: Ich habe nicht mit viel Post 9.0c gespielt).

"Die Welt bewegen", wie im Futurama-Sinne, ist eine sehr gute Sichtweise ("Die Motoren bewegen das Schiff überhaupt nicht. Das Schiff bleibt dort, wo es ist, und die Motoren bewegen das Universum." es!"). Dies war eigentlich für 2D-Spiele durchaus üblich. Sie hatten buchstäblich ein Ansichtsfenster, das Sie nur schwer anpassen konnten, und das war manchmal Ihr Video-RAM oder ein UI-Fenster. Ob OpenGL dies aus solchen Gründen tut, ist schwer zu sagen.

Man kann sich eine 2D-Bewegung sicherlich auch als Kamera vorstellen, und genau diese Art des Denkens kann es einfacher machen, Effekte herauszufinden.

Joe Plante
quelle
1
Späte, aber auch nette Antwort!
Danijar
Vielen Dank! Ich habe immer festgestellt, dass das Hinzufügen zur Diskussion auf Seiten, die über eine Suchmaschine gefunden werden, sehr geschätzt wird, insbesondere wenn die Informationen nützlich oder interessant sind
Joe Plante,
2

Hier scheint es eine Menge Missverständnisse zu geben, angefangen von den Autoren von OpenGL-Dokumenten ...

Lass mich schnell deine geistige Gesundheit wiederherstellen: Die Welt bewegt sich nicht , sie bleibt stehen. Wer versucht, die Welt so zu gestalten, dass sie sich im Spieler bewegt, stößt im Mehrspielermodus schnell auf Probleme. Ganz zu schweigen davon, dass das Aktualisieren der Positionen von Millionen (oder Milliarden) von Objekten in der Welt bei jedem Spielzug zu einem ziemlich langsamen Gameplay führt ...

Also, was passiert dort wirklich und was ist mit dem Zitat los?

Zunächst müssen Sie das Konzept eines Koordinatensystems verstehen. Im Allgemeinen wählen Sie einen Punkt in der Welt aus und erklären ihn als "Ursprung", dh als Punkt mit Koordinaten (0,0,0). Sie können auch drei "Hauptrichtungen" auswählen, die Sie als X, Y und Z bezeichnen. Es gibt natürlich viele Möglichkeiten, ein Koordinatensystem zuzuweisen. Normalerweise gibt es ein "Weltkoordinatensystem", in diesem System ist die Welt stationär (mehr oder weniger). In einem Spiel würde dieses System vom Leveldesigner ausgewählt.

Nun ist es auch bequem, ein anderes Koordinatensystem zu betrachten, das an das Auge des Spielers gebunden ist. In diesem Koordinatensystem befindet sich der Spieler immer an den Koordinaten (0,0,0), und die Welt bewegt sich und dreht sich um ihn herum. Daher ist das Zitat korrekt, wenn Sie verstehen, dass es im Koordinatensystem des Spielers gemacht wurde .

Die Welt arbeitet jedoch nicht in den Koordinaten des Spielers, sondern in den Koordinaten der Welt. Und wenn zwei Koordinatensysteme beteiligt sind, gibt es immer eine Möglichkeit, eine Art von Koordinaten in die andere umzuwandeln. In OpenGL geschieht dies mit einer 4x4-Ansichtsmatrix.

Wenn sich ein Spieler bewegt, bleibt die Welt letztendlich stationär, während sich der Spieler bewegt. Dies ist in den Weltkoordinaten, wie die Objekte in Ihrem Spiel gespeichert sind. Dem Player ist auch eine Ansichtskamera zugeordnet, und diese Kamera bewegt sich auf ähnliche Weise um die Welt (trotz der Aussagen der OpenGL-Dokumente). Um die Welt auf dem Bildschirm des Benutzers darzustellen, werden die Koordinaten aller sichtbaren Objekte mithilfe einer Transformationsmatrix in das Koordinatensystem des Spielers übersetzt. Anschließend wird eine zusätzliche Projektion angewendet, um einen perspektivischen Effekt zu erzielen. Im Koordinatensystem dieses Spielers scheint sich die Welt tatsächlich um den Spieler zu bewegen. Aber es ist nur eine äußerst wenig hilfreiche und verwirrende Art, darüber nachzudenken.

Pascha
quelle
" Ausgehend von den Autoren von OpenGL-Dokumenten " Richtig, denn ich bin mir sicher, dass die Macher von OpenGL offensichtlich zu dumm sind, um den Unterschied zwischen der Darstellung einer Welt (die alles ist, was OpenGL interessiert) und der konzeptuellen Darstellung dieser Welt zu verstehen ( das ist nicht etwas, mit dem OpenGL zu tun hat).
Nicol Bolas
" Aber es ist nur eine äußerst wenig hilfreiche und verwirrende Art, darüber nachzudenken. " Es ist auch die Wahrheit . Und die Wahrheit ist immer hilfreicher als eine Lüge. Denn früher oder später wird diese Lüge Sie einholen und Sie müssen sich der Wahrheit stellen.
Nicol Bolas