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