Core Scene Graph Data Structures in C++
SceneGraph
The SceneGraph class is implemented as a subclass of the Group node. An instance of the SceneGraph class is used to represent the root of each scene graph in memory. Each instance of the SceneGraph class can be associated with a file. The name of the file, as well as other global parameters, are stored as fields of the SceneGraph class.
class SceneGraph : public Group {
public:
SceneGraph();
virtual ~SceneGraph();
void clear();
string& getUrl();
void setUrl(const string& url);
Node* find(const string& name);
virtual bool isSceneGraph() const;
virtual string getType() const;
};
How to build a simple SceneGraph
Let us consider a file named "tetrahedron.wrl" containing the following text
#VRML V2.0 utf8
Shape {
geometry IndexedFaceSet {
coord Coordinate {
point [
1.633 -0.943 -0.667 # V0
0.000 0.000 2.000 # V1
-1.633 -0.943 -0.667 # V2
0.000 1.886 -0.667 # V3
]
}
coordIndex [
0 1 2 -1 # F0
3 1 0 -1 # F1
2 1 3 -1 # F2
2 3 0 -1 # F3
]
}
}
|
|
The following code fragment, implemented as a method, can be used to build an instance of the SceneGraph class to represent the tetrahedron in the DGP2026 application.
void makeTetrahedronSceneGraph(SceneGraph& wrl) {
// reference to existing SceneGraph received as argument may not be empty.
wrl.clear();
// this scene graph has a single Shape node as a child
// create the Shape node
Shape* shape = new Shape();
// make the Shape node a child of the SceneGraph node
// the method is inherited from Group
wrl.addChild(shape);
// since the file does not define an Appearance nod explicitly,
// the default values must be added
Appearance* appearance = new Appearance();
shape->setAppearance(appearance);
// add a default Material node so that the mesh is not rendered black
Material* material = new Material();
appearance->setMaterial(material);
Color color(1.0f,0.0f,0.0f); // RED
material->setDiffuseColor(color);
// create an IndexedFaceSet node
IndexedFaceSet* ifs = new IndexedFaceSet();
shape->setGeometry(ifs);
// get the coord field
vector<float>& coord = ifs->getCoord();
// create the vertex coordinates
// V0
coord.push_back( 1.633f);
coord.push_back(-0.943f);
coord.push_back(-0.667f);
// V1
coord.push_back( 0.000f);
coord.push_back( 0.000f);
coord.push_back( 2.000f);
// V2
coord.push_back(-1.633f);
coord.push_back(-0.943f);
coord.push_back(-0.667f);
// V3
coord.push_back( 0.000f);
coord.push_back( 1.886f);
coord.push_back(-0.667f);
// get the coordIndex field
vector<int>& coordIndex = ifs->getCoordIndex();
// create the faces
// F0
coordIndex.push_back(0);
coordIndex.push_back(1);
coordIndex.push_back(2);
coordIndex.push_back(-1);
// F1
coordIndex.push_back(3);
coordIndex.push_back(1);
coordIndex.push_back(0);
coordIndex.push_back(-1);
// F2
coordIndex.push_back(2);
coordIndex.push_back(1);
coordIndex.push_back(3);
coordIndex.push_back(-1);
// F3
coordIndex.push_back(2);
coordIndex.push_back(3);
coordIndex.push_back(0);
coordIndex.push_back(-1);
}