Programming Example

Extension | | Scene Graph Nodes

In this programming example we are going to put a building on a place on earth.

The place on earth is defined as a local coordinate system at a geo-referenced position. Possible geographic reference systems are Lat/Lon, UTM, Mercator or ECEF. The z-axis of the local coordinate system points upwards and the y-axis points north. The units of the local coordinate system are meters.

The building is modeled in the local coordinate system as a scene graph that contains two simple geometric objects, a cube as the base and a prism as the roof.

The scene graph is constructed from a set of graph nodes as follows:

  • derive from Viewer class
  • overwrite build_ecef_geometry method to describe the scene as a graph
  • construct scene graph to contain a single house in a local coordinate system
    • at position Lat/Lon = 49 degrees latitude, 11 degrees longitude
      • via appending a coord node to the scene graph
    • and define the local scale of the building
      • via appending a scale node
    • and define the appearance of the building’s components
      • via appending color nodes
    • and define the proper positions of the components in the local coordinate system
      • via adppending translate nodes
    • and add the geometry of the house to the scene graph
      • via appending cube and prism nodes

All graph nodes are derived from libMini’s mininode base class.

class Renderer: public Viewer

   mininode_group *Renderer::build_ecef_geometry()
      // define local coordinate system at Lat/Lon=49/11
      mininode *house = new mininode_coord(minicoord(miniv3d(11*3600, 49*3600, 0),

      // scale up by a factor of 10000
      mininode *scale = house->append_child(new mininode_scale(10000));

      // white cube with base size 10x10 and height 5 meters
      // origin of the cube is its barycenter
      // translate up 2.5 meters
      scale->append_child(new mininode_color(miniv3d(1.0, 1.0, 1.0)))->
         append_child(new mininode_translate(miniv3d(0.0, 0.0, 2.5)))->
         append_child(new mininode_geometry_cube(10.0, 10.0, 5.0));

      // grey prism as roof with base size 10x10
      // origin of the prism is the center of its base plane
      // translate up 5 meters
      scale->append_child(new mininode_color(miniv3d(0.5, 0.5, 0.5)))->
         append_child(new mininode_translate(miniv3d(0.0, 0.0, 5.0)))->
         append_child(new mininode_geometry_prism(10.0, 10.0, 2.5));


The house as it looks like in the QTViewer:

Extension | | Scene Graph Nodes