Introduction to Computer Graphics: Viewing Transformations Rama C Introduction to Computer Graphics: Viewing Transformations Rama C. Hoetzlein, 2011 Cornell University Lecture Notes
Topics Covered 1. Vector & Matrix Algebra 2. Affine Transformations 3. Homogeneous Coordinates 4. Perspective Projection 5. Projection Pipeline
Complete Perspective Matrix Lets us specify all characteristics of the projective volume. glMatrixMode ( GL_PROJECTION ) glFrustum ( l, r, b, t, near, far); gluPerspective ( fov, asp, near, far); gluOrtho2D ( l, r, b, t ); OpenGL Red Book
Viewing Pipeline What does the world look like through the camera?
scene with camera camera image Goal: Create a projected image of the scene from viewpoint of camera.
Model Space Local objects coordinates centered on the origin X+ Z+ drawCylinder () p
World Space { Objects in their place in the world How do we look through this camera? camera glTranslatef ( .. ) { M glRotatef ( .. ) drawCylinder () p = M p world
Camera Transforms Step 1. Translate everything to camera origin
Camera Transforms Step 2. Rotate around Y-axis by camera angle
Camera Transforms Step 3. Rotate around X-axis by camera tilt
{ View Space Objects oriented with the camera along the Z-axis glMatrixMode ( MODELVIEW ) V { gluLookAt (..) glTranslatef ( .. ) M { glRotatef ( .. ) drawCylinder () V { p = Rcz Rcy Tcam M p p = V M p view view
Normalized Projection Space Objects multiplied by perspective matrix, to fit in unit cube. glMatrixMode ( PROJECTION ) P { gluPerspective(..) glMatrixMode ( MODELVIEW ) V { gluLookAt (..) glTranslatef ( .. ) M { glRotatef ( .. ) drawCylinder () p = P V M p eye
Clipping Objects clipped to unit cube for rasterization. glMatrixMode ( PROJECTION ) P { gluPerspective(..) glMatrixMode ( MODELVIEW ) V { gluLookAt (..) Look here! glTranslatef ( .. ) M { glRotatef ( .. ) drawCylinder () p = clip ( P V M p ) clip
Screen Space Objects as they appear (flattened) on the screen. Divide by w to get 2D coordinates. glMatrixMode ( PROJECTION ) P { gluPerspective(..) glMatrixMode ( MODELVIEW ) V { gluLookAt (..) glTranslatef ( .. ) M { glRotatef ( .. ) drawCylinder () p = divw ( clip ( P V M p ) ) screen
Summary…
VIEWING PIPELINE Model Space World Space View Space M V P Screen Space Clipping persp. div clip Normalized Dev. Coordinates Depth Sorting p = divw ( clip ( P V M p ) ) screen Rasterization
VIEWING PIPELINE – in OpenGL OpenGL has two stored matricies, one for the projection, and one for the combined model-view. glMatrixMode ( GL_PROJECTION ); gluPerspective ( .. ); glMatrixMode ( GL_MODELVIEW ); gluLookAt ( fx, fy, fz, tx, ty, tz ); glRotatef ( 10, 0, 0, 1 ); drawCylinder ( .. ); tell OpenGL to setup projection creates a perspective matrix (P) tell OpenGL to setup model-view creates a view matrix (V) assigns rotation as model matrix (M) requests polygons to be drawn The clipping and divide by w happen automatically in hardware.
MULTIPLE OBJECTS Whats wrong with this? The scene has one view matrix (V) for the camera, but.. each object has its own MODELVIEW matrix, VM. glMatrixMode ( GL_PROJECTION ); gluPerspective ( .. ); glMatrixMode ( GL_MODELVIEW ); gluLookAt ( fx, fy, fz, tx, ty, tz ); glRotatef ( 10, 0, 0, 1 ); drawCylinder ( .. ); glRotatef ( 20, 1, 0, 0 ); P V M1 M2 Whats wrong with this?
MULTIPLE OBJECTS Right! (I hope).. Each object needs to set up the proper VM matrix. glMatrixMode ( GL_PROJECTION ); gluPerspective ( .. ); glMatrixMode ( GL_MODELVIEW ); gluLookAt ( fx, fy, fz, tx, ty, tz ); glGetMatrixfv ( view_matrix ); glLoadMatrixf ( view_matrix ); glRotatef ( 10, 0, 0, 1 ); drawCylinder ( .. ); glRotatef ( 20, 1, 0, 0 ); P V M1 V M2 obj1 = P V M1 obj2 = P V M2 save V