Building Shapes out of Points, Lines, and Faces
Motivation
Complex shapes are hard to build with primitive shapes:
- TerrainAnimals
- Plants
- Machinery
Instead, build shapes out of atomic components:
- Points, lines, and faces
Building shapes using coordinates
Shape building is like a 3-D connect-the-dots game:
- Place dots at 3-D locations
- Connect-the-dots to form shapes
A coordinate specifies a 3-D dot location. Measured relative to a coordinate system origin. A geometry node specifies how to connect the dots.
Syntax: Coordinate
A Coordinate node contains a list of coordinates for use in building a shape.
XML Encoding
1
2
3
<!-- X Y Z -->
<Coordinate
point='2.0 1.0 3.0, 4.0 2.5 5.3, ...'/>
Classic VRML Encoding
1
2
3
4
5
6
7
8
Coordinate {
point [
#X Y Z
2.0 1.0 3.0,
4.0 2.5 5.3,
...
]
}
Using geometry coordinates
Build coordinate-based shapes using geometry nodes:
For all three nodes, use a Coordinate node as the value of the coord field.
Syntax: PointSet
A PointSet geometry node creates geometry out of points:
- One point (a dot) is placed at each coordinate
XML Encoding
1
2
3
4
5
6
7
<Shape>
<Appearance><!-- ... --></Appearance>
<PointSet>
<Coordinate
point='...'/>
</PointSet>
</Shape>
Classic VRML Encoding
1
2
3
4
5
6
7
8
Shape {
appearance Appearance { ... }
geometry PointSet {
coord Coordinate {
point [ ... ]
}
}
}
Syntax: IndexedLineSet
An IndexedLineSet geometry node creates geometry out of lines:
- A straight line is drawn between pairs of selected coordinates
XML Encoding
1
2
3
4
5
6
7
8
<Shape>
<Appearance><!-- ... --></Appearance>
<IndexedLineSet
coordIndex='...'>
<Coordinate>
point='...'/>
</IndexedLineSet>
</Shape>
Classic VRML Encoding
1
2
3
4
5
6
7
8
9
Shape {
appearance Appearance { ... }
geometry IndexedLineSet {
coordIndex [ ... ]
coord Coordinate {
point [ ... ]
}
}
}
Using line set coordinate indexes
Each coordinate in a Coordinate node is implicitly numbered
- Index 0 is the first coordinate
- Index 1 is the second coordinate, etc.
To build a line shape:
- Make a list of coordinates, using their indexes
- List coordinate indexes in the coordIndex field of the IndexedLineSet node
A line is drawn between pairs of coordinate indexes:
- -1 marks a break in the line
- A line is not automatically drawn from the last index back to the first
coordIndex [ 1, 0, 3, 8, -1, 5, 9, 0, -1 ] | |
1, 0, 3, 8, | Draw line from 1 to 0 to 3 to 8 |
-1, | End line, start next |
5, 9, 0 | Draw line from 5 to 9 to 0 |
Syntax: IndexedFaceSet
An IndexedFaceSet geometry node creates geometry out of faces:
- A flat face (polygon) is drawn using an outline specified by coordinate indexes
XML Encoding
1
2
3
4
5
6
7
8
<Shape>
<Appearance><!-- ... --></Appearance>
<IndexedFaceSet
coordIndex='...'>
<Coordinate>
point='...'/>
</IndexedFaceSet>
</Shape>
Classic VRML Encoding
1
2
3
4
5
6
7
8
9
Shape {
appearance Appearance { ... }
geometry IndexedFaceSet {
coordIndex [ ... ]
coord Coordinate {
point [ ... ]
}
}
}
Using face set coordinate index lists
To build a face shape
- Make a list of coordinates, using their indexes
- List coordinate indexes in the coordIndex field of the IndexedFaceSet node
A triangle is drawn connecting sequences of coordinate indexes:
- -1 marks a break in the sequence
- Each face is automatically closed, connecting the last index back to the first
coordIndex [ 1, 0, 3, 8, -1, 5, 9, 0, -1 ] | |
1, 0, 3, 8 | Draw face from 1 to 0 to 3 to 8 to 1 |
-1, | End face, start next |
5, 9, 0 | Draw face from 5 to 9 to 0 to 5 |
-1 | End face |
Syntax: IndexedFaceSet
An IndexedFaceSet geometry node creates geometry out of faces:
- solid - shape is solid
- ccw - faces are counter-clockwise
- convex - faces are convex
XML Encoding
1
2
3
4
5
6
7
8
9
10
<Shape>
<Appearance><!-- ... --></Appearance>
<IndexedFaceSet
solid='true'
ccw='true'
convex='true'
coordIndex='...'>
<Coordinate ... />
</IndexedFaceSet>
</Shape>
Classic VRML Encoding
1
2
3
4
5
6
7
8
9
10
Shape {
appearance Appearance { ... }
geometry IndexedFaceSet {
solid TRUE
ccw TRUE
convex TRUE
coordIndex [ ... ]
coord Coordinate { ... }
}
}
Using shape control
A solid shape is one where the insides are never seen:
- If never seen, don’t attempt to draw them
- When solid TRUE, the back sides (inside) of faces are not drawn
The front of a face has coordinates in counter-clockwise order:
- When ccw FALSE, the other side is the front
Faces are assumed to be convex
- When convex FALSE, concave faces are automatically broken into multiple convex faces
Syntax: CoordinateInterpolator
A CoordinateInterpolator node describes a coordinate path:
- keys - key fractions
- keyValues - key coordinate lists (X, Y, Z lists)
XML Encoding
1
2
3
<CoordinateInterpolator
key='0.0, ...'
keyValue='0.0 1.0 0.0, ...'/>
Classic VRML Encoding
1
2
3
4
CoordinateInterpolator {
key [ 0.0, ... ]
keyValue [ 0.0 1.0 0.0, ... ]
}
Typically route into a Coordinate node’s set_point input.
Interpolating coordinate lists
A CoordinateInterpolator node interpolates lists of coordinates:
- Each output is a list of coordinates
If n output coordinates are needed for t fractional times:
- n × t coordinates are needed in the key value list
Summary
- Shapes are built by connecting together coordinates
- Coordinates are listed in a Coordinate node
- Coordinates are implicitly numbers starting at 0
- Coordinate index lists give the order in which to use coordinates
The PointSet node draws a dot at every coordinate:
- The coord field value is a Coordinate node
The IndexedLineSet node draws lines between coordinates:
- The coord field value is a Coordinate node
- The coordIndex field value is a list of coordinate indexes
The IndexedFaceSet node draws faces outlined by coordinates:
- The coord field value is a Coordinate node
- The coordIndex field value is a list of coordinate indexes
The CoordinateInterpolator node converts times to coordinates.