CSC 307 1.
Graphics Programming
Budditha Hettige Department of Statistics and Computer Science
Graphics Programming
OpenGL 3D Drawing
Budditha Hettige
3D Graphics
Projections Getting 3D to 2D
3D scene
Budditha Hettige
2D image
3
Projections
Orthographic Projection Perspective Projection
Perspective
Orthographic
Budditha Hettige
Orthographic Projections
glOrtho ( double left, double right, double bottom, double top, double near, double far);
Top Left Right
Toward the viewport
Bottom Near
Budditha Hettige
Viewing Volume Far
5
Perspective Projection
gluPerspective ( double angle, double aspect, double near, double far);
aspect = w/h
w
Observer
map
map
zoom in
Budditha Hettige
zoom out
Draw a 3D Model
Object Composition
Polygon
3D Model
Budditha Hettige
Object Composition
Use Transformation
glPushMatrix ( ); glPopMatrix ( ); Save the current transformation state and then restore it after some objects have been placed
Budditha Hettige
The Matrix Stack
Draw a car use transformation
The car body and four wheeles
Transformation state
Wheele 4
Wheele 4 Wheele 3 Wheele 2 Wheele 1 The Car Body
Budditha Hettige
Hidden Surface Removal
Enable Depth Testing
glEnable (GL_DEPTH_TEST);
Hidden Surface
Budditha Hettige
10
Drawing 3D Objects
Cube
void glutWireCube(GLdouble size); void glutSolidCube(GLdouble size);
Sphere
void glutWireSphere(GLdouble radius, GLint slices, GLint stacks); void glutSolidSphere(GLdouble radius, GLint slices, GLint stacks);
Cone
Budditha Hettige
11
Three-dimensional Applications
In OpenGL, two-dimensional applications are a special case of three-dimensional graphics
Not much changes Use glVertex3*( )
Have to worry about the order in which polygons are drawn or use hidden-surface removal Polygons should be simple, convex, flat
Budditha Hettige
12
Sierpinski Gasket (2D)
Start with a triangle
Connect bisectors of sides and remove central triangle
Repeat Example : Gasket.cpp
Budditha Hettige
13
Moving to 3D
We can easily make the program threedimensional by using
typedef Glfloat point3[3] glVertex3f glOrtho
But that would not be very interesting Instead, we can start with a tetrahedron
Budditha Hettige
14
3D Gasket
We can subdivide each of the four faces
We can easily make the program three-dimensional by using
typedef Glfloat point3[3] glVertex3f glOrtho
Budditha Hettige
15
Example
After 4 interations
Budditha Hettige
16
triangle code
void triangle( point a, point b, point c) {// right-hand rule glBegin(GL_POLYGON); glVertex3fv(a); glVertex3fv(b); glVertex3fv(c); glEnd(); }
Budditha Hettige
17
subdivision code
void divide_triangle(point int m) { point v1, v2, v3; int j; if(m>0) { for(j=0; j<3; j++) for(j=0; j<3; j++) for(j=0; j<3; j++) divide_triangle(a, divide_triangle(c, divide_triangle(b, } else(triangle(a,b,c)); } a, point b, point c,
v1[j]=(a[j]+b[j])/2; v2[j]=(a[j]+c[j])/2; v3[j]=(b[j]+c[j])/2; v1, v2, m-1); v2, v3, m-1); v3, v1, m-1);
Budditha Hettige
18
tetrahedron code
void tetrahedron( int m) { glColor3f(1.0,0.0,0.0); divide_triangle(v[0], v[1], glColor3f(0.0,1.0,0.0); divide_triangle(v[3], v[2], glColor3f(0.0,0.0,1.0); divide_triangle(v[0], v[3], glColor3f(0.0,0.0,0.0); divide_triangle(v[0], v[2], }
v[2], m); v[1], m);
v[1], m);
v[3], m);
Budditha Hettige
19
Problem
Because the triangles are drawn in the order they are defined in the program, the front triangles are not always rendered in front of triangles behind them
get this
want this
Budditha Hettige
20
Solution: Hidden-Surface Removal
We want to see only those surfaces in front of other surfaces OpenGL uses a hidden-surface method called the z-buffer algorithm that saves depth information as objects are rendered so that only the front objects appear in the image
Budditha Hettige
21
Locating the camera
Position and orient the camera three inputs
Eye, at, and direction up
Camera is on Model-View mode
Budditha Hettige
22
Default Camera Settings
With default, camera is located at the origin and oriented at the negative z-axes If place a cube at the origin, only one side of the cube is visible Look at objects from different angles
Move the objects Move the camera
Example a cube
Glu function
void gluLookAt(eyex, eyey, eyez, atx, aty, atz, upx, upy, upz) gluLookAt(1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
Budditha Hettige
23
Code: Display a cube
void display() {
glClear(GL_COLOR_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); glutWireCube(1.0f); glFlush();
Budditha Hettige
24