CS 445 / 645 Introduction to Computer Graphics Lecture 5 Assignment 1

advertisement
CS 445 / 645
Introduction to Computer Graphics
Lecture 5
Assignment 1
3D Primitives and Transformations
Assignment 1
We’ve hit a snag with assignment 1
• Due date extended one week – Sept. 26th
• I’m creating an intermediate programming assignment
Visual Studio 7 isn’t ready for dept. release yet
• We’re revamping for Visual Studio 6
• You can set things up for yourself, but we are trying to
simplify the process for you
Assignment 1 – more details
Assignment 1 uses FLTK, GLUT, Boost
• The source for each tool is accessible online
– You can download the source and compile the needed
libraries yourself (contact TA for Boost details)
• To simplify and standardize
– We are compiling the source into libraries for you and
putting them in a shared location (that’s the snag)
• You can start on this right now, but you may have to tweak
your project files to work with our released libraries
Intermediate Assignment
Assignment 0 – not graded but checked
• Set up your class account on blue.unix.virginia.edu
– Instructions to follow
• Experiment with FLTK
– http://www.cs.wisc.edu/~schenney/courses/cs559s2002/assignments/assignment1/
• Experiment with OpenGL
– http://www.cs.virginia.edu/~gfx/Courses/2001/Intro.fall.01/
Exercises/assignment2.htm
Assignment 0
Due Tuesday, Sept 17th at 5:00 p.m.
• Email me ASAP if your blue.unix account doesn’t exist
• Turn in:
– Create directory on blue:
/courses/cs/Students/username/Assignment0
– Complete the FLTK tutorial and leave an executable in your directory
called assign0.exe that accomplishes what’s described in “Adding
Basic Components to a Window” in the Wisconsin tutorial
• Optional – play with last year’s firetruck demo
Assignment 0
Setting up your directory on blue.unix.virginia.edu
• Log on to blue
• ‘cd /courses/cs/445_brogan/Students’
• ‘mkdir username’ where username is your UVA username
• ‘mkdir username/Assignment0’
Next week I’ll lock things down and protect file
read permissions
Assignment 0
Location of VC7 libraries/includes
• blue.unix:/courses/cs/445_brogan/Sources/VC7
Future location of VC6 libraries/includes
• blue.unix:/courses/cs/445_brogan/Sources/VC6
I’ll send an email to reiterate/clarify
• If you’re auditing class, make sure I have your email
Goals of these assignments
• Get the programming environment up and running
• Get practice with matrix composition
• Get practice with line/surface equations
• Get practice building GUIs quickly
Question from last class
Why does OpenGL post-multiply?
• No particular reason
– Are you transforming the point (bottom up)
– Are you transforming the coordinate system (top down)
• OpenGL authors prefer the latter
• If you don’t like it….
– Transpose the matrices and premultiply them
OpenGL: Front/Back Rendering
Each polygon has two sides, front and back
OpenGL can render the two differently
The ordering of vertices in the list determines
which is the front side:
• When looking at the front side, the vertices go
counterclockwise
– This is basically the right-hand rule
– Note that this still holds after perspective projection
OpenGL: Specifying Geometry
Geometry in OpenGL consists of a list of vertices in
between calls to glBegin() and glEnd()
• A simple example: telling GL to render a triangle
glBegin(GL_POLYGON);
glVertex3f(x1, y1, z1);
glVertex3f(x2, y2, z2);
glVertex3f(x3, y3, z3);
glEnd();
• Usage: glBegin(geomtype) where geomtype is:
– Points, lines, polygons, triangles, quadrilaterals, etc...
OpenGL: Drawing Triangles
You can draw multiple triangles between
glBegin(GL_TRIANGLES) and glEnd():
float v1[3], v2[3], v3[3], v4[3];
...
glBegin(GL_TRIANGLES);
glVertex3fv(v1); glVertex3fv(v2); glVertex3fv(v3);
glVertex3fv(v1); glVertex3fv(v3); glVertex3fv(v4);
glEnd();
Each set of 3 vertices forms a triangle
• How much redundant computation is happening?
OpenGL: Triangle Strips
An OpenGL triangle strip primitive reduces this redundancy by sharing vertices:
glBegin(GL_TRIANGLE_STRIP);
glVertex3fv(v0);
glVertex3fv(v1);
glVertex3fv(v2);
glVertex3fv(v3);
glVertex3fv(v4);
v2
v0
v4
glVertex3fv(v5);
v5
glEnd();
•
triangle 0 is v0, v1, v2
•
triangle 1 is v2, v1, v3 (why not v1, v2, v3?)
•
triangle 2 is v2, v3, v4
•
triangle 3 is v4, v3, v5 (again, why not v3, v4, v5)
v1
v3
OpenGL: More Examples
Example: GL supports quadrilaterals:
glBegin(GL_QUADS);
glVertex3f(-1, 1, 0);
glVertex3f(-1, -1, 0);
glVertex3f(1, -1, 0);
glVertex3f(1, 1, 0);
glEnd();
• This type of operation is called immediate-mode rendering;
each command happens immediately
Primitive Types
GL_POINTS
GL_LINE
• {S | _STRIP | _LOOP}
GL_TRIANGLE
• {S | _STRIP | _FAN}
GL_QUAD
• {S | _STRIP}
GL_POLYGON
GL_POLYGON
List of vertices defines polygon edges
Polygon must be convex
Non-planar Polygons
Imagine polygon with non-planar vertices
Some perspectives will be rendered as concave
polygons
These concave polygons may not rasterize
correctly
Single Buffering
• ‘Buffer’ corresponds to frame buffer
• ‘Single’ corresponds to there being just one
• Place where you write pixel color values is same place
graphics hardware goes to read color values for display
• Can draw on top of existing image
– Might be faster than redrawing whole image
• Can also lead to flickering and half-drawn images
Double Buffering
• OpenGL writes raster image to separate buffer from that read for
display
• ‘front’ buffer is for video signal
• ‘back’ buffer is the drawing target
• After each frame is drawn, the front and back buffers swap
– glxSwapBuffers (Display *dpy, Window, w)
– glutSwapBuffers (void)
• Avoids displaying partially rendered frame buffer
• Avoids flickering
Setting up the OpenGL Window
Must clear the ‘canvas’ before drawing
• glClearColor (r, g, b, a)
– Specify the color to initialize canvas to
– Typically set a to 0.0 to make fully transparent
– This is a state variable and can only be called once
• glClear(GL_COLOR_BUFFER_BIT)
– Actually clear the screen
– glClear could also clear the GL_DEPTH_BUFFER_BIT
– We’re not worried about that now
3-D Transformations
We studied the details of 2-D transformations
I introduced the expanded 3-D transformations
We’ve got some more details…
Scaling and Translation in 3-D
Pretty much just like 2-D
• Just add on the z dimension to
everything
r
0

0

0
0 0 0
s 0 0
0 t 0

0 0 1
Scaling
1
0

0

0
0 0 x 
1 0 y 
0 1 z 

0 0 1
Translation
Rotation in 3-D
Looks similar to 2-D Case
• Specify arbitrray rotation as
three angles
– One per coordinate axis
– Called an Euler Angle
– Common representation
– But order of rotations matters
0
1
0 cos 
Rotation x  
0 sin 

0
0
 cos 
 0
Rotation y  
 sin 

 0
cos 
 sin 
Rotation z  
 0

 0
0
 sin 
cos 
0
0 sin 
1
0
0 cos 
0
 sin 
cos 
0
0
0
0
0
0

1
0
0
0

1
0 0
0 0
1 0

0 1
3-D Rotation
General rotations in 3-D require rotating about an
arbitrary axis of rotation
Deriving the rotation matrix for such a rotation
directly is a good exercise in linear algebra
Standard approach: express general rotation as
composition of canonical rotations
• Rotations about X, Y, Z
Composing Canonical Rotations
Goal: rotate about arbitrary vector A by a
• Idea: we know how to rotate about X,Y,Z
– So, rotate about Y by  until A lies in the YZ plane
– Then rotate about X by  until A coincides with +Z
– Then rotate about Z by a
– Then reverse the rotation about X (by -)
– Then reverse the rotation about Y (by -)
Composing Canonical Rotations
First: rotating about Y by  until A lies in YZ
How exactly do we calculate ?
• Project A onto XZ plane (Throw away y-coordinate)
• Find angle  to X:
 = -(90° - ) =  - 90 °
Second: rotating about X by  until A lies on Z
How do we calculate ?
Composing Canonical Rotations
Why are we slogging through all this tedium?
A1: Because you’ll have to do it on the test
A2: Because it will help with the assignment
• Computing intersection between a parabola and ground
plane
y+
dist = ?
3-D Rotation Matrices
So an arbitrary rotation about A composes several
canonical rotations together
We can express each rotation as a matrix
Composing transforms == multiplying matrices
Thus we can express the final rotation as the product of
canonical rotation matrices
Thus we can express the final rotation with a single
matrix!
Composing Matrices
So we have the following matrices:
p: The point to be rotated about A by a
Ry : Rotate about Y by 
Rx  : Rotate about X by 
Rza : Rotate about Z by a
Rx  -1: Undo rotation about X by 
Ry-1 : Undo rotation about Y by 
In what order should we multiply them?
Compositing Matrices
Short answer: the transformations, in order, are
written from right to left
• In other words, the first matrix to affect the vector goes next
to the vector, the second next to the first, etc.
So in our case:
p’ = Ry-1 Rx  -1 Rza Rx  Ry p
Rotation Matrices
Notice these two matrices:
Rx  : Rotate about X by 
Rx  -1: Undo rotation about X by 
How can we calculate Rx  -1?
Rotation Matrices
Notice these two matrices:
Rx  : Rotate about X by 
Rx  -1: Undo rotation about X by 
How can we calculate Rx  -1?
• Obvious answer: calculate Rx (-)
• Clever answer: exploit fact that rotation matrices are
orthonormal
Rotation Matrices
Notice these two matrices:
Rx  : Rotate about X by 
Rx  -1: Undo rotation about X by 
How can we calculate Rx  -1?
• Obvious answer: calculate Rx (-)
• Clever answer: exploit fact that rotation matrices are orthonormal
What is an orthonormal matrix?
What property are we talking about?
Rotation Matrices
Orthonormal matrix:
• orthogonal (columns/rows linearly independent)
• normalized (columns/rows length of 1)
The inverse of an orthogonal matrix is just its
transpose:
a
d

 h
b
e
i
c

f
j 
1
a

 d
 h
b
e
i
T
c
a


f   b
 c
j 
d
e
f
h

i
j 
Rotation Matrix
9 DOFs must reduce to 3
Rows must be unit length (-3 DOFs)
Rows must be orthogonal (-3 DOFs)
Drifting matrices is very bad
• Numerical errors results when trying to gradually rotate matrix
by adding derivatives
• Resulting matrix may scale / shear
• Gram-Schmidt algorithm will re-orthogonalize your matrix
Difficult to interpolate between matrices
Euler Angles
(x, y, z) = RzRyRx
• Rotate x degrees about x-axis
• Rotate y degrees about y-axis
• Rotate z degrees about z-axis
Axis order is not defined
• (y, z, x), (x, z, y), (z, y, x)…
are all legal
• Pick one
Euler Angles
Rotations not uniquely defined
• ex: (z, x, y) = (90, 45, 45) = (45, 0, -45)
takes positive x-axis to (1, 1, 1)
• cartesian coordinates are independent of one another, but
Euler angles are not
Gimbal Lock
• Term derived from mechanical problem that arises in
gimbal mechanism that supports a compass or a gyro
Gimbal Lock
Gimbal Lock
Occurs when two axes are
aligned
Second and third rotations
have effect of transforming
earlier rotations
• ex: Rot x, Rot y, Rot z
– If Rot y = 90 degrees, Rot z == Rot x
Download