There are times when you will want to treat a collection of nodes has
being related to each other in some sibling-like manner, instead of
the more usual parent-child relationship between nodes in a scene
graph. By grouping nodes together in this way, you can apply
operations like transformations consistently to all member nodes of
the group. The group actually becomes a node in the scene graph,
and all the sibling nodes are children of the group node. The simplest
type of group node class is Group
. The usage is:
Group { FirstNode SecondNode ... }
You might have noticed some of the examples so far contained something
called a Separator
node enclosing the description of the
scene. Separators let you form a group of nodes and separate their
effects from the rest of the scene. For example, if you added a
Material
node to make all objects red, then if that
node was within the group of a Separator
node, only the
other nodes in the same group would be coloured red. Nodes outside
of the group wouldn't turn red; they would remain whatever colour
they are by default or through the actions of Material
nodes outside of the group. It is a good idea to enclose your
entire scene in a single Separator
node, particularly
if you want to include .iv
files within each other.
In addition to containing child nodes, a Separator
has the following fields, each shown with its default value:
Separator { renderCaching AUTO boundingBoxCaching AUTO renderCulling AUTO pickCulling AUTO }
You will rarely have reason to use any of these fields.
Another type of grouping node is the Switch
node.
This node lets you specify exactly one child node to be available
for traversal. Each child node has an index number, beginning
with 0 for the first child. The child that can be traversed is
specified by the value of the whichChild
field;
any other nodes in the group are ignored when rendering the scene.
The default value for this field is -1, which means that none
of the children are traversed.
It is important to understand what it means for the other child
nodes to be ignored when rendering the scene. If a portion of a scene
graph is not traversed, it won't have any effect on the image you see.
This means, for example, that objects not traversed won't appear in
the image, and material properties not traversed won't effect the
appearance of objects in the image. If you create an animation by
connecting the whichChild
field to the output of some
engine, then as the value of this field changes, a newly-selected child
object would appear and any no-longer-selected sibling objects would
vanish. This is essentially how the
Blinker
engine works.
More information about group nodes in Open Inventor is available in chapter 3 of Inventor Mentor, and in the man pages for SoSeparator and SoSwitch. Note that there is a somewhat related concept referred to as node kits. You can ignore discussions about node kits, since they are really only useful to C++ programmers.