You are on page 1of 26

CS 4731: Computer Graphics Lecture 11: 3D Viewing Emmanuel Agu

3D Viewing

Similar to taking a photograph

Viewing Transformation

Control the lens of the camera Project the object from 3D world to 2D screen

Viewing Transformation

Control the lens of the camera Important camera parameters to specify Camera (eye) position (Ex,Ey,Ez) in world coordinate system Center of interest (coi) (cx, cy, cz) or lookAt point Orientation (which way is up?): Up vector (Up_x, Up_y, Up_z)
(ex, ey, ez)

world

(cx, cy, cz)

view up vector (Up_x, Up_y, Up_z)

Viewing Transformation

Transformation?

Form a camera (eye) coordinate frame Transform objects from world to eye space

v y coi world z x

Eye coordinate frame

Viewing Transformation

Eye space?

Transform to eye space can simplify many downstream operations (such as projection) in the pipeline

(0,1,0) v y coi world z x

(1,0,0) u n (0,0,1) (0,0,0)

Viewing Transformation

OpenGL way:

gluLookAt (Ex, Ey, Ez, cx, cy, cz, Up_x, Up_y, Up_z) The view up vector is usually (0,1,0) Remember to set the OpenGL matrix mode to GL_MODELVIEW first Modelview matrix: Projection matrix: Viewport matrix: combination of modeling matrix M and Camera transforms V

Recall: OpenGL uses 3 matrices:


Modelview matrix:

Viewing Transformation

OpenGL Code: void display() { glClear(GL_COLOR_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0,0,1,0,0,0,0,1,0); display_all(); // your display routine }

Projection Transformation

Different types of projection: parallel, perspective, orthographic, etc Important to control


Projection type: perspective or orthographic, etc. Field of view and image aspect ratio Near and far clipping planes

Perspective Projection

Similar to real world Characterized by object foreshortening Objects appear larger if they are closer to camera Need:

Projection center Projection plane

Projection: Connecting the object to the projection center

camera

projection plane

Projection?

Projectors Object in 3 space Projected image VRP COP

Orthographic Projection

No foreshortening effect distance from camera does not matter The projection center is at infinite Projection calculation just drop z coordinates

Field of View

Determine how much of the world is taken into the picture Larger field of view = smaller object projection size

center of projection field of view (view angle) y z z x y

Near and Far Clipping Planes


Only objects between near and far planes are drawn Near plane + far plane + field of view = Viewing Frustum

Near plane y z x

Far plane

Viewing Frustrum

3D counterpart of 2D world clip window Objects outside the frustum are clipped
Near plane y z x Viewing Frustum

Far plane

Projection Transformation

In OpenGL:

Set the matrix mode to GL_PROJECTION Perspective projection: use gluPerspective(fovy, aspect, near, far) or
glFrustum(left, right, bottom, top, near, far)

Orthographic:
glOrtho(left, right, bottom, top, near, far)

gluPerspective(fovy, aspect, near, far)

Aspect ratio is used to calculate the window width

y z fovy z

w h x near far

eye Aspect = w / h

glFrustum(left, right, bottom, top, near, far)

Can use this function in place of gluPerspective()

left y z x

top

bottom

right far

near

glOrtho(left, right, bottom, top, near, far)

For orthographic projection


top

left y z x

bottom near

right far

Example: Projection Transformation


void display() { glClear(GL_COLOR_BUFFER_BIT); glMatrixMode(GL_PROJETION); glLoadIdentity(); gluPerspective(fove, aspect, near, far); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0,0,1,0,0,0,0,1,0); display_all(); // your display routine }

Flexible Camera Control


Sometimes, we want camera to move Just like control a airplanes orientation Use aviation terms for this
y


x yaw

roll

pitch

Yaw, pitch, roll?


Think about being in an airplane Pitch: nose up-down Roll: roll body of plane Yaw: move nose side to side

Flexible Camera Control

Instead of provide COI, it is possible to just give camera orientation Just like control a airplanes orientation

pitch

x yaw

x roll

Flexible Camera Control


How to compute the viewing vector (x,y,z) from pitch() and yaw() ?

=0 =0

z = Rcos()cos(90-) y

x = Rcos()cos()

R x R cos() z x y = Rsin()

Flexible Camera Control


gluLookAt() does not let you to control pitch and yaw you need to User supplies , or roll angle Compute/maintain the vector by yourself Calculate COI = Eye + (x,y,z) Then, call gluLookAt().

References

Hill, chapter 7

You might also like