Computer Graphics I, Fall 2010 Building Models
Computer Graphics I, Fall 2010 Objectives Introduce simple data structures for building polygonal models Vertex lists Edge lists OpenGL vertex arrays
Computer Graphics I, Fall 2010 Representing a Mesh Consider a mesh 8 nodes and 12 edges 5 interior polygons 6 interior (shared) edges Each vertex has location v i = (x i y i z i ) v1v1 v2v2 v7v7 v6v6 v8v8 v5v5 v4v4 v3v3 e1e1 e8e8 e3e3 e2e2 e 11 e6e6 e7e7 e 10 e5e5 e4e4 e9e9 e 12
Computer Graphics I, Fall 2010 Simple Representation Define each polygon by geometric locations of vertices Leads to OpenGL code such as Inefficient and unstructured Consider moving vertex to new location Must search for all occurrences glBegin(GL_POLYGON); glVertex3f(x1, y1, z1); glVertex3f(x6, y6, z6); glVertex3f(x7, y7, z7); glEnd();
Computer Graphics I, Fall 2010 Inward and Outward Facing Polygons Order {v 1, v 6, v 7 } and {v 6, v 7, v 1 } equivalent ==> same polygon rendered by OpenGL but {v 1, v 7, v 6 } different First two ==> outwardly facing polygons Use right-hand rule = counter-clockwise encirclement of outward-pointing normal OpenGL can treat inward and outward facing polygons differently
Computer Graphics I, Fall 2010 Geometry vs Topology Good idea to look for data structures that separate geometry from topology Geometry: locations of vertices Topology: organization of vertices and edges Example: polygon = ordered list of vertices edge connecting successive pairs of vertices last to first Topology holds even if geometry changes
Computer Graphics I, Fall 2010 Vertex Lists Put geometry in array Use pointers from vertices into this array Introduce polygon list x 1 y 1 z 1 x 2 y 2 z 2 x 3 y 3 z 3 x 4 y 4 z 4 x 5 y 5 z 5. x 6 y 6 z 6 x 7 y 7 z 7 x 8 y 8 z 8 P1 P2 P3 P4 P5 v1v7v6v1v7v6 v8v5v6v8v5v6 topology geometry
Computer Graphics I, Fall 2010 Shared Edges Vertex lists will draw filled polygons correctly but if draw polygon by its edges ==> shared edges drawn twice Can store mesh by edge list
Computer Graphics I, Fall 2010 Edge List v1v1 v2v2 v7v7 v6v6 v8v8 v5v5 v3v3 e1e1 e8e8 e3e3 e2e2 e 11 e6e6 e7e7 e 10 e5e5 e4e4 e9e9 e 12 e1 e2 e3 e4 e5 e6 e7 e8 e9 x 1 y 1 z 1 x 2 y 2 z 2 x 3 y 3 z 3 x 4 y 4 z 4 x 5 y 5 z 5. x 6 y 6 z 6 x 7 y 7 z 7 x 8 y 8 z 8 v1 v6 Note polygons are not represented
Computer Graphics I, Fall 2010 Modeling a Cube 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}}; Model color cube for rotating cube program Define global arrays for vertices and colors
Computer Graphics I, Fall 2010 Drawing a polygon from a list of indices Draw quadrilateral from list of indices into 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(); }
Computer Graphics I, Fall 2010 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); } Note that vertices are ordered so that obtain correct outward facing normals
Computer Graphics I, Fall 2010 Efficiency Weakness of approach: building model in application ==> many function calls to draw cube Drawing cube by its faces in most straightforward way requires 6 glBegin, 6 glEnd 6 glColor 24 glVertex More if use texture and lighting
Computer Graphics I, Fall 2010 Vertex Arrays OpenGL provides facility called vertex arrays ==> allows to store array data in implementation Six types of arrays supported Vertices Colors Color indices Normals Texture coordinates Edge flags Will need only colors and vertices
Computer Graphics I, Fall 2010 Initialization Using same color and vertex data, first 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 arraysstored as floats data contiguous data array
Computer Graphics I, Fall 2010 Mapping indices to faces Form array of face indices Each successive four indices describe face of cube Draw through glDrawElements ==> replaces all glVertex and glColor calls in 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};
Computer Graphics I, Fall 2010 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!!