1 chapter 4 geometric objects and transformation
TRANSCRIPT
1
Chapter 4
Geometric Objects and Transformation
2
Objectives
Introduce the elements of geometry Scalars Vectors Points
Develop mathematical operations among them in a coordinate-free manner
Define basic primitives Line segments Polygons
3
Basic Elements Geometry is the study of the relationships among objects in
an n-dimensional space In computer graphics, we are interested in objects that exist in
three dimensions
Want a minimum set of primitives from which we can build more sophisticated objects
We will need three basic elements Scalars Vectors Points
4
Scalars Scalars can be defined as members of sets whic
h can be combined by two operations (addition and multiplication) obeying some fundamental axioms (associativity, commutivity, inverses)
Examples include the real and complex number under the ordinary rules with which we are familiar
Scalars alone have no geometric properties
5
Vectors Physical definition: a vector is a quantity
with two attributes Direction Magnitude Directed line segments
Examples include Force Velocity
DirectedLine segment
6
Vector Operations Every vector has an inverse
Same magnitude but points in opposite direction Every vector can be multiplied by a scalar There is a zero vector
Zero magnitude, undefined orientation The sum of any two vectors is a vector
Use head-to-tail axiom
v -v vv=u+w
u
w
7
Vectors Lack Position These vectors are identical
Same length and magnitude
Vectors spaces insufficient for geometry Need points
8
Points Location in space Operations allowed between points and vectors
Point-point subtraction yields a vector Equivalent to point-vector addition
P=v+Q
v=P-Q
9
Coordinate-Free Geometry
Objects and coordinate system
Objects without coordinate system
10
Linear Vector and Euclidean Spaces Mathematical system for manipulating vectors Operations
Scalar-vector multiplication u=v Vector-vector addition: w=u+v 1 • P = P 0 • P = 0 (zero vector)
Expressions such as v=u+2w-3r
Euclidean space is an extension of vector space that adds a measure of size of distance
11
Affine Spaces Point + a vector space Operations
Vector-vector addition Scalar-vector multiplication Point-vector addition Scalar-scalar operations
12
The Computer-Science View Abstract data types(ADTs) vector u, v;
point p, q;scalar a, b;
In C++, by using classes and overloading operator, we could write:q = p + a*v;
13
Geometric ADTs Textbook notations:
, , denote scalars P, Q, R define points u, v, w denote vectors
|v| = |||v|, v = P – QP = v + Q
14
Lines Consider all points of the form
P()=P0 + d
Set of all points that pass through P0 in the direction of the vector d
15
Parametric Form This form is known as the parametric form of the line
More robust and general than other forms Extends to curves and surfaces
Two-dimensional forms Explicit: y = mx +h Implicit: ax + by +c =0 Parametric:
x() = x0 + (1-)x1
y() = y0 + (1-)y1
16
Rays and Line Segments If >= 0, then P() is the ray leaving P0 in the
direction d
If we use two points to define v, then
P( ) = Q + (R-Q)=Q+v
=R + (1-)Q
For 0<=<=1 we get all the
points on the line segment
joining R and Q
17
Space Partitioning
u
vAB
C D
Ep=u+v
E: >=0, >=0, + =1F: >=0, >=0, + >1A: >=0, >=0, + <=1B: <0, >=0C: <0, <0D: >=0, <0
F
18
Convexity An object is convex iff for any two points i
n the object all points on the line segment between these points are also in the object
P
P
19
Affine Sums Consider the “sum”
P=1P1+2P2+…..+nPn
Can show by induction that this sum makes sense iff
1+2+…..n=1
in which case we have the affine sum of the points P1P2,…..Pn
If, in addition, i>=0, we have the convex hull of P
1P2,…..Pn
20
Convex Hull
Smallest convex object containing P1P2,…..Pn
Formed by “shrink wrapping” points
21
Dot and Cross: Products
||||
|||sin|
||||cos
||
),,(
),,(),,,(
2
vu
vu
vu
vu
uuu
vuvuvuvuvuvuvu
vuvuvuvu
vvvvuuuuLet
xyyxzxxzyzzy
zzyyxx
zyxzyx
22
Linear Independence A set of vectors v1, v2, …, vn is linearly inde
pendent if
v1+v2+..vn=0 iff 1=2=…=0
If a set of vectors is linearly independent, we cannot represent one in terms of the others
If a set of vectors is linearly dependent, as least one can be written in terms of the others
23
Dimension In a vector space, the maximum number of linearly i
ndependent vectors is fixed and is called the dimension of the space
In an n-dimensional space, any set of n linearly independent vectors form a basis for the space
Given a basis v1, v2,…., vn, any vector v can be written as
v=1v1+ 2v2 +….+nvn
where the {i} are unique
24
Planes and Normals Every plane has a vector n normal (perpendicular, orthogon
al) to it From point-two vector form P(,)=R+u+v, we know we
can use the cross product to find n = u v and the equivalent form
(P()-P) n=0 Assume P=(x0, y0, z0) and
n=(nx, ny, nz), then the plane equation=nxx+nyy+nzz=nx0+ny0+nz0
25
Three-Dimensional Primitives Hollow objects Objects can be specified by vertices Simple and flat polygons (triangles) Constructive Solid Geometry (CSG)
3D curves 3D surfaces Volumetric Objects
26
Constructive Solid Geometry
27
Representation Until now we have been able to work with
geometric entities without using any frame of reference, such a coordinate system
Need a frame of reference to relate points and objects to our physical world. For example, where is a point? Can’t answer
without a reference system World coordinates Camera coordinates
28
Coordinate Systems Consider a basis v1, v2,…., vn
A vector is written v=1v1+ 2v2 +….+nvn
The list of scalars {1, 2, …. n}is the representation of v with respect to the given basis
We can write the representation as a row or column array of scalars
a=[1 2 …. n]T=
n
2
1
.
29
Example v=2v1+3v2-4v3
a=[2 3 –4] Note that this representation is with respect
to a particular basis For example, in OpenGL we start by
representing vectors using the world basis but later the system needs a representation in terms of the camera or eye basis
30
Problem in Coordinate Systems Which is correct?
Both are because vectors have no fixed location
v
v
31
Frames – 1/2 Coordinate System is insufficient to present poin
ts If we work in an affine space we can add a singl
e point, the origin, to the basis vectors to form a frame
32
Frames – 2/2 Frame determined by (P0, v1, v2, v3)
Within this frame, every vector can be written as
v=1v1+ 2v2 +….+nvn
Every point can be written as
P = P0 + 1v1+ 2v2 +….+nvn
33
Representations and N-tuples
),,(
)1,0,0(
)0,1,0(
)0,0,1(
) (
321
3
2
1
321
332211
adenote
e
e
e
kjivor
eeev
T
T
T
34
Change of Coordinate Systems Consider two representations of a the same
vector with respect to two different bases. The representations are
v=1v1+ 2v2 +3v3 = [1 2 3] [v1 v2 v3]
T
=1u1+ 2u2 +3u3 = [1 2 3] [u1 u2 u3]
T
a=[1 2 3 ]
b=[1 2 3]where
35
Representing Second Basis in terms of the First
Each of the basis vectors, u1,u2, u3, are vectors that can be represented in terms of the first basis
u1 = 11v1+12v2+13v3
u2 = 21v1+22v2+23v3
u3 = 31v1+32v2+33v3
v
36
Matrix FormThe coefficients define a 3 x 3 matrix
and the basis can be related by
see text for numerical examples
33
M =
a=MTb b=(MT)-1a
37
Confusing Points and VectorsConsider the point and the vector
P = P0 + 1v1+ 2v2 +….+nvn
v=1v1+ 2v2 +….+nvn
They appear to have the similar representations
P=[1 2 3] v=[1 2 3]
which confuse the point with the vector
A vector has no positionv
pv
can place anywherefixed
38
A Single RepresentationIf we define 0•P = 0 and 1•P =P then we can write
v=1v1+ 2v2 +3v3 = [1 2 3 0 ] [v1 v2 v3 P0] T
P = P0 + 1v1+ 2v2 +3v3= [1 2 3 1 ] [v1 v2 v3 P0] T
Thus we obtain the four-dimensional homogeneous coordinate representation
v = [1 2 3 0 ] T
P = [1 2 3 1 ] T
39
Homogeneous CoordinatesThe general form of four dimensional homogeneous coordinates is
p=[x y x w] T
We return to a three dimensional point (for w0) by
xx/w
yy/w
zz/w
If w=0, the representation is that of a vector
Note that homogeneous coordinates replaces points in three dimensions by lines through the origin in four dimensions
40
Homogeneous Coordinates and Computer Graphics
Homogeneous coordinates are key to all computer graphics systems All standard transformations (rotation, translation, scaling)
can be implemented by matrix multiplications with 4 x 4 matrices
Hardware pipeline works with 4 dimensional representations
For orthographic viewing, we can maintain w=0 for vectors and w=1 for points
For perspective we need a perspective division
41
Change of Frames We can apply a similar process in
homogeneous coordinates to the representations of both points and vectors
Consider two frames
Any point or vector can be represented in each
P0 v1
v2
v3
Q0
u1u2
u3
42
Representing One Frame in Terms of the Other
Extending what we did with change of bases
u1 = 11v1+12v2+13v3
u2 = 21v1+22v2+23v3
u3 = 31v1+32v2+33v3
Q0 = 41v1+42v2+43v3 +44P0
using a 4 x 4 matrix:
M =
43
Working with RepresentationsWithin the two frames any point or vector has a rep
resentation of the same forma=[1 2 3 4 ] in the first frameb=[1 2 3 4 ] in the second frame
where 4 4 for points and 4 4 for vectors and
The matrix M is 4 x 4 and specifies an affine transformation in homogeneous coordinates
a=MTb
44
Frames and ADTs – 1/3point3 p, q;vector3 v, u;In C++, through overloading,q=p+v;u=p-q;are valid, butq=v;u=p+q;are not!
45
Frames and ADTs – 2/3typedef float point3[4];
typedef float point2[4]; /* making a 2D point a special 3D point */
How do we initialize a point?
p={1.0, 2.0, 3.0};
/* implementation dependent! */
46
Frames and ADTs – 3/3Solutions:
1. initialize a point through a function:p = new_point3(1.0, 2.0, 3.0);
2. All operations are done through functions:point3 p, q;vector3 v; /* frame f; */v = point_sub(p, q);/* v = point_sub(p, q, f); */
47
Frames in OpenGL When we work with representations, we work with
n-tuples or arrays of scalars Changes in frame are then defined by 4 x 4 matrices In OpenGL, the base frame that we start with is the
world frame Eventually we represent entities in the camera frame
by changing the world representation using the model-view matrix
Initially these frames are the same (M=I)
48
Positioning the World Frame – 1/2If objects are on both sides of z=0, we should move
the world frame
1000
d100
0010
0001
M =
49
Positioning the World Frame – 2/2
50
Modeling of a Colored Cube Modeling Converting to the camera frame Clipping Projecting Removing hidden surfaces Rasterizing
Demo
51
Objectives Introduce simple data structures for
building polygonal models Vertex lists Edge lists
OpenGL vertex arrays
52
Representing a Mesh Consider a mesh
There are 8 nodes and 12 edges 5 interior polygons 6 interior (shared) edges
Each vertex has a location vi = (xi yi zi)
v1 v2
v7
v6
v8
v5
v4
v3
e1
e8
e3
e2
e11
e6
e7
e10
e5
e4
e9
e12
53
Simple Representation List all polygons by their geometric locations Leads to OpenGL code such as
Inefficient and unstructured Consider moving a vertex to a new locations
glBegin(GL_POLYGON); glVertex3f(x1, x1, x1); glVertex3f(x6, x6, x6); glVertex3f(x7, x7, x7);glEnd();
54
Modeling of a Cubetypedef GLfloat point3[3];point3 vertices[8][3] = {-1.0,-1.0,-1.0},{1.0,-1.0,-1.0},{1.0,1.0,-1.0}, {-1.0,1.0,-1.0}, {-1.0,-1.0,1.0}, {1.0,-1.0,1.0}, {1.0,1.0,1.0}, {-1.0,1.0,1.0}};
glBegin(GL_POLYGON);glVertex3fv(vertices[0]);glVertex3fv(vertices[3]);glVertex3fv(vertices[2]);glVertex3fv(vertices[1]);
glEnd();
OpenGL: glVertex3f 4D form
55
Inward and Outward Facing Polygons
The order {v0, v3, v2, v1} and {v1, v0, v3, v2} are equivalent in that the same polygon will be rendered by OpenGL but the order {{v0, v1, v2, v3} is different
The first two describe outwardly
facing polygons Use the right-hand rule =
counter-clockwise encirclement
of outward-pointing normal OpenGL treats inward and
outward facing polygons differently
56
Geometry versus Topology Generally it is a good idea to look for data
structures that separate the geometry from the topology Geometry: locations of the vertices Topology: organization of the vertices and edges Example: a polygon is an ordered list of vertices with
an edge connecting successive pairs of vertices and the last to the first
Topology holds even if geometry changes
57
Vertex Lists Put the geometry in an array Use pointers from the vertices into this array Introduce a polygon list
Each location appears only once!
,z0
58
The Color Cube – 1/3Model a color cube for rotating cube programDefine global arrays for vertices and colors
typedef GLfloat point3[3];point3 vertices[8][3] = {{-1.0,-1.0,-1.0},{1.0,-1.0,-1.0},{1.0,1.0,-1.0}, {-1.0,1.0,-1.0}, {-1.0,-1.0,1.0},{1.0,-1.0,1.0}, {1.0,1.0,1.0}, {-1.0,1.0,1.0}};GLfloat colors[8][3] = {{0.0,0.0,0.0},{1.0,0.0,0.0},{1.0,1.0,0.0}, {0.0,1.0,0.0}, {0.0,0.0,1.0},{1.0,0.0,1.0}, {1.0,1.0,1.0}, {0.0,1.0,1.0}};
59
The Color Cube – 2/3void quad(int a, int b, int c , int d){ glBegin(GL_POLYGON); glColor3fv(colors[a]); glVertex3fv(vertices[a]); glColor3fv(colors[b]); glVertex3fv(vertices[b]); glColor3fv(colors[c]); glVertex3fv(vertices[c]); glColor3fv(colors[d]); glVertex3fv(vertices[d]); glEnd(); } Color each vertex accordingly
60
The Color Cube – 3/3void colorcube( ){ polygon(0,3,2,1); polygon(2,3,7,6); polygon(0,4,7,3); polygon(1,2,6,5); polygon(4,5,6,7); polygon(0,1,5,4);}
Note that vertices are ordered so that we obtain correct outward facing normals
0
5 6
2
4 7
1
3
61
Bilinear Interpolation
5445
3223
1001
)1()(
,)1()(
,)1()(
CCC
CCC
CCC
Assuming a linear variation, then we can make use of the same interpolation coefficients in coordinates for the interpolation of other attributes.
62
Scan-line Interpolation A polygon is filled only when it is displayed It is filled scan line by scan line Can be used for other associated attributes
with each vertex
63
Efficiency The weakness of our approach is that we are buil
ding the model in the application and must do many function calls to draw the cube
Drawing a cube by its faces in the most straight forward way requires 6 glBegin, 6 glEnd 6 glColor 24 glVertex More if we use texture and lighting
64
Vertex Arrays OpenGL provides a facility called vertex arrays that allow u
s to store array data in the implementation Six types of arrays supported
Vertices Colors Color indices Normals Texture coordinates Edge flags
We will need only colors and vertices
65
Initialization Using the same color and vertex data, first we enable
glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY); Identify location of arrays
glVertexPointer(3, GL_FLOAT, 0, vertices);
glColorPointer(3, GL_FLOAT, 0, colors);
3d arrays stored as floats data contiguous
data array
66
Mapping Indices to Faces Form an array of face indices
Each successive four indices describe a face of the cube
Draw through glDrawElements which replaces all glVertex and glColor calls in the display callback
GLubyte cubeIndices[24] = {0,3,2,1,2,3,7,6 0,4,7,3,1,2,6,5,4,5,6,7,0,1,5,4};
67
Drawing the Cube Method 1:
Method 2:
for(i=0; i<6; i++) glDrawElements(GL_POLYGON, 4, GL_UNSIGNED_BYTE, &cubeIndices[4*i]);
format of index data start of index data
what to draw number of indices
glDrawElements(GL_QUADS, 24, GL_UNSIGNED_BYTE, cubeIndices);
Draws cube with 1 function call!!
68
General Transformations A transformation maps points to other
points and/or vectors to other vectors
69
Linear Function (Transformation)
)()()(
, and ,,
QfPfQPf
RQPR n
100034333231
24232221
14131211
A
Transformation matrix for homogeneous coordinate system:
AdAPAPdPP 00 )( ,)(
70
Affine Transformations – 1/2 Line preserving Characteristic of many physically important
transformations Rigid body transformations: rotation, translation Scaling, shear
Importance in graphics is that we need only transform endpoints of line segments and let implementation draw line segment between the transformed endpoints
71
Affine Transformations – 2/2
Every linear transformation (if the corresponding matrix is nonsingular) is equivalent to a change in frames
However, an affine transformation has only 12 degrees of freedom because 4 of the elements in the matrix are fixed and are a subset of all possible 4 x 4 linear transformations
72
Translation Move (translate, displace) a point to a new
location
Displacement determined by a vector d Three degrees of freedom P’=P+d
P
P´
d
73
How Many Ways?Although we can move a point to a new location in
infinite ways, when we move many points there is usually only one way
object translation: every point displaced by same vector
74
Rotation (2D) – 1/2 Consider rotation about the origin by degrees
radius stays the same, angle increases by
x´ =x cos –y sin y´ = x sin + y cos
x = r cos y = r sin
x´ = r cos (rcoscosrsinsiny´ = r sin (rcossinrsincos
75
Rotation (2D) – 2/2 Using the matrix form:
There is a fixed point Could be extended to 3D Positive direction of rotation is counterclockwise 2D rotation is equivalent to 3D rotation about the
z-axis
y
x
y
x
cossin
sincos
76
(Non-)Rigid-Body Transformation Translation and rotation are rigid-body
transformation
Non-rigid-bodytransformations
77
ScalingExpand or contract along each axis (fixed point of origin)
x´=sxxy´=syxz´=szx
Uniform and non-uniform scaling
78
Reflectioncorresponds to negative scale factors
originalsx = -1 sy = 1
sx = -1 sy = -1 sx = 1 sy = -1
79
Transformation in Homogeneous Coordinates
With a frame, each affine transformation is represented by a 44 matrix of the form:
100034333231
24232221
14131211
M
80
TranslationUsing the homogeneous coordinate representation in some fra
me
p=[ x y z 1]T
p´=[x´ y´ z´ 1]T
d=[dx dy dz 0]T
Hence p´= p + d or
x´=x+dx
y´=y+dy
z´=z+dznote that this expression is in four dimensions and expressesthat point = vector + point
81
Translation MatrixWe can also express translation using a 4 x 4 matrix T in homogeneous coordinatesp´=Tp where
This form is better for implementation because all affine transformations can be expressed this way and multiple transformations can be concatenated together
1000
d100
d010
d001
),,(z
y
x
zyx dddTT
82
Rotation about the Z axis Rotation about z axis in three dimensions leaves all po
ints with the same z Equivalent to rotation in two dimensions in planes
of constant z
or in homogeneous coordinates
p’=Rz()p
x´=x cos –y sin y´= x sin + y cos z´=z
83
Rotation Matrix
1000
0100
00 cossin
00sin cos
)(zRR
84
Rotation about X and Y axes Same argument as for rotation about z axis
For rotation about x axis, x is unchanged For rotation about y axis, y is unchanged
1000
0 cossin 0
0sin - cos0
0001
(xRR
1000
0 cos0sin -
0010
0sin 0 cos
(yRR
85
Scaling Matrixx´=sxxy´=syxz´=szx
p´=Sp
1000
000
000
000
),,(z
y
x
zyx s
s
s
sssSS
86
Shear Helpful to add one more basic transformation Equivalent to pulling faces in opposite directions
87
Shear Matrix
Consider simple shear
along x axis
x’ = x + y cot y’ = yz’ = z
1000
0100
0010
00cot 1
(H
88
Inverses
Although we could compute inverse matrices by general formulas, we can use simple geometric observations Translation: T-1(dx, dy, dz) = T(-dx, -dy, -dz)
Rotation: R -1() = R(-) Holds for any rotation matrix Note that since cos(-) = cos() and sin(-)=-sin()
R -1() = R T()
Scaling: S-1(sx, sy, sz) = S(1/sx, 1/sy, 1/sz)
89
Concatenation We can form arbitrary affine transformation matrice
s by multiplying together rotation, translation, and scaling matrices
Because the same transformation is applied to many vertices, the cost of forming a matrix M=ABCD is not significant compared to the cost of computing Mp for many vertices p
The difficult part is how to form a desired transformation from the specifications in the application
90
Order of Transformations Note that matrix on the right is the first applie
d Mathematically, the following are equivalent
p´ = ABCp = A(B(Cp)) Note many references use column matrices to
present points. In terms of column matrices
p´T = pTCTBTAT
91
Rotation about a Fixed Point and about the Z axis
f
)()()( fzf pTRpTM
92
Sequence of Transformations
93
General Rotation about the Origin
A rotation by q about an arbitrary axis can be decomposed into the concatenation of rotations about the x, y, and z axes
R() = Rx() Ry() Rz()
are called the Euler angles
Note that rotations do not commute
We can use rotations in another order but
with different angles
x
z
yv
94
Decomposition of General Rotation
95
The Instance Transformation In modeling, we often start
with a simple object centered at the origin, oriented with the axis, and at a standard size
We apply an instance transformation to its vertices to
Scale
Orient
Locate Display lists
96
Rotation about an Arbitrary Axis – 1/3
1. Move the fixed point to the origin
2. Rotate through a sequence of rotations
97
Rotation about an Arbitrary Axis – 2/3
1coscoscos ,cos,cos,cos
1 ,||
222
222
zyxzzyyxx
zyx
z
y
x
u
uv
Normalize u:
Final rotation matrix:
)()()()()( xxyyzyyxx RRRRRR
98
Rotation about an Arbitrary Axis – 3/3
Rotate the line segment to the plane of y=0, and the line segment is foreshortened to:
1000
0//0
0//0
0001
)(
so ,22
dd
ddR
d
zy
yzxx
zy
Rotate clockwise about the y-axis, so:
1000
00
0010
00
)(d
d
Rx
x
yy
)()()()()()()( 00 PTRRRRRPTR xxyyzyyxx Final transformation matrix:
99
OpenGL Matrices In OpenGL matrices are part of the state Three types
Model-View (GL_MODEL_VIEW) Projection (GL_PROJECTION) Texture (GL_TEXTURE) (ignore for now)
Single set of functions for manipulation Select which to manipulated by
glMatrixMode(GL_MODEL_VIEW); glMatrixMode(GL_PROJECTION);
100
Current Transformation Matrix (CTM) Conceptually there is a 4 x 4 homogeneous
coordinate matrix, the current transformation matrix (CTM) that is part of the state and is applied to all vertices that pass down the pipeline
The CTM is defined in the user program and loaded into a transformation unit
CTMvertices vertices
p p´=CpC
101
CTM Operations The CTM can be altered either by loading a new
CTM or by postmutiplicationLoad an identity matrix: C ILoad an arbitrary matrix: C M
Load a translation matrix: C TLoad a rotation matrix: C RLoad a scaling matrix: C S
Postmultiply by an arbitrary matrix: C CMPostmultiply by a translation matrix: C CTPostmultiply by a rotation matrix: C C RPostmultiply by a scaling matrix: C C S
102
Rotation about a Fixed PointStart with identity matrix: C IMove fixed point to origin: C CT -1
Rotate: C CRMove fixed point back: C CT
Result: C = T -1RT
Each operation corresponds to one function call in the program.
Note that the last operation specified is the first executed in the program
103
CTM in OpenGL OpenGL has a model-view and a
projection matrix in the pipeline which are concatenated together to form the CTM
Can manipulate each by first setting the matrix mode
104
Rotation, Translation, Scaling
glRotatef(theta, vx, vy, vz);
glTranslatef(dx, dy, dz);
glScalef( sx, sy, sz);
glLoadIdentity();
Load an identity matrix:
Multiply on right:
theta in degrees, (vx, vy, vz) define axis of rotation
Each has a float (f) and double (d) format (glScaled)
105
Example Rotation about z axis by 30 degrees with a fixed
point of (1.0, 2.0, 3.0)
Remember that last matrix specified in the program is the first applied
glMatrixMode(GL_MODELVIEW);glLoadIdentity();glTranslatef(1.0, 2.0, 3.0);glRotatef(30.0, 0.0, 0.0, .10);glTranslatef(-1.0, -2.0, -3.0);
106
Using Transformations Example: use idle function to rotate a cube and
mouse function to change direction of rotation Start with a program that draws a cube (cube.c)
in a standard way Centered at origin Sides aligned with axes Discussed modeling previously
107
main.cvoid main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLU
T_RGB | GLUT_DEPTH); glutInitWindowSize(500, 500); glutCreateWindow("cube"); glutReshapeFunc(myReshape); glutDisplayFunc(display); glutIdleFunc(spinCube); glutMouseFunc(mouse); glEnable(GL_DEPTH_TEST); glutMainLoop();}
108
Idle and Mouse Callbacksvoid spinCube() {
theta[axis] += 2.0;if( theta[axis] > 360.0 ) theta[axis] -= 360.0;glutPostRedisplay();
}void mouse(int btn, int state, int x, int y){ if(btn==GLUT_LEFT_BUTTON && state == GLUT_DOWN) axis = 0; if(btn==GLUT_MIDDLE_BUTTON && state == GLUT_DOWN) axis = 1; if(btn==GLUT_RIGHT_BUTTON && state == GLUT_DOWN) axis = 2;}
109
Display Callbackvoid display(){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER
_BIT); glLoadIdentity(); glRotatef(theta[0], 1.0, 0.0, 0.0); glRotatef(theta[1], 0.0, 1.0, 0.0); glRotatef(theta[2], 0.0, 0.0, 1.0); colorcube(); glutSwapBuffers();}Note that because of fixed from of callbacks, variables such as theta and axis must be defined as globals
Camera information is in standard reshape callback
110
Arbitrary Matrices Can load and multiply by matrices defined in the a
pplication program
The matrix m is a one dimension array of 16 elements which are the components of the desired 4 x 4 matrix stored by columns
In glMultMatrixf, m multiplies the existing matrix on the right
glLoadMatrixf(m)glMultMatrixf(m)
111
Matrix Stacks In many situations we want to save transformatio
n matrices for use later Traversing hierarchical data structures (Chapter 9) Avoiding state changes when executing display lists
OpenGL maintains stacks for each type of matrix Access present type (as set by glMatrixMode) b
yglPushMatrix();glPopMatrix();
112
Reading Back Matrices Can also access matrices (and other parts of the
state) by enquiry (query) functions
For matrices, we use as
glGetIntegervglGetFloatvglGetBooleanvglGetDoublevglIsEnabled
double m[16];glGetFloatv(GL_MODELVIEW, m);
113
Using the Model-View Matrix In OpenGL the model-view matrix is used to
Position the camera Can be done by rotations and translations but is often easier to use gluLookAt (Chapter 5)
Build models of obejcts The projection matrix is used to define the view volume and to select a c
amera lens Although both are manipulated by the same functions, we have to be care
ful because incremental changes are always made by postmultiplication For example, rotating model-view and projection matrices by the same mat
rix are not equivalent operations. Postmultiplication of the model-view matrix is equivalent to premultiplication of the projection matrix
114
Interfaces to 3D Applications One of the major problems in interactive computer grap
hics is how to use two-dimensional devices such as a mouse to interface with three dimensional objects
Example: how to form an instance matrix? Some alternatives
Virtual trackball 3D input devices such as the spaceball Use areas of the screen
Distance from center controls angle, position, scale depending on mouse button depressed
115
Using Areas of the Screen Each button controls rotation, scaling and
translation, separately Example:
Left button: closer to the center, no rotation, moving up or down, rotate about x-axis, moving left or right, rotate about y-axis, moving to the corner, rotate about x-y-axes
Right button: translation Middle button: scaling (zoom-in or zoom-out)
116
Physical Trackball The trackball is an “upside down” mouse
If there is little friction between the ball and the rollers, we can give the ball a push and it will keep rolling yielding continuous changes
Two possible modes of operation Continuous pushing or tracking hand motion Spinning
117
A Trackball from a Mouse Problem: we want to get the two behavior
modes from a mouse We would also like the mouse to emulate a
frictionless (ideal) trackball Solve in two steps
Map trackball position to mouse position Use GLUT to obtain the proper modes
118
Trackball Frame
origin at center of ball
119
Projection of Trackball Position We can relate position on trackball to positi
on on a normalized mouse pad by projecting orthogonally onto pad
120
Reversing Projection Because both the pad and the upper
hemisphere of the ball are two-dimensional surfaces, we can reverse the projection
A point (x,z) on the mouse pad corresponds to the point (x,y,z) on the upper hemisphere where
y =222 zxr if r |x| 0, r |z| 0
121
Computing Rotatoins Suppose that we have two points that were
obtained from the mouse. We can project them up to the hemisphere to
points p1 and p2
These points determine a great circle on the sphere We can rotate from p1 to p
by finding the proper axis of rotation and the angle between the points
122
Using the Cross Product The axis of rotation is given by the normal
to the plane determined by the origin, p1 , and p2
n = p1 p1
123
Obtaining the Angle The angle between p1 and p2 is given by
If we move the mouse slowly or sample its position frequently, then will be small and we can use the approximation
| sin | = ||||
||
21 pp
n
sin
124
Implementing with GLUT We will use the idle, motion, and mouse callbac
ks to implement the virtual trackball Define actions in terms of three booleans trackingMouse: if true update trackball positi
on redrawContinue: if true, idle function posts a
redisplay trackballMove: if true, update rotation matrix
125
Example In this example, we use the virtual trackball
to rotate the color cube we modeled earlier The code for the colorcube function is omit
ted because it is unchanged from the earlier examples
126
Initialization#define bool int /* if system does not support bool type */#define false 0#define true 1#define M_PI 3.14159 /* if not in math.h */
int winWidth, winHeight;
float angle = 0.0, axis[3], trans[3];
bool trackingMouse = false;bool redrawContinue = false;bool trackballMove = false;
float lastPos[3] = {0.0, 0.0, 0.0};int curx, cury;int startX, startY;
127
The Projection Stepvoidtrackball_ptov(int x, int y, int width, int height, float v[3]){ float d, a; /* project x,y onto a hemisphere centered within width, height , note
z is up here*/ v[0] = (2.0F*x - width) / width; v[1] = (height - 2.0F*y) / height; d = sqrt(v[0]*v[0] + v[1]*v[1]); v[2]=sqrt(1.0F-d*d); /* v[2] = cos((M_PI/2.0) * ((d < 1.0) ? d : 1.0)); a = 1.0 / sqrt(v[0]*v[0] + v[1]*v[1] + v[2]*v[2]); v[0] *= a; v[1] *= a; v[2] *= a; */}
128
glutMotionFunc – 1/2void mouseMotion(int x, int y){ float curPos[3], dx, dy, dz; /* compute position on hemisphere */ trackball_ptov(x, y, winWidth, winHeight, curP
os); if(trackingMouse) { /* compute the change in position on the hemisphere */ dx = curPos[0] - lastPos[0]; dy = curPos[1] - lastPos[1]; dz = curPos[2] - lastPos[2];
129
glutMotionFunc – 2/2if (dx || dy || dz) { /* compute theta and cross product */ angle = 90.0 * sqrt(dx*dx + dy*dy + dz*dz); axis[0] = lastPos[1]*curPos[2] – lastPos[2]*curPos[1]; axis[1] = lastPos[2]*curPos[0] – lastPos[0]*curPos[2]; axis[2] = lastPos[0]*curPos[1] – lastPos[1]*curPos[0]; /* update position */ lastPos[0] = curPos[0]; lastPos[1] = curPos[1]; lastPos[2] = curPos[2]; } } glutPostRedisplay();}
130
Idle and Display Callbacksvoid spinCube(){ if (redrawContinue) glutPostRedisplay();}
void display(){ glClear(GL_COLOR_BUFFER_BIT|
GL_DEPTH_BUFFER_BIT); if (trackballMove) {
glRotatef(angle, axis[0], axis[1], axis[2]); }
colorcube(); glutSwapBuffers();}
131
Mouse Callbackvoid mouseButton(int button, int state, int x, int y){
if(button==GLUT_RIGHT_BUTTON) exit(0);
/* holding down left button allows user to rotate cube */
if(button==GLUT_LEFT_BUTTON) switch(state) { case GLUT_DOWN:
y=winHeight-y; startMotion( x,y); break;
case GLUT_UP: stopMotion( x,y); break;
} }
132
Start Functionvoid startMotion(int x, int y){ trackingMouse = true; redrawContinue = false; startX = x; startY = y; curx = x; cury = y; trackball_ptov(x, y, winWidth, winHeight,
lastPos); trackballMove=true;}
133
Stop Functionvoid stopMotion(int x, int y){ trackingMouse = false; /* check if position has changed */ if (startX != x || startY != y)
redrawContinue = true; else {
angle = 0.0; redrawContinue = false; trackballMove = false;
}}
134
Smooth Rotation – 1/2 From a practical standpoint, we are often want to use tran
sformations to move and reorient an object smoothly Problem: find a sequence of model-view matrices M0,M1,…..,
Mn so that when they are applied successively to one or more objects we see a smooth transition, cannot always decompose a rotation into three rotations about the x, y, and z axes
For orientating an object, we can use the fact that every rotation corresponds to part of a great circle on a sphere Find the axis of rotation and angle Virtual trackball
135
Smooth Rotation – 2/2 Observe that for arbitrary rotation matrix R,
there must exist a direction d such that all the points on Rp=p, and Rd=d, therefore the vector d and the column matrix p are eigen vectors of the matrix R corresponding to the eigen value 1!
136
Incremental Rotation – 1/4 Consider the two approaches
For a sequence of rotation matrices R0,R1,…..,R
n , find the Euler angles for each and use Ri= Riz
Riy Rix
Not very efficient
Use the final positions to determine the axis and angle of rotation, then increment only the angle
Quaternions can be more efficient than either
137
Incremental Rotation – 2/4for(i=0; i< imax; i++)
{
glRotatef(delta_theta, dx, dy, dz);
draw_objects();
}
Problem: calculation of sin and cos of angles
138
Incremental Rotation – 3/4A better solution is to reuse the matrix:
GLfloat m[16];
glRotatef(delta_theta, dx, dy, dz);
glGetFloatv(GL_MODELVIEW,m);
for(i=0; i< imax; i++)
{
glMultMatrixf(m);
draw_objects();
}
139
Incremental Rotation – 4/4Further improvement by approximations:
1cos ,sin So, if we form an arbitrary rotation matrix through the Euler angles:
1000
01
01
01
1000
0cossin0
0sincos0
0001
1000
0cos0sin
0010
0sin0cos
1000
0100
00cossin
00sincos
)()()(
xyz RRRR
140
Complex Numbers
Euler’s identity
sincos iei For an arbitrary complex number c:
abbar
reibac i
/tan and ,
where,
122
If we rotate c about the origin by to c´:
)( irec
141
Quaternions Extension of imaginary numbers from two to three dimen
sions Requires one real and three imaginary components i, j, k
Quaternions can express rotations on sphere smoothly and efficiently. Process: Model-view matrix quaternion Carry out operations with quaternions Quaternion Model-view matrix
q=q0+q1i+q2j+q3k
142
Quaternions Properties
),(||
1
therefore),0,1( is quaternionfor identity tiveMultiplica
as || norm Define
)(
),(
:define then),,(If
),(),,,(Let
021
20
23
22
21
20
2
0000
00
0
3210
03210
q
pqqppq
pq
p
ijkkjikjiq
q222
qa
a
qqqqq
a
p,qpqab
,pqba
p b
qqqq
qqqqqa
-1 where,
143
Quaternions and Rotation
)(sin))((cos)(
))((2
sin)(2
cos2
sin2)(2
sin2
cos
where),,0(
form thehas quaternion this then,
: with quaternion the
ofproduct quaternion heConsider t
)2
sin,2
(cos
thereforeand ),1||( quartenionunit a is so
length,unit a has where),2
sin,2
(cos
quaternion heConsider t
),,(
wherespace, inpoint a represent to),0( Use
222
1
1
pvvpvpvpv
vpvpvvpvpp
p
v
vv
p
p
rprp
rp
r
rr
r
zyx
p
144
Example of using Quaternion Rotation
)cossin,sincos(
where),,0(),0(
quaternion theyields
),,(point arbitrary an of rotation The
)1,0,0(2
sin2
cos
let axis, z about the rotation get the To
11
yxyx
rprrprp
zyx
r
p
p
p
145
Quaternions and Rotation Matrix
1000
0)1(cossin)cos1(sin)cos1(
0sin)cos1()1(cossin)cos1(
0sin)cos1(sin)cos1()1(cos
:get could weresult, rotation quaternion the with
compare and ),2
sin,2
(cos Let .quaternionby done be could
)()()()()(
only )()()()()()()(For
22
22
22
00
zzxzyyxz
xzyyyzyx
yxzzyxxx
xxyyzyyxx
xxyyzyyxx
vvvvvvvv
vvvvvvvv
vvvvvvvv
R
z
y
x
R
r
RRRRRR
pTRRRRRpTM
v
146
The Rotation Matrix in the Textbook
1
and ,2
sin2
cos2sin
,2
sin212
sin2
coscos
:identities tric trigonomefollowing theuse youif
slide, previous thein as same thesIt'
222
222
zyx vvv
147
Quaternions Because the rotations are on the surface of
a sphere, quaternions provide an interesting and more efficient way to implement the trackball
See code in some of the standard demos included with Mesa