Ich bin ziemlich neu in der Programmierung in einer 3D-Welt.
Ich versuche, eine Leinwand zu erstellen, auf der alle Objekte in der Reihenfolge vom weitesten zum nächsten und von unten nach oben gezeichnet werden - damit sie sich nicht überlappen, aber es gibt Probleme.
Wie Sie sehen können, überlappen sich einige der Objekte. Keines der Objekte auf dem Bildschirm bewegt sich, daher habe ich mich gefragt: Gibt es einen Algorithmus, um die Objekte in der richtigen Reihenfolge zu sortieren? Im Moment habe ich sie in der Z-Achse aufsteigend sortiert, dann X absteigend und Y absteigend.
Antworten:
Wie in den Kommentaren von @dreta erwähnt, lösen 3D-Engines dies normalerweise mit einem Tiefenpuffer und unter Verwendung des Hardware-Tiefentests, mit dem Sie beliebig geformte Objekte in beliebiger Reihenfolge zeichnen und die nächstgelegene Oberfläche an jedem Pixel verfolgen können . Das manuelle Sortieren von Objekten ist ebenfalls möglich, behandelt jedoch nicht unbedingt nicht konvexe Objekte oder überlappende Objekte nicht korrekt.
Wenn Sie jedoch Objekte sortieren möchten, müssen Sie für jedes Objekt einen Tiefenwert berechnen und dann nach absteigender Tiefe sortieren. Um die Tiefe zu ermitteln, müssen Sie bei Verwendung eines typischen 3D-Engine-Setups den Mittelpunkt jedes Objekts durch Ihre Ansichtsmatrix (die vom Weltraum zum Ansichtsraum verläuft) transformieren und dann das Negativ der Z-Koordinate von nehmen das Ergebnis. (Negativ, da in rechtshändigen Koordinaten mit X und Y, die am Bildschirm ausgerichtet sind, Z aus dem Bildschirm zeigt.)
Wenn es sich immer um eine isometrische Ansicht wie diese handelt, können Sie wahrscheinlich mit der Berechnung der Tiefe = ± X ± Y - Z davonkommen, wobei ± bedeutet: Wählen Sie das Zeichen, das die Tiefe erhöht, wenn Sie sich weiter von der Kamera entfernen. Dies hängt von der Ausrichtung Ihrer X- und Y-Achse ab.
quelle
Schauen Sie sich den Painters-Algorithmus und seine Nachteile an.
quelle
Im Allgemeinen lautet die Antwort auf Ihre Frage ("Gibt es einen Algorithmus zum Sortieren der Objekte in der richtigen Reihenfolge?") In beliebigen 3D-Einstellungen " Nein" - ein solcher Algorithmus kann nicht existieren, selbst wenn die Objekte so einfach wie Dreiecke sind. Es ist einfach, drei Dreiecke mit einer zyklischen Überlappung zu konstruieren. Stellen Sie sich zum Beispiel vor, Sie blicken entlang der Z-Achse auf drei lange, dünne Dreiecke:
Wenn sich A und B auf dem Bildschirm überlappen (in der Nähe des XY-Punkts (0,0)), befindet sich B oben (hat den höheren Z-Wert): Sein Z-Wert beträgt ungefähr 0,66, während A ungefähr 0,33 beträgt. In ähnlicher Weise befindet sich A oben, wenn sich A und C überlappen (nahe dem XY-Punkt (1, 1)). und wo sich B und C überlappen (nahe dem XY-Punkt (1, -1)), ist C oben. Es gibt keine Möglichkeit, diese drei Dreiecke so zu ordnen, dass das Zeichnen in der angegebenen Reihenfolge das richtige Ergebnis liefert.
Wie Nathan Reed vorschlägt, bedeutet die Tatsache, dass Sie sich in einer isometrischen Ansicht befinden, dass Sie dieses spezielle Problem wahrscheinlich vermeiden können. Die Frage ist, ob es sich lohnt, dies zu vermeiden oder nicht. Dies hängt mehr von Ihrer Umgebung und den verfügbaren Funktionen ab. Die meisten Plattformen, auf denen Sie entwickeln könnten, verfügen jedoch über mindestens eine Form von 3D-Rendering, und meine erste Neigung wäre, für Ihre Zwecke nur darüber hinaus zu huckepack.
quelle