Computergrafik

Implementierungsbeispiel für Szenengraphen

Szenengraph Konstruktion | | Szenengraph Basisklasse

Implementierungsbeispiel für die Konstruktion eines Szenengraphen mit einer Kamera (typischerweise in initializeOpenGL):

root = new lgl_Node();
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_VBO *vbo = lglLoadObj(...);
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):

root->renderSceneGraph(1/FPS);

Und bei Programmende der Szenengraph gelöscht (typischerweise im Destruktor des Fenster-Widgets):

delete root;

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)

Szenengraph Konstruktion | | Szenengraph Basisklasse

Options: