Object Hierarchy and Simple PHIGS (SPHIGS)
A graphics package is an
intermediary between an application program and the graphics hardware.
Ø
SRGP Is a
simple and low-level package
Ø
SPHIGS Is a
richer but more complex standard graphics package
Ø
Main purpose
of such standards is to promote portability of application programs and of
programmers.
Ø
SPHIGS (pronounced
“ess-figs”)it is a subset of PHIGS.
Ø
SPHIGS (Includes
PHIGS and PHIGS+ features),But our aim in designing SPHIGS has been to
introduce concepts in the simplest possible way, not to provide package that it
is strictly upward-compatible with PHIGS.
There are
three major differences between SRGP and SPHIGS
1) To suit engineering and
scientific applications, SPHIGS uses3D, floating-point coordinate system, and
implements the 3D viewing pipeline.
2) SPHIGS maintains a database
structure. A structure is a logical grouping of primitives, attributes, and
other information.
3) SPHIGS operates in an
abstract,3D world-coordinate system, not in 2D screen space, and therefore does
not support direct pixel manipulation.
7.1 GEOMETRIC MODELING
7.1.1 What is a model?
Ø
Model is a
representation of some(not necessarily all) features of a concrete or abstract
entity.
Ø The purpose of a model of an entity is to
allow people to visualize and understand the structure or behavior of the
entity, and to provide a convenient vehicle for “experimentation” with and
prediction of the effects of inputs or changes to the model.
Ø Models simplify the actual structure of
behavior of the modeled entity to make the model easier to visualize or, for
those models represented by systems of equations, to make the model
computationally tractable.
Among common
types of models for which computer graphics is used are these:
Ø
Organizational models are hierarchies representing institutional
bureaucracies and taxonomies, such as library classification schemes and
biological taxonomies. These models have various directed-graph representations,
such as the organization chart.
Ø
Quantitative modes are equations describing econometric,
financial, sociological, demographics, climatic, Chemical, physical, and
mathematical systems. These are often depicted by graphs or statistical plots.
Ø
Geometric models are collections of components with well-defined
geometry and, often, interconnections between components, including engineering
and architectural structures, molecules and other chemical structures,
geographic structures, and vehicles. These models are usually depicted by block
diagrams or by pseudo-realistic “synthetic photographs”.
7.1.2 Geometric Models:
Geometric
model may represent are the following:
ü Spatial
layout and shape of components (i.e., the
geometry of the entity), and other attributes affecting the appearance of
components, such as color.
ü Connectivity
of components (i.e., the structure or topology
of the entity);
ü Application
– specific data values and properties associated with components, such as electrical characteristics or
descriptive text.
7.1.3 Hierarchy in Geometric Models
Geometric
models often have a hierarchical structure induced by a bottom-up construction
process: Components are used as building
blocks to create higher-level entities, which in turn serve as building blocks
for yet higher-level entities, and so on.Like large programming systems,
hierarchies are seldom constructed strictly bottom-up or top-down;
What matters is the final hierarchy, not the
exact construction process. Object hierarchies are common because few entities
are monolithic (indivisible); once we decompose an entity into a collection of
parts, we have created at least a two-level hierarchy.In the uncommoCase that
each object is included only once in a higher-level object, the hierarchy can
be symbolized as a tree, with objects as nodes and inclusion relations between
objects as edges. In the more common case of objects included multiple times,
the hierarchy is symbolized by a directed acyclic graph(DAG). As a simple Example
of object hierarchy, fig 7.1 shows a perspective view of a rudimentary
"android" robot;
Fig.7.2(a)
shows the robot's structure as a DAG. As a simple example of object hierarchy,
Fig 7.1 shows a perspective view of a rudimentary “android” robot; Fig.7.2(a)
shows the robot’s structure as a DAG. Note that we can duplicate the multiply
included objects to converttheDAGto a tree(Fig.7.2b).By convention, the arrow
are left off as redundant because the ordering relationship between nodes is
indicated by the nodes’ relative positions in the tree – if node A is above
node B, then A includes B.
A hierarchy, then, is created for
a variety of purposes:
To construct complex objects in a modular
fashion, typically by repetitive invocations of building locks that vary in
geometric and appearance attributes
To increase storage economy, since it suffices
to store only references to objects that are used repeatedly, rather than the
complete object definition each time
To allow easy update propagation, because a
change in the definition of one building-block object is automatically
propagated to all higher-level objects that use that object (since they now refer
to an updated version); the analogy between object and procedure hierarchy is
useful here, in that a change to the body of a procedure is also reflected in
all invocations of that procedure.
Interconnections. In most networks, objects arc placed in specified
locations (either interactively by the user or automatically by the application
program) and then are interconnected. Interconnections may be abstract and thus
of arbitrarily shape {e.g., in hierarchy or network diagrams, such as
organization charts or project-scheduling charts), or they may have significant
geometry of their own (e.g., a VLSI chip).
Parameter passing in object hierarchy. Objects invoked as building blocks must be
positioned in exactly the right place in their parent objects, and, in order to
fit, often must be resized and reoriented as well.
7.1.4 Relationship between Model. Application
Program, and Graphics System
interrelationship
between the model, the application program, and the graphics system. In the
diagram in Fig. 7.3, application programs are divided into five subsystems,
labeled (a) through (e):
a. Build.
modify, and maintain the model by adding, deleting, and replacing information
in it
b. Traverse
(scan) the model to extract information for display
c. Traverse
the model to extract information used in the analysis of the model’s behavior/performance
d. Display
both information (e.g., rendering of a geometric model. output of an analysis)
and user-interface "tools" (e.g., menus, dialog boxes)
e. Perform miscellaneous application tasks
not directly involving the model or display (e.g., housekeeping).
7.2 CHARACTERISTICS OF RETAINED-MODE GRAPHICS PACKAGES
SRGP-
Operates in Immediate mode and keeps
no record of the primitives and attributes passed to it. Thus deletions of and
changes to application objects necessitate he removal of information on the
screen and therefore either selective modification or complete regenerations of
the screen;either of these requires the application to re-specify primitives
from its model.
PHIGS- Operates
in retained mode;It keeps a
record of all primitives and other related information to allow subsequent
editing and automatic updating of the display, thereby offloading the
application program.
7.2.1 CENTRAL STORAGE STRUCTURE STORAGE (CSS)
and IT’S ADVANTAGES
PHIGS stored
information in a special-purpose database called theCentral Structure Storage
A structure
in PHIGS is a sequence of elements – primitives; appearance attributes
transformation matrices, and invocations of subordinate structures – whose
purpose is to define a coherent geometric object. Thus, PHIGS effectively
stores a special-purpose modeling hierarchy, complete with modeling
transformations and other attributes passed as "parameters’ ’ to
subordinate structures.
Advantages of CSS:
The primary advantage of the CSS: is rapid automatic screen regeneration
whenever the application updates the CSS.
A second advantage of the CSS: is automatic pick correlation.
A third advantage of the CSS: is that its editing facilities, in
combination with the features of hierarchical modeling, make it easy to create
various dynamic effects
7.2.2
Limitations of Retained-Mode Packages
Ø It is not necessary because an application
can do its own screen regeneration when the model is changed, can do its own
pick correlation, and can implement its own abject hierarchy via procedures
defining objects and accepting transformations and other parameters.
Ø The CSS is generally not sufficient because,
in most applications, a separately built and updated application data structure
is still necessary to record all appropriate data for each application object.
Ø The rationale for such immediate-mode
packages is that maintaining the CSS is often not worth the overhead, since the
application typically maintains an application model sufficient for
regenerating the screen image.
Ø For applications in which there is
significant structural change between successive images, using a retained—mode
package does not pay.
7.3 Defining and Displaying Structures
The
manipulations permitted on SPHIGS structures include the following:
Ø
Opening (to
initiate editing) and closing (to conclude editing)
Ø
Deleting
Ø
Inserting structure elements
Ø
Deleting structure elements
Ø
Posting for display
7.3.1
Opening and Closing Structures
To create a structure—for example, the
collection of primitives and attributes forming the arm component of the robot
in Fig. 7.2—we bracket calls to the element-generator procedures with calls to
voidSPH_openStructure (IntstructureID);
voidSPH_closeStructure (void];
7.3.2
Specifying Output Primitives and Their Attributes
voidSPH_polyLine (intvertexCount, point *vertices):
voidSPH_poIyMarker(intvertexCount, point *vertices);
voidSPH_fillArea(intvertexCount. point *vertices);
/* Like SRGP_polygon*/
voidSPH_text (point origin, char *str); /*Not fully 3D; see Section 7.7.2 */
Now, consider the definition of a simple
house, shown in Fig. 7.4. We can describe this house to SPHIGS by specifying
each face (also called a facet) as a fill area, at the cost of unnecessary
duplication in the specification and storage (in CSS) of each shared vertex.
This duplication also shows down display generation, since the viewing operation
calculation would be performed on a single vertex more than once. It is far
more efficient in storageand processing time to specify the facets using
indirect references to the shared vertices. We thus think of a polyhedron as a
collection of facets, each facet being a list of vertex indices and each index
being a "pointer" into a list of vertices. We can describe a
polyhedron’s specification using the following notation:
Polyhedron =
{VertexList, FacetList}
VertexList =
{VI, V2, V3, V4, V5. V6, V7, V8, V9,. V10}
V1 = (x1,
y1, z1), V2 = (x2, y2, z2). ..
FacetList =
{front = {I. 2, 3. 4. 5}, right = {2, 7, 8. 3}, . . . bottom = {. . .}}
SPHIGS
offers this efficient form of specification with its polyhedron primitive.
voidSPH_poIyhedron
(intvertexCount, intfacetCount, point *vertices, vertexlndex *facets);
As a simple
example, the following C code creates a structure consisting of a single polyhedron
modeling the house of Fig. 7.4:
SPH_openStructurc
(HOUSE_STRUCT);
SPH_polyhedron(10,
7,houseVertexList,houseFacesDescription);
SPH _closeStructure
();
Attributes:
The procedures listed in Fig. 7.5 generate
attribute elements. During display traversal, the execution of an attribute
element changes the attribute’s value in a modal fashion: The new value stays
in effect until it is changed explicitly.
PolyLine:
Void SPH_setLineStyle(CONTINOUS/DASHED/DOTTED/DOT_DASHED
lineStyle);
Void SPH_setLineWidthScaleFactor(double
scaleFactor);
Void
SPH_setLineColor(intcolorIndex);
Fill area and polyhedron:
Void
SPH_setInteriorColor(intcolorIndex);
Void
SPH_setEdgeFlag(EDGE_VISIBLE/EDGE_INVISIBLE flag);
Void SPH_setEdgeStyle(CONTINOUS/DASHED/DOTTED/DOT_DASHED
lineStyle);
Void
SPH_setEdgeWidthScaleFactor(double scaleFactor);
Void
SPH_setEdgeColor(intcolorIndex);
PolyMarker:
Void
SPH_setMarkerStyle(MARKER.CIRCLE/MARKER.SQUARE/…markerStyle);
Void
SPH_setMarkerSizeScaleFactor(double scaleFactor);
Void
SPH_setMarerColor(intcolorIndex);
Text:
Void
SPH_setTextFont(intfontIndex);
Void
SPH_setTextColor(intcolorIndex);
Fig.7.5 procedures generating attribute
elements.
7.3.3 Posting Structures for Display
Traversal
SPHIGS performs
a display traversal of the structure's elements in the CSS, executing each
element in order from the first to the last.
The following procedure adds a structure to
the list of posted structures maintained internally by SPHIGS:
voidSPH_postRoot (intstructID, intviewlndex);
7.3.4 Viewing
The
synthetic camera, it is helpful to think of a 3D graphics package as a
synthetic camera that takes "snapshots" of a 3D world inhabited by
geometrically defined objects.
The Viewport:
The viewport specifies a parallelpiped in the
NPC system to which the contents of the view volume defined in VRC is mapped.
The View table: SPHIGS
maintains a table of views that has an implementation dependent number of
entries. Each view consists of a specification of the view volume and viewport,
called the view representation, and a list (initially empty) of the roots
posted to it.
Void
SPH_setViewRepresentation(Int vieIndex,matrix_4x4 voMtrix,matrix_4x4 vmMatrix,
doubleNPCviewport_minX,doubleNPCviewport_maxX,
doubleNPCviewport_minYdoubleNPCVIEWPORT_maxY,
doubleNPCviewport_minZ,doubleNPCviewport_maxZ);
Multiple views. The
use of multiple views is powerful in many ways. We can display several
different structures simultaneously in individual areas of the screen by
posting them with different views. In
Fig 7.7 (a) , we present a schematic representation of the view table, showing
only the pointers to the list of structure networks posted to each view.We can
see that there is one view showing a street scene; also , there are three
separate views of robot.
7.5 Hierarchical
Structure Networks
7.5.1 Two-Level Hierarchy:Three types of structure elements:
output primitives,appearance
attributes, and transformation.
We show how the power of SPHIGS derives in
large part from structure hierarchy, implemented via an element that “calls"
a substructure when executed during traversal. Structure hierarchy should not
be confused with the template- procedure hierarchy of the previous section.
Template—procedure hierarchy is resolved at specification time, when the CSS is
being edited, and produces in—line elements, but substructure invocations. By
contrast, structure hierarchy induced by invocation of substructures is
resolved when the CSS is traversed for display—the execution of an invocation
element acts as a subroutine call.
The
structure-execution element that invokes a substructure is created by
void SPH_executeStructure(int
structureID);
Let us
replace the template procedure of the previous section by a procedure that
builds a house structure in the CSS (see Fig. 7.12). This procedure is called
exactly once by the mainline procedure, and the HOUSE_STRUCT is never posted;
rather, its display results from its being invoked as a subobject ofthe Street
structure. Note that the only differences in the-. STREET_STRUCT specification
is the addition of the call to the procedure that builds the house structure
and the replacement of each template procedure call by the generation of an
execute-structure element. Although the displayed image is the same as that of
Fig. 7.9(a), the structure network is different as shown in Fig.7.13, in which
the execute-structure element is depicted as an arrow.
Posting STREET_STRUCT tells SPHIGS to update
the screen by traversing the STREET_STRUCT structure network; the traversal is
in the form of a depth-First tree walk, just as a procedure/subroutine
hierarchy is executed. In the preceding example, the traverser initializes the
street structure's local matrix to the identity matrix, and then performs the
first invocation of the house substructure, applying the street structure’s
local matrix to each of the house’s vertices as though the house polyhedron
were a primitive element in the street structure itself. When it returns from
the first invocation, it sets the local matrix to a desired composite
transformation, and then performs the second invocation, applying thenew
composite matrix to the vertices of the house to create the second
instantiation of the house.
voidBuildStandardizedHouse(void)
{
SPH_openStructure
(HOUSE_STREET);
SPH_polyhedron(…);
SPH_closeStructure();
}
/*Mainline */
BuildStandardizedHouse();
SPH_openStructure
(STREET_STRUCT);
SPH_executeStructure(HOUSE_STRUCT):
/* First house */
Setlocal
transformation matrix;
SPH_executeStructure
(HOUSE_STRUCT); /* Mansion*/
Set local
transformation matrix;
SPH_executeSrructure
(HOUSE_STRUCT); /*Cottage */
SPH_c1oseStructure();
SPH_postRoot
(STREET_STRUCT,0);
Fig. 7.12
Use of a subordinate structure to model the street.
When it returns the local matrix is again
changed; the new composite is applied to the house's vertices to produce the
third house instance. We think of a structure as an independent object, with
its primitives defined in its own floating-point modeling—coordinate system
(MCS); this way of thinking facilitates the building of low-level standardized
building blocks. As we noted in Section 5.8, a transformation maps the vertices
in one coordinate system into another; here, SPHIGS uses the local matrix of
structure S to transform the primitives of substructures into S’s own MCS.
7.5.2 Simple Three-Level Hierarchy
As a simple example of three-level hierarchy,
we extend the house in our street example. The new house is composed of the
original standardized house (renamed SlMPLE_HOUSE_STRUCT) and a chimney
suitably scaled and translated to lie in the right place on top of the house.
We could revise the house structure by adding the chimneys facets directly to
the original polyhedron, or by adding a second polyhedron to the structure, but
we choose here to induce three-level hierarchy by decomposing the house into
two subobjects. An advantage of this modularization is that we can define the
chimney in a standardized manner (at the origin, of unit size) in its own MCS
(as shown in Fig. 7.14a) and then use scaling and translation to place it on
the roof in tl1e house’s MCS. If we had to define the chimney to fit exactly on
the roof and to map into the hot1se’s MCS without scaling.we would have to do
messy calculations to compute the vertices explicitly. With modularity,
however, we simply define the standardized chimney such that its bottom facet
has the same slope as the roof itself; with that condition met, uniform scaling
and arbitrary translation can be applied.
The revised house structure is
built via
SPH_openStructure (HOUSE_STRUCT);
SPH_executeStructure (SIMPLE_HOUSE_STREET);
set local matrix to
scale/translate standardized chimney onto roof of simple house;
SPH_executeStructure (CHIMNEY_STRUCT);
SPH_closeStructure();
What happens when this two—level house object
is instantiated by the street structure with a transformation to yield the
three-level hierarchy shown in Fig. 7.l4(b)C’ Since SPHIGS transforms at parent
by transforming the latter’s Component elements and substructures, we are
assured that the two component primitives (the simple house and the chimney)
are transformed together as a single unified object (Fig. 7.140). The key point
is that the street—structure specification did not need to be changed at all.
Thus, the designer of the strect structure does not need to be concerned with
the internal details of how the house is constructed or subsequently edited——it
is a black box.
7.5.3 Bottom-Up Construction of the Robot
A complex object or System hierarchy is
usually conceptualized and informally described top-down. For example, a
computerscience department building is composed of floors, which are composed
of offices and laboratories, which are composed of furniture and equipment, and
so on. Recall that our simple android robot is composed of an upper body and a
pedestal base; the upper body is composed of a trunk, a head, and two identical
arms, each of which is composed of a fixed hand and a "sliding"
(translating) thumb as gripper.
Even though we design top-down, we often
implement bottom-up, defining building blocks for use in the definitions of higher—level
building blocks, and so on.To create the hierarchy of building blocks. Thus, in
constructing the robot, we define the thumb building block for the robot's arm,
then the arm itself, and then join two instances of the arm building block onto
the upper body, and so on, as shown in the symbolic parts hierarchy of Fig. 7.2
and in the more detailed structure network diagram of the upper body in Fig. 7.
15.
Let us look at the bottom-up construction
process in more detail to see what geometry and transformations are involved.
It makes sense to design the arm and thumb in the same units of measurement, so
that they fit together easily. We define the thumb structure in a standardized
position in its own MCS in which it "hangs" along the y axis
(Fig.7.l6a). The arm structure is defined with the same unit of measurement as
that used for the thumb;
it consists
of the arm+hand polyhedron (standardized, hanging down along the y axis, as
shown in Fig. 7.16b) and a translated invocation of the thumb structure. The
translation element preceding the invocation of the thumb is responsible for
moving the thumb from its standardized position at the origin to its proper
place on the wrist of the arm (c).
The arm-invoking-thumb network is a two—level
hierarchy similar to the street-house example. By editing the translation
element in the arm structure, we can "slide’ ’ the thumb along the wrist
of the arm (Fig. 7.l6 d).
Next, we build the upper body. Since we want
to be able to rotate the head, we first specify the trunk polyhedron, then a
rotation,and next the head polyhedron (Fig. 7. l6e). Our next step is to have
the upper-body structure invoke the arm structure twice. What transformations
should precede these invocations? If our sole concern is positioning (i.e.,
translating) each arm correctly in the upper-body MCS, we may produce a picture
like Fig. 7.160-). Where the arm and upper body were clearly designed at
different scales. This is easy to fix: We can add a scale transformation
preceding the translation (Fig. 7.16g). However, a scale and a translation is
not enough if we want arms that can swing on the axis
connecting the two shoulders (for movement
much like that of the arm of a marchingsoldier); for this. we place a rotation
element in the structure preceding the translation. We have completed our
definition of the upper-body structure; assembling the full robot is Exercise
7.l. Fig. 7. l6(h) shows the upper body as it looks when the left arm`s
rotation element is nonzero.
7.5.4 Interactive Modeling Programs
Interactive 3D construction and modeling
programs facilitate the construction of object hierarchies through the bottom-up
assembly process just described. Most such programs offer a palette of icons
representing the program’s fundamental set of building blocks. If the drawing program
is application-specific, so are the building blocks; otherwise, they are such
common atoms as polylines, polygons, cubes, parallelepipeds, cylinders, and
spheres.
The user can select an icon in order to
instantiate the associated building block, and can then specify transformations
to be applied to the building-block instance. Such specification is typically
done via input devices, such as the mouse or control dials, that let the user
experiment with the instance’s size orientation, and position until it
"looks right." Since it is difficult to judge spatial relationships
in 2D projections of 3D scenes, more sophisticated interaction techniques use
3D grids, often with "gravity fields" surrounding intersection
points, numerical scales, sliders of various types, numerical feedback on the position
of vertices.
7.1O INTERACTION
Both SRGP’s and SPHIGS's interaction modules
are based on the PHIGS specification, and thus they have the same facilities
for setting device modes and attributes, and for obtaining measures.
The SPHIGS keyboard device is identical to
that of SRGP, except that the echo origin is specified in NPC space with the z
coordinate ignored. The SPHIGS locator device’s measure has an additional field
for the z coordinate, but is otherwise unchanged. SPHIGS also adds two new
interaction facilities.
The first is
pick correlation:-augmenting
the locator functionality to provide identification of an object picked by the
user.
The second
is the choice device:- described
in the reference manual, which supports menus.
7.1 0.1 Locator
The SPHIGS locator returns the cursor
position in NPC coordinates, with 2NPC = 0. It also returns the
index of the highest-priority view whose viewport encloses the cursor.
typedefstruct {
point position; /* [x, Y,0]NPCscreen
position */
intviewlndex; /* Index of view whose
viewport encloses the cursor */
intbuttonOfMostRecentTransition;
enum {UP, DOWN}
buttonChord[MAX_BUTTON_COUNT]:
} locatorMeasure;
When two viewports overlap and the cursor
position lies in the intersection of their bounds.
7.10.2 Pick
Correlation
Because the SPHIGS programmer thinks in terms
of modeled objects rather than of the pixels composing their images, it is
useful for the application to be able to determine the identity of an object
whose image a user has picked.
The primary use of the locator, therefore, is
to provide an NPC point for input to the pick—correlation procedure discussed
in this section. As we saw with SRGP, pick correlation in a flat—earth world is
a straightforward matter of detecting hits—primitives whose images lie close
enough to the locator position to be considered chosen by the user. If there is
more than one hit, due to overlapping primitives near the cursor, we
disambiguate by choosing the one most recently drawn. since that is the one
that lies "on top." Thus, a 2D pick correlation examines the
primitives in inverse temporal order, and picks the first hit. Picking objects
in a 3D, hierarchical world is a great deal more complex, for the reasons
described next; fortunately, SPHIGS relieves an application of this task.
Picking in a hierarchy. Consider the complexity introduced by
hierarchy. First, what information should be returned by the pick-correlation
utility to identity the picked object'? A structure ID is not enough because it
does not distinguish between multiple instances of a structure. Only the full
path—a description of the complete ancestry from root to picked primitive-provides
unique identification.
Comparison criterion. How proximity to an object is defined when
the comparison should really be done in 3D? Since the locator device
effectively yields a 2D NPC value, there is no basis for comparing the z
coordinates of primitives to the locator position. Thus, SPHIGS can compare the
cursor position only to the screen images of the primitives, not to the WC
locations of the primitives.
If a primitive is a hit, it is deemed a
candidate for correlation. In wireframe mode, SPH IGS picks the very first
candidate encountered during traversal; the reason for this strategy is that
there is no obvious depth information in a wireframe image. so the user does
not expect pick correlation to take relative depth into account. (A side effect
of the strategy is that it optimizes pick correlation).In shaded rendering modes,
SPHIGS picks the candidate whose hit point (the NPC point, on the primitive’s
normalized (3D NPC) surface. to which the user pointed directly) is closest to the
viewpoint—the one "in front”.
Pick-correlation utility. To perform pick correlation, the application
program calls a SPHIGS pick-correlation utility’s with an NPC point and a view
index, typically returned by a previous interaction with the locator:
voidSPH_pickCorrelate
( point position. IntviewIndex,pickInformation *pickInfo);
The returned
information identifies the primitive picked and its ancestry via a pick path,
as described by Pascal data types in Fig. 7.24.
typedefstruct
{
intstructureID;
intelementlndex;
/* Enumerated type: polyline,polyhedron,
execute-structure, etc. */
ElementTypeCodeelementype;
intpicklD;
}pickPathltem;
typedefpickPathltempickPath[MAX.HIERARCHY_LEVEL];
typedefstruct{
intpickLevel;
pickPath
path;
}picklnformation;
Fig. 7.24 Pick-path storage types.
In that structure, a code presenting the type
of the element, and the pick ID ofthe element. Figure 7-25 uses the structure
network of Fig. 7.15 for the robot’s upper body, and shows the pick information
returned by several picks within the structure’s displayed image.
How does the pick path uniquely identify each
instance of a structure that is invoked arbitrarily many times within the
hierarchy? For example, how do we distinguish a pick on the robot’s left thumb
from a pick on its right thumb'? The pick paths for the two thumbs are
identical except at the root level, as demonstrated by points a and e in Fig.
7.25.
voidSPH_setPickIdentifier(int
id);
7.12.1 Rendering
The
conceptual rendering pipeline that implements display traversal is illustrated
in Fig. 7.26. Its First stage is the actual depth—first traversal of the CSS
itself.
Each primitive encountered during traversal
is passed through the remainder of the pipeline: First, the modeling
transformations are applied to map the primitive from modeling coordinates to
world coordinates. Then, the viewing operation is applied to transform and clip
the primitive to the canonical view volume, and then to map it to the NPC
Parallelepiped. Since these processes are independent of the display device and
deal with vertex geometry in floating—point coordinates, this portion of
The pipeline
immediately following traversal is often referred to as the geometry-processing
subsystem.
The back end
of the pipeline takes transformed, clipped primitives and produces pixels; we
will refer to this pixel processing as rasterization. This process is, of
course, straightforward for wireframe mode: The NPC coordinates are easily
mapped (via scaling and translating, with z ignored) to integer device
coordinates, and then the underlying raster graphics package’s line-drawing
function is invoked to do the actual scan conversion. Shaded rendering,
however, is quite complex, and is composed of three subprocessesvisible-surface
determination (determining which portions of a primitive are actually visible
from the synthetic camera’s point of view), scan conversion (determining the
pixels covered by a primitive’s image), and shading (determining which color to
assign to each covered pixel). The exact order in which these subprocesses are
performed varies as a function of the rendering mode and implementation method.
Traversal.
Since all stages of the rendering pipeline but the first one are covered in
other chapters, we need to discuss only the traversal stage here. In a simple
implementation, SPHIGS regenerates the screen by erasing it and then re-traversing
all posted roots (a list of which is stored with each view). Optimizing
regeneration in order to traverse as little of the CSS as possible is quite
difficult, because the effect of a trivial operation is potentially enormous.
For example, it is difficult to determine how much of the screen must be
regenerated due to the editing of a structure: It is possible that the
structure is never invoked and thus has no effect on the screen, but it is also
possible that it is a commonly invoked
Building
blocks appearing in most of the views. Even when the implementation can
determine that only a single view has been affected by an operation, refreshing
that view may damage the images of objects in overlapping viewports of higher
priority. Doing damage repair efficiently is, in general, a complicated task
requiring considerable bookkeeping.
In implementations on high-performance
workstations, where the image can be traversed and regenerated in a fraction of
a second, the bookkeeping space and time overhead needed to regenerate the
screen selectively is probably not worthwhile, and therefore complete
regeneration is used most frequently. In either the complete or selective regeneration
schemes, the double—buffering technique described later in this section can be
used to prevent annoying visual discontinuities on the screen during display
traversal.
The traversal of a structure cart be done in
hardware or software; here, we show a procedural—language implementation, the pseudo-code
for which is given in Fig. 7.27, The procedure inherits a traversal state,
which it then maintains as its local state for the duration of its activation.
The attribute values (including the name set) and three transformations matrices
(GM, LM, and their product, CMTM) harm the traversal state, and the attributes
and the CMTM are passed down from parent activation to child activation. (The
activation of the procedure for a root structure inherits an identity GM and an
attribute record filled with default values). The procedure visits each element
in the structure and performs an operation based on the elements type, as
indicated in Fig. 7.27.
7.12.2 Pick
Correlation
In pick correlation, SPHIGS traverses those
networks posted to the view port in which the specified NPC point lies. The
traversal is nearly identical to that performed during display; the
modeling-transformation matrices are maintained, and much of the rendering
pipeline is performed. Moreover. the pick ID ignored during display traversal,
is maintained as part of the local traversal state in the recursive traversal
procedure. (The attribute group does not need to be maintained because during
hit detection SPHIGS does not take into account attributes such as line
thickness.) Let us first examine pick correlation for wireframe rendering,
where traversal is halted at the very first hit. Because traversal is
recursive, the pick path is easily determined the moment the first hit is
found: Each activation of the traversal procedure is responsible for one level
of information in the pick path. Each primitive is transformed to NPC before
being compared to the locator position for hit detection. When a hit is
discovered by an activation of the procedure, it returns and the recursion is
unwound. Before returning each activation stores its pick information into one
level of a global pick-information array.
In shaded rendering modes, the order in which
primitives are encountered during traversal has no bearing on whether they
appear in front of or in back of other primitives whose images map to the same
part of the screen. Therefore, the SPHIGS pick-correlation algorithm cannot
simply choose the first hit detected. Rather, it must traverse all posted structure
networks, maintaining a list of candidate hits. When traversal is completed,
the candidates are compared to determine the candidate whose NPC hit point is
closest to the viewpoint—that is, the one whose z coordinate is algebraically
largest. To calculate a candidates z coordinate at the hit point, we can plug
the x and y coordinates of the locator measure into the appropriate equations
for each primitive; the (parametric) line equation for edges, and the plane
equation for facets (see Exercises 7.7 and 7.8). Another approach using a
hardware visible- surface determination algorithm.Pick-correlation traversal
can, of course, be optimized in a variety of ways, including the
extent-checking techniques used to optimize display traversal.
Analytical hit detection. Two fundamental methods. analytical and
clipping, are used for hit detection. For analytical hit detection.algebraic
equations are used to determine whether the NPC primitive lies sufficiently
close to the 2D NPC locator measure. We First convert to 2D by ignoring the z coordinate for an orthographic
projection or use the perspective transform to create an orthographic view
volume. Some examples of analytical techniques follow:
Ø In WIREFRAME mode, a functionPtNearLineSegment
is used to compute the distance in NPC from the cursor position 10 each edge of
a facet or fill area, and to each line segment 0f a polyline. This same
function would be used in shaded rendering modes for polyline primitives.
Ø In
shaded rendering modes, a function PtlnPolygon is used to test for hits cm till
areasand facets. One popular algorithm for determining it` the NPC cursor
position lies inside a polygon, based on the odd-parity rule casts a ray from
the locator position and determines how many times the ray intersects the
polygon. The algorithm traverses the edge list, testing for intersections and
special cases (e.g., intersections at vertices, edge—ray co-linearity). This
algorithm handles the general case of concave and self-intersecting polygons.
Optimized computational geometry algorithms are available ii` it can be
guaranteed that polygons do not self-intersect, 0r that a horizontal ray
intersects only two edges, or that the polygon is convex.
Ø Hit detection for non-geometric text is most
easily performed by comparing the locator position to the text’s rectangular
screen extent.
Ø Packages that support primitives such as
ellipses and curves and surfaces require more complex pick-correlation
algorithms.
Hit
detection via clipping. Some
hardware clipping devices and optimized software clipping utilities return
state information, allowing an application to determine whether anypan of a
primitive’s image lies inside a 2D integer clip rectangle, without having
actually to draw the primitive. An SPHIGS implementation can use this type of
clipping to test for candidacy: The clip rectangle is set to a pick window- a
small square surrounding the cursor position-and then traversal is performed.
Each primitive (transformed to integer device coordinates) is given to the clipper,
which returns a Boolean "hit—detection" result. Alternatively, ifthe
clipper does not return any such state information, we can draw each primitive
into an offscreen bitmap using the pick-window clip rectangle; if any pixels
are changed, the primitive is deemed a candidate.
7.14 LIMITATIONS OF HIERARCHICAL
MODELING IN PHIGS
We
discuss the limitations of hierarchy in general and in PHIGS in particular
Limitations
of Simple Hierarchy: Some
applications have no real structure for their data(e.g., data for scatter
plots), or have at most a (partial) ordering in their data (e. g., a function
represented algebraically). Many other applications are more naturally
expressed as networks, that is, as general (directed) graphs (which may have
hierarchical subnets). Among these are circuit and electrical—wiring diagrams,
transportation and communication networks, and chemical-plant—piping diagrams.
Another example of simple hierarchy’s insufficiency
for certain types of models is Rubik‘s cube, a collection of components in
which the network and any hierarchy (say of layers, rows, and columns) is fundamentally
altered after any transformation.
For
other types of models, a single hierarchy does not suffice. For example, the
pen holder on an (x, y) plotter is moved by, and therefore "belongs"
to, both the horizontal and vertical arms. In short, whether the application
model exhibits pure hierarchy, pure network without hierarchy, and hierarchy in
a network with cross-links. or multiple hierarchies. SPHlGS can be used to
display it, but we may not want, or be able, to use structure hierarchy in its
full generality.
7.14.2
Limitations of SPHIGS "Parameter Passing"
For example, how can we build a robot with
two identical arms and have the robot useits right arm to pick up a cylinder
from a table and move away with that cylinder`? The pick-up operation can be
performed by editing the arm structure to add an invocation of the cylinder
structure, so that as the robot or arm moves subsequently. The cylinder moves
along with it. But if we implement the robot by having a single arm structure invoked
twice by the upper-body structure, the result of that operation would be that
both the left and right arm would be holding a Cylinder! Thus, we have no
Choice but to build two separate arm structures with unique structure ID’s,
each invoked only once. Let US extend this example. If we wish to have an army
of robots with independently controlled arms, wemust build Iwo unique arm
structures for each robot! Obviously, here is a case where structure hierarchy
is not as useful as we first thought.
The reason that structure hierarchy does not support
instances of structures differing in the settings of transformations at various
hierarchical levels is that structure hierarchy has neither the general
parameter- passing mechanism of procedure hierarchy nor general How—of-control
constructs. Rather, it is essentially a data organization with rudimentary
interactions between structures and at most limited conditional execution of
structures (in PHIGS+). We have seen that a parent’s transformations are
inherited by all the children, and there is no provision for a particular child
to be affected selectively.
By contrast, in a procedure hierarchy, a
"root" procedure passes parameters that are either used directly by
procedures the root calls, or passed down by those procedures to lower-level
procedures. Thus, the root can pass down parameters arbitrarily deeply and selectively
via intermediate procedures. Furthermore, with parameters, a procedure can control
not just the data on which a lower-level procedure operates, but even the way
in which the lower-level procedure operates. To change its operation, the
lower—level procedure uses flow-of-control constructs to test parameters and
selectively enables or disables code segments. Because of structure hierarchy’s
lack of general parameter-passing and flow-of-control mechanisms, our analogy
between structure hierarchy and procedure hierarchy in the introduction was a
superficial one.
By augmenting the attribute—binding model of
PHIGS, we could specify attributes for selected object instances at arbitrary
levels in a hierarchy. A system that has such a general mechanism is SCEFO
[STRA88], which allows the programmer to specify an attribute that is to be
applied when the traversal reaches a certain state, the state being represented
by a pathname similar to the pick path returned by the PHIGS pick device. With
this facility, it would be possible to control individually the colors or
positions of the thumb instances in our robot, without having to create two
virtually identical arm masters, by making use of the fact that the two thumb
instances have unique pathnames.
Another limitation in the PHIGS parameter—passing
mechanism is that it handles transformations and appearance attributes for
which inheritance rules are very simple. Itwould not be easy to support
operations more complex than geometric transformations; a more general model is
needed to support set operations on solid primitives and deformation operations
such as bend, taper and twist.