2017-02-06 2 views
-1

Ich entwickle eine einfache Rendering-Engine als Haustier-Projekt. Bisher kann ich Geometriedaten aus Wavefront-OBJ-Dateien laden und sie separat auf dem Bildschirm rendern. Ich weiß, dass Eckpunktkoordinaten, die in diesen Dateien gespeichert sind, im Modellraum definiert sind, und um sie korrekt in der Szene zu platzieren, muss ich die Modell-zu-Welt-Transformationsmatrix auf jede Eckpunktposition anwenden (bin ich hier sogar richtig?).Wie platziere ich 3D-Objekte in einer Szene?

Aber wie definiere ich diese Matrizen für jedes Objekt? Muss ich ein eigenes Werkzeug für die Szenenkomposition entwickeln, in dem ich Objekte verschieben und das "Werkzeug" entsprechende Modell-zu-Welt-Matrizen basierend auf Übersetzungen, Rotationen usw. berechnen wird?

+1

Danke für die downvotes, Jungs! Würdest du so freundlich sein, sie zu erklären? –

Antwort

1

Ich würde in die "Scene Graph" -Datenstruktur schauen. Es ist im Wesentlichen ein Baum, in dem Knoten ihre Transformationen relativ zu ihren Eltern definieren können. Denk darüber so. Jeder deiner Finger bewegt sich relativ zu deiner Hand. Bewegen Sie Ihre Hand, drehen oder skalieren Sie auch die gleiche Transformation an den Fingern.

Es ist daher vorteilhaft, alle diese relativen Transformationen aufeinander als relative zu basieren und trhem zu kombinieren, um die Gesamttransformation jedes einzelnen Teils Ihres Modells zu bestimmen. Daher definieren Sie nicht nur das direkte Modell, um die Transformation anzuzeigen, sondern auch eine Transformation von jedem Teil zu seinem übergeordneten Element.

Dies erspart es Ihnen, eine ganze Reihe von Transformationen selbst zu definieren, die in den allermeisten Fällen ähnlich sind, wie ich es beschrieben habe. So ersparst du dir eine Menge Arbeit, indem du deine Modelle/Szenen auf diese Weise darstellst.

Jede dieser relativen Transformationen ist normalerweise eine 4x4-affine Transformationsmatrix. Diese zu kombinieren, ist nur eine Frage der Multiplikation, um die Kombination aller zu erreichen.

A description of Scene Graphs

Um Objekte innerhalb eines Szenegraphen zu animieren, müssen Sie Transformationen im Verhältnis zu ihren Eltern in dem Baum spezifizieren. Zum Beispiel müssen sich drehende Räder eines Autos relativ zu dem Fahrgestell des Autos drehen. Diese Transformationen hängen weitgehend davon ab, welche Art von Animationen Sie zeigen möchten.

Also ich denke, die Antwort auf Ihre Frage ist "meist ja". Sie müssen Transformationen für jedes einzelne Objekt in Ihrer Szene definieren, wenn die Dinge gut aussehen. Ein Orgasmus der Szene in eine Baumstruktur macht diesen Prozess jedoch viel einfacher zu handhaben.

+0

Vielen Dank für die ausführliche Antwort. Ich denke, irgendwann werde ich eine Software schreiben müssen, um diese Graphen auf bequeme Weise zu manipulieren. –

+0

@ ПавелMуратов: Was Sie für eine erste Implementierung tun, ist eine Scenenode-Klasse zu erstellen, die eine Transformationsmatrix und eine Liste von Kindern enthält. Sie konstruieren dann einen Szenenknoten, der von der Hierarchie Ihrer Szene abhängt. Sie behalten einen Verweis auf einen Stammknoten. Bei jedem Frame aktualisierst du zuerst das Szenendiagramm. Hier durchqueren Sie jeden Knoten des Baumes und ändern jede notwendige Transformation. Denken Sie daran, dass jede Transformation die Transformation dieses bestimmten Knotens relativ zu seinem Elternteil darstellt. Zum Beispiel: Im Falle eines Sonnensystems beschreibt ein Mond, wie er sich relativ zu seinem Planeten bewegt, – Bartvbl

+0

(Fortsetzung) und ein Planet beschreibt, wie er um die Sonne kreist. Nachdem Sie Ihre Transformationen berechnet haben, können Sie das gesamte Szenendiagramm ein zweites Mal durchlaufen und jedes Objekt mit der Transformationsmatrix rendern, die Sie zuvor für diesen Knoten berechnet haben. – Bartvbl

2

Bei der Erstellung dieser Matrizen müssen Sie eine Szene aus einem Authoring-Paket exportieren. Diese Software kann die gleiche sein, die Sie verwendet haben, um die Objekte an erster Stelle zu modellieren, Maya, Lightwave ... Im Moment haben Sie Ihre Objekte unabhängig voneinander.

So finden Sie mit dem Paket Ihrer Wahl entweder ein Dateiformat, das es Ihnen ermöglicht, eine Szene zu exportieren, indem Sie jedes Ihrer Netze wie FBX oder GLTF positionieren oder selbst erstellen.

In beiden Fällen gibt es eine Szenenstruktur, die Modelle, Transformationen, Lichter, Kameras, alles, was Sie in Ihrem Motor wollen.

Danach müssen Sie diese Struktur analysieren. Sie finden hier einige Erklärungen finden darüber, wie Sie konnte Architekt dass: https://nlguillemot.wordpress.com/2016/11/18/opengl-renderer-design/

Viel Glück,

+0

Vielen Dank für das Feedback! Ich werde auf jeden Fall in den Artikel schauen, den Sie vorgeschlagen haben. –

Verwandte Themen