Computergrafik

Blender Depsgraph

Blender Transformationen | | Godot Game Engine

Die Gretchenfrage ist, wie Blender aus den lokalen Transformationen explizit die globale Transformationsmatrix matrix_world berechnet, denn wie wir bereits wissen, wäre es ineffizient, für jedes Objekt die lokalen Transformationen auszumultiplizieren. Blender benutzt dazu anstelle dessen einen sog. Dependencies Graph (DepsGraph).

Eine Änderung eines Attributes eines Objektes als Teil der DNA Daten hat in vielen Fällen einen Einfluss auf die Attribute anderer Objekte, die daher auch angepasst werden müssen. Auch Animationen verändern während des Ablaufs ständig eine Teil der Attribute. Zum Rendern wird daher eine Kopie der DNA Daten verwendet (shallow copy). Die Gesamtheit aller kopierten und evtl. modifizierten DNA Daten werden als RNA Data bezeichnet.

Damit Modifikationen der RNA Daten effizient geschehen können, besitzt Blender einen Dependency Graph, der die Abhängigkeiten der Attribute untereinander repräsentiert. Wird ein Attribut verändert, so wird das Attribut erstmal nur als geändert markiert. Die Anpassung der davon abhängigen Objekte der Szene geschieht in der Methode Scene::update(). In dieser Methode veranlassen alle als geändert markierten Attribute auch eine Änderung der davon abhängigen Attribute anhand des DepsGraph.

So ein Fall ist auch die globale Transformationsmatrix. Wird die lokale Transformationsmatrix eines Elternteils angepasst, so mĂĽssen auch die Transformationsmatrizen der Kinder angepasst werden. Das geschieht dadurch, dass die Kinder im DepsGraph enthalten sind.

Wird also z.B. der Ort eines Objekts verändert (z.B. mit Taste g im 3D View im Object Mode), so bedeutet dies zuerst einmal nur, dass sich das Attribut Location (entsprechend Object::loc) verändert. Zuerst wird dann die lokale Transformationsmatrix aus der impliziten Beschreibung regeneriert via BKE_object_eval_local_transform. Dann wird die globale Transformationsmatrix basierend auf dem Produkt der lokalen und der globalen Transformationsmatrix des Elternteils neu berechnet via BKE_object_eval_parent(). Und anschließend werden anhand des DepsGraph die globalen Transformationsmatrizen der Kinder, Kindeskinder usw. neu berechnet via BKE_object_eval_constraints().

Dies hat den Vorteil dass die Anzahl der Neuberechnungen minimiert werden kann und fĂĽr mehrere Views und Render-Engines gleichzeitig verwendet werden kann.

Oberflächlich ist die hierarchische Struktur einer Szene im Outliner in Blender sehr intuitiv dargestellt. Dies entspricht aber nicht der internen Struktur der Szene, welche aus Effizienzgründen sehr viel komplexer ist.

Blender verwendet also auch das Szenengraph-Prinzip. Ein Szenengraph ist aber nur implizit vorhanden, da anstelle dessen explizit ein DepsGraph verwendet wird.

Blender Transformationen | | Godot Game Engine

Options: