Frames & Geometry Angel 4.4-4.5 Angel: Interactive Computer Graphics5E © Addison-Wesley 2009 1 Objectives • Discuss frames • Introduce simple data structures for building polygonal models – Vertex lists – Edge lists • OpenGL vertex arrays Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009 2 Homogeneous Coordinates • The homogeneous coordinates form for a three dimensional point [x y z] is given as • p =[x’ y’ z’ w] T =[wx wy wz 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 • For w=1, the representation of a point is [x y z 1] Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009 3 Homogeneous Coordinates and Computer Graphics • Homogeneous coordinates are key to all computer graphics systems – All standard transformations (rotation, translation, scaling) can be implemented with matrix multiplications using 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 Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009 4 Change of Coordinate Systems • Consider two representations of a the same vector with respect to two different bases. The representations are a=[a1 a2 a3 ] b=[b1 b2 b3] where v=a1v1+ a2v2 +a3v3 = [a1 a2 a3] [v1 v2 v3] T =b u + b u +b u = [b b b ] [u u u ] T 1 1 2 2 3 3 1 2 3 1 2 3 Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009 5 Representing second basis in terms of first • Each of the basis vectors, u1,u2, u3, are vectors that can be represented in terms of the first basis u1 = g11v1+g12v2+g13v3 u2 = g21v1+g22v2+g23v3 u3 = g31v1+g32v2+g33v3 v Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009 6 Matrix Form • The coefficients define a 3 x 3 matrix g g g g M = g g g g g 33 • and the bases can be related by a=MTb • see text for numerical examples Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009 7 Change of Frames • We can apply a similar process in homogeneous coordinates to the representations of both points and vectors u1 v2 Consider two frames: Q0 (P0, v1, v2, v3) (Q0, u1, u2, u3) P0 v 1 v3 Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009 u2 u3 8 Representing One Frame in Terms of the Other Extending what we did with change of bases u1 = g11v1 + g12v2 + g13v3 u2 = g21v1 + g22v2 + g23v3 u3 = g31v1 + g32v2 + g33v3 Q0 = g41v1 + g42v2 + g43v3 + g44P0 defining a 4 x 4 matrix g g g g M= g g g g g g g g Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009 9 Working with Representations • Within the two frames any point or vector has a representation of the same form a=[a1 a2 a3 a4 ] in the first frame b=[b1 b2 b3 b4 ] in the second frame • where a4 = b4 = 1 for points and a4 = b4 = 0 for vectors and a=MTb • The matrix M is 4 x 4 and specifies an affine transformation in homogeneous coordinates Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009 10 Affine Transformations • Every linear transformation is equivalent to a change in frames • Every affine transformation preserves lines • 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 Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009 11 The World and Camera Frames • 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) Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009 12 Moving the Camera • If objects are on both sides of z=0, we must move camera frame M= 1 0 0 0 0 0 0 1 0 0 0 1 d 0 0 1 Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009 13 GEOMETRIC MODELING Angel: Interactive Computer Graphics5E © Addison-Wesley 2009 14 Representing a Mesh • Consider a mesh e2 v6 e1 v1 e6 v5 e3 e8 v e9 v4 8 e11 e10 e4 e7 v7 v2 e12 e5 v3 • There are 8 nodes and 12 edges – 5 interior polygons – 6 interior (shared) edges • Each vertex has a location vi = (xi yi zi) Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009 15 Simple Representation • Define each polygon by the geometric locations of its vertices • Leads to OpenGL code such as glBegin(GL_POLYGON); glVertex3f(x1, y1, z1); glVertex3f(x6, y6, z6); glVertex3f(x7, y7, z7); glEnd(); • Inefficient and unstructured – Consider moving a vertex to a new location – Must search for all occurrences Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009 16 Inward and Outward Facing Polygons • The order {v1, v6, v7} and {v6, v7, v1} are equivalent in that the same polygon will be rendered by OpenGL but the order {v1, v7, v6} is different • The first two describe outwardly facing polygons • Use the right-hand rule = counter-clockwise encirclement of outward-pointing normal • OpenGL can treat inward and outward facing polygons differently Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009 17 Geometry vs 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 Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009 18 Vertex Lists • Put the geometry in an array • Use pointers from the vertices into this array • Introduce a polygon list P1 P2 P3 P4 P5 topology v1 v7 v6 v8 v5 v6 x 1 y 1 z1 x 2 y 2 z2 x 3 y 3 z3 x 4 y 4 z4 x5 y5 z5. x 6 y 6 z6 x 7 y 7 z7 geometry x8 y8 z8 Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009 19 Shared Edges • Vertex lists will draw filled polygons correctly but if we draw the polygon by its edges, shared edges are drawn twice • Can store mesh by edge list Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009 20 Edge List e2 e1 e2 e3 e4 e5 e6 e7 e8 e9 v1 v6 x 1 y 1 z1 x 2 y 2 z2 x 3 y 3 z3 x 4 y 4 z4 x5 y5 z5. x 6 y 6 z6 x 7 y 7 z7 x 8 y 8 z8 v6 e1 v1 e6 v5 e3 e8 v e9 8 e11 e10 e4 e7 v7 v2 e12 e5 v3 Note polygons are not represented Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009 21 Modeling a Cube Model a color cube for rotating cube program Define global arrays for vertices and colors GLfloat vertices[][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[][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}}; Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009 22 Drawing a polygon from a list of indices • Draw a quadrilateral from a list of indices into the array vertices and use color corresponding to first index void polygon(int a, int b, int c , int d) { glBegin(GL_POLYGON); glColor3fv(colors[a]); glVertex3fv(vertices[a]); glVertex3fv(vertices[b]); glVertex3fv(vertices[c]); glVertex3fv(vertices[d]); glEnd(); } Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009 23 Draw cube from faces void 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); } 5 6 2 1 7 4 0 3 Note that vertices are ordered so that we obtain correct outward facing normals Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009 24 Efficiency • The weakness of our approach is that we are building 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 Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009 25 Vertex Arrays • OpenGL provides a facility called vertex arrays that allows us 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 Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009 26 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); 3d arrays stored as floats data array data contiguous glColorPointer(3, GL_FLOAT, 0, colors); Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009 27 Mapping indices to faces • Form an array of face indices 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}; • Each successive four indices describe a face of the cube • Draw through glDrawElements which replaces all glVertex and glColor calls in the display callback Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009 28 Drawing the cube • Method 1: what to draw number of indices for(i=0; i<6; i++) glDrawElements(GL_POLYGON, 4, GL_UNSIGNED_BYTE, &cubeIndices[4*i]); format of index data start of index data • Method 2: glDrawElements(GL_QUADS, 24, GL_UNSIGNED_BYTE, cubeIndices); Draws cube with 1 function call!! Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009 29