2IV60 Computer graphics set 7: Basic Geometric Modeling Jack van Wijk TU/e
Geometric modeling 1 The world is full of all kind of objects: Trees, people, cars, housed, clouds, rocks, waves, pencil sharpeners, fire, mountains, plants, … How can we describe these, such that they are -easy to enter; -easy to process; -easy to display? Complex problem, HUGE topic!
Geometric modeling 2 Input: by user -preferably on a high level, customized to application by scanning objects -laser scanners: points -medical scanners: voxels
Geometric modeling 3 triangles User Scanner conversion graphics pipeline image 3D points, voxels Instructions, specifications
Smooth Curves (2D) Two standard methods: Parametric: X(t) = (x(t), y(t)) Implicit: f(x, y) = 0 H&B A-8,9:
Parametric description line 1 Given point P and vector V: X(t) = P + Vt Given two points P en Q: X(t) = P + (Q P)t, or = P(1 t) + Qt Segment: t min t t max x y P V t Q H&B A-8,9:
Parametric description curve X(t) = (x(t), y(t)) Drawing a curve in a simple way, approximate with a polyline: MoveTo(X(0)); for i := 1 to N do LineTo(X(i t)); H&B A-8,9:
Drawing a curve with OpenGL 1 X(float t):Point; { P[0]= …; P[1]=…; P[2]=…; return P; }; DrawX(); { N = 12; // use symbolic name for the number of segments int i; float dt := (tmax – tmin)/N; glBegin(GL_LINE_STRIP); // GL_LINE_LOOP if closed curve for (i = 0; i <= N; i++) // bounds here: 0 - N glVertex3fv(X(tmin + i*dt)); glEnd(); } H&B 4-5:82-83
Drawing a curve with OpenGL 2 Using too few points: –jagged appearance; Using too many points: –slow, –fat appearance (many segments per pixel). H&B 4-5:82-83
Drawing a curve with OpenGL 3 Decide on #points: –characteristics shape; –size of shape on screen. –beforehand or adjust automatically. H&B 4-5:82-83
Implicit description line (X P).N = 0 with N.V = 0 (N: normal vector) Also: ax+by+c=0 x y P V N H&B A-8,9:
Implicit description curve f >0 f <0 f = 0 f =-1 f = 1 f =-2 H&B A-8,9:
Circle x y r H&B A-8,9:
Curves (3D) Two standard methods: Parametric: X(t) = (x(t), y(t), z(t)) Implicit: f(x, y, z) = 0 and g(x, y, z) = 0 Intersection of two surfaces H&B A-8,9:
Circle in 3D x y r z H&B A-8,9:
Surfaces H&B A-8,9: Polyhedra Parametric surfaces Implicit surfaces
Polyhedra Set of polygons that describe the surface of an object Often only triangles (hardware!) Many variations for storage (zie H&B 4-7) Often additional information per vertex (color, normal, texture, …) H&B 13-1:418
Curved surfaces Parametric: X(u,v) = (x(u,v), y(u,v), z(u,v)) Implicit: f(x, y, z) = 0 H&B 13-3:
Sphere 1 x y z v constant, u varies u constant, v varies H&B 13-4:
Sphere 2 x y H&B A-8,9: z v constant, u varies u constant, v varies u v
Sphere 3 x y z H&B 13-4:
Partial Derivatives 1 H&B A10:774
Partial Derivatives 2 H&B A10:774
Normal on surface 1 H&B A-10: T(u)T(u) P(u)P(u) u
Normal on surface 2 T u (u,v) P(u,v) u T v (u,v) v H&B A-10:
Normal on surface 3 T u (u,v) P(u,v) u T v (u,v) v N H&B A-10:
Normal on surface 4 x y z v u TuTu TvTv N H&B A-10:
Normal on surface 5 H&B A-10:
Normal on surface 6 N(x,y,z) (x,y,z) f(x,y,z)=0 H&B A-10:
Normal on surface 7 f >0 f <0 f = 0 H&B A-10:
Normal on surface 8 x y z N H&B A-10:
Quadratic surfaces 1 x y z H&B 13-4:
Quadratic surfaces 2 x y z a c b H&B 13-4:
Quadratic surfaces 3 (0, y, z) y as rara r z as y (x, y, z) y as x as H&B 13-4:
Drawing surfaces with OpenGL 1 Quadratic surfaces: GLU and GLUT offer some basic functions: –glutSolidSphere(r, nLon, nLat); –glutSolidCone(rbase, rheight, nLon, nLat); –glutSolidTeapot(size); –gluSphere, gluCylinder, Teapot? –Google: Utah teapot; –Google: Stanford bunny. H&B 13-6:
Drawing surfaces with OpenGL 1 Quadratic surfaces: GLU and GLUT offer some basic functions: –glutSolidSphere(r, nLon, nLat); –glutSolidCone(rbase, rheight, nLon, nLat); –glutSolidTeapot(size); –gluSphere, gluCylinder, Alternative: Define your own, custom versions, based on standard way to render parametric surfaces. H&B 13-6:
Drawing surfaces with OpenGL 2 X(float u, v):Point; { P[0]= …; P[1]=…; P[2]=…; return P; }; DrawX(); { NU, NV = 12; // use symbolic names for numbers of points again int i, j; float du := (umax – umin)/NU; float dv := (vmax – vmin)/NV; for (j = 0; j < NV; j++) { glBegin(GL_QUAD_STRIP); for (i = 0; i <= NU; j++) { glVertex3fv(X(umin + i*du, vmin + j*dv)); glVertex3fv(X(umin + i*du, vmin + (j+1)*dv)); } glEnd(); }
Drawing surfaces with OpenGL 3 Many variations possible –using triangle strips; –inserting normals, shading info, texture,... Selecting the number of facets: –too few: jagged appearance; –too many: slow; –decide beforehand or automatically, based on size on screen and curvature surface. H&B 4-5:82-83
Next… We now know how to define basic objects. Stay tuned for splines: arbitrary curves and curved surfaces. But first: let’s consider illumination and shading.