__Hierarchical Modeling__

A primitive object is just a primitive object and an aggregation object
consists of more than one. An object is a set of surfaces grouped together and
treated as a single entity for purposes of shading, motion, duplication or assembling other objects.

RiAttributeBegin() and RiAttributeEnd() are most oftem used to define a single
aggregate.

### Hierarchical Models

Any aggregate object may be a part of another aggregate just as a primitive object can. In other words, blocks may be nested in one another. Thus, RenderMan
supports the hierarchical model.

### Hierarchies and RenderMan

The RenderMan supports this hierarchical model by providing a graphics environment, geometric transformation scheme and explicit support for solid modeling.
Graphics Environment
The graphics environment stack is also hierarchical. RiAttributeBegin() begins by putting things on the stack and the environment can be restored using
RiAttributeEnd() as it was originally declared.
Scene description
The root of the object hierarchy is the scene being declared. This is defined in a world block bounded by RiWorldBegin() and RiWorldEnd().
### Geometric Transformation Environment

The RenderMan interface provides a set of features for transforming object geometry defined by the geometric transformation environment. The most important use of the geometric hierarchy is to give each part of the object its own coordinate system.
The current Transformation
The RenderMan graphics environment includes along with object color and other
attributes , a current transformation.

RiTransformBegin() has the effect of retaining the coordinate system in effect
when it is called.RiTransformEnd() disposes of all coordinate systems and restores the retained one.

The transformations provided are

Translation
Rotation
Scaling
Skew Transform
Perspective Transform
The default co-ordinate system of the RenderMan interface is the camera coordinate system, or the left handed system.
### Constructive Solid Geometry

This allows an object to be a boolean combination of two or more objects.

A solid is defined as a set of points in three dimensional space, with a surface separating points in a set from those not in the set. Given a number of objects, we can combine them into a composite object using Union, Intersection and
difference operations.

A solid as defined in RenderMan is a boundary representation of the set of surfaces that enclose the space. The surfaces must join properly to enclose the space such that every point in space is either inside or outside. The points of the solid are not necessarily contiguous.

A primitive solid is created as an assemblage of the primitive surface types.
Composite solids are formed from primitive solids in a hierarchical fashion.
All CSG solids are declared by enclosing a series of RenderMan routines between calls to RiSolidBegin() and RiSolidEnd().

RiSolidBegin(RI_PRIMITIVE)
type RI_PRIMTIVE forms a CSG object from a set of surface primitives. Between set of RiSolidBegin() and RiSolidEnd(), any set of statements could be added.
### Object Instancing

RenderMan has the ability to predefine models and create instances of them.

Copyright - Sudhir R Kaushik (sudhir@cs.wpi.edu)