You are on page 1of 24

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

You might also like