Using Geometric Transformations
Hill: 247-251
The simplest method of modelling objects is to use primitives such as lines
and polygons. In the following, M is the desired transformation matrix
which transforms points (2D or 3D) to pixel coordinates.
for each vertex i
new_vertex_list[i] = M * vertex_list[i]
scanconvert( new_vertex_list )
Here is the equivalent in OpenGL:.
glBegin(GL_POLYGON);
for each vertex i
glVertex3fv( vertex_list[i] );
glEnd();
There are several things to note:
-
glVertex3fv() :
-
multiplies vertex by M
-
feeds points to scan conversion
-
glBegin() : specifies drawing mode
-
GL_POINTS
-
GL_LINE_LOOP
-
GL_POLYGON
-
...
-
matrix M is hidden ( current transformation matrix)
M can be setup as follows:
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
glTranslatef(2.0, 1.0, 0.0);
glRotatef( -3.14/2.0, 0.0, 0.0, 1.0);
glScalef(2.0, 2.0, 2.0);
...
which produces the matrix M = trans(2,1,0) rot(z,-90) scale(2,2,2)
....
Another way of loading M is to use:
glMatrixMode( GL_MODELVIEW );
glLoadMatrixf( M );
Transformation Hierarchies
Hill: 254-255 (explains push and pop)
Consider building the following model of a hand with one finger::
This can be constructed using a transformation hierarchy. In the following
scene graph, circles represent transformations and squares represent
geometry. The pseudocode on the left can be used to draw the scene.
f1: trans(d_hand,0,0) rot(z,th1)
f2: trans(d1,0,0) rot(z,th2)
f3: trans(d2,0,0) rot(z,th3)
M=M*Thand
draw hand
M=M*Tf1
draw f1
M=M*Tf2
draw f2
M=M*Tf3
draw f3 |
|
Now consider drawing a hand with three identical fingers. We can create
a more complex scene graph which uses multiple instances of a finger scene
graph, as shown below. Because each of the fingers is defined relative
to the hand coordinate system, a way is needed to restore the hand coordinate
system before beginning to draw each finger. This is done through the pushMatrix()
and popMatrix() function calls.
M=M*Thand
draw hand
pushMatrix()
M=M*Tf1a
draw_finger()
popMatrix()
pushMatrix()
M=M*Tf1b
draw_finger()
popMatrix()
pushMatrix()
M=M*Tf1c
draw_finger()
popMatrix()
draw_finger() {
draw f1
M=M*Tf2
draw f2
M=M*Tf3
draw f3
}
|
|
Many graphics systems maintain a stack for the current transformation matrix: