Implementierungsbeispiel für Szenengraphen
← Szenengraph Konstruktion | ● | Szenengraph Basisklasse →
Implementierungsbeispiel für die Konstruktion eines Szenengraphen mit einer Kamera (typischerweise in initializeOpenGL):
lgl_Node *cam = new lgl_CameraNode();
cam->setPerspective(...);
cam_->setAspect(...);
cam_->setEye(...);
root->add(cam);
Dem Szenengraphen werden zusätzlich zwei unterschiedlich transformierte Geometrien mit den Modellierungs-Matrizen M1 und M2 und den Farben c1 und c2 hinzugefügt:
lgl_Node *geometry = new lgl_GeometryNode(vbo);
root->add(new lgl_TransformationNode(M1)->add(new lgl_ColorNode(c1))->add(geometry);
root->add(new lgl_TransformationNode(M2)->add(new lgl_ColorNode(c2))->add(geometry);
Für jeden Frame wird die so definierte Szene gerendet (typischerweise in renderOpenGL):
Und bei Programmende der Szenengraph gelöscht (typischerweise im Destruktor des Fenster-Widgets):
Einfaches Beispiel mit zwei farbigen, beleuchteten Zahnrädern:

lgl_Node *root_;
void initializeOpenGL()
{
// setup OpenGL
glClearColor(1,1,1,1);
// create scene graph
double fovy = 45;
double aspect = (double)width()/height();
double nearp = 0.1;
double farp = 1000;
cam_ = new lgl_CameraNode();
cam_->setPerspective(fovy, aspect, nearp, farp);
cam_->setEye(vec3(0,1.15,0.5), vec3(0,1,0), vec3(0,1,0));
root_ = new lgl_Node();
root_->add(cam);
lglGear *gear = new lglGear(1, 0.25, 1.0/25, 0, 1.5, 0.1);
gear->create(256, 0.1);
lgl_Node *node = root_->add(new lgl_LightSourceNode(vec4f(0,0,0)));
node->add(new lgl_TranslationNode(vec3(0,0,0)))
->add(new lgl_RotationAnimationNode(2.5, vec3(0,0,1)))
->add(new lgl_ColorNode(vec3(0.75,0.75,1)))
->add(new lgl_GeometryNode(gear));
node->add(new lgl_TranslationNode(vec3(0,2,0)))
->add(new lgl_RotationAnimationNode(-2.5, vec3(0,0,1)))
->add(new lgl_RotationNode(0.5/gear_->teeth()*360, vec3(0,0,1)))
->add(new lgl_ColorNode(vec3(1,0.75,0.75)))
->add(new lgl_GeometryNode(gear));
}
void renderOpenGL(double dt)
{
// clear frame buffer
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// render scene graph
root_->renderSceneGraph(dt);
}
Live Demo: Szenengraph-Konstruktion (T#D01a)