Computergrafik

Blender Szenengraph

Szenengraph Beispiel | | Blender Transformationen

Große Frage: Wie ist der Szenengraph konkret in Blender implementiert? Wir schauen zur Beantwortung dieser Frage in den Blender Source Code:

In Blender ist die Situation in Bezug auf den Szenengraphen komplizierter. Das liegt daran, dass Blender primär die Szene als lose Ansammlung von Objekten betrachtet, die verschiedenste Attribute wie z.B. Mesh, Material oder auch die lokale Transformation haben. Jedes dieser Attribute kann entweder über die Blender Python Konsole oder das Blender UI verändert werden. Die Gesamtheit aller Daten der Szene wird auch als DNA Data bezeichnet und enthält alle serialisierbaren Daten, die im Blend File gespeichert werden.

Intern besteht eine Szene aus einer Collection von Objekten. Ein Object wird einer Collection via BKE_collection_object_add() hinzugefügt (siehe collection.cc). Jede Collection ist wiederum eine Link-Liste, der ein Objekt via BLI_addtail() hinzugefügt wird (siehe listbase.cc). Zusätzlich hat zum schnellen Auffinden jedes Objekt einen Hash. Eine Blender Szene ist also im Kern eine verlinkte und gehashte Liste von Objekten mit Attributen.

Wenn in Blender Objekte hierarchisch zueinander in Beziehung gesetzt werden sollen, so geschieht das durch “Parenting”. D.h. man weist einem Kind ein Elternteil zu. Das erfolgt z.B. in Python durch Setzen des Attributes parent:

import bpy

objects = bpy.data.objects
a = objects['Cube']
b = objects['Cube.001']

b.parent = a

In C++ wird der entsprechende Zeiger Object::parent der Object Struktur gesetzt:

struct Object *a = ..., *b = ...;
b->parent = a;

Im Gegensatz zu traditionellen Graphen, welche für jeden Knoten eine Referenz auf die jeweiligen Kinder besitzen, besitzt ein Blender-Objekt daher nur eine Referenz auf sein Elternteil. D.h. der Szenengraph ist implizit definiert.

Szenengraph Beispiel | | Blender Transformationen

Options: