View Transformation CSC 830 Note 3 Course note credit to Prof. Seth Teller, MIT.

Post on 21-Dec-2015

223 views 3 download

Tags:

Transcript of View Transformation CSC 830 Note 3 Course note credit to Prof. Seth Teller, MIT.

View TransformationView TransformationView TransformationView Transformation

CSC 830 Note 3CSC 830 Note 3

Course note credit to Prof. Seth Teller, MIT

View Transformation

Transform (i.e., express) geometry into coordinates that arewell-suited to (simple) clipping and projection hardware

Positioning Synthetic Camera

What are our “degrees of freedom” in camera positioning?To achieve effective visual simulation, we want:1) the eye point to be in proximity of modeled scene2) the view to be directed toward region of interest, and3) the image plane to have a reasonable “twist”

Eye Coordinates

Eyepoint at originu axis toward “right” of image planev axis toward “top” of image planeview direction along negative n axis

Transformation to Eye Coordinates

Our task: construct the transformation M that re-expresses world coordinates in the viewer frame

Machinery: Changing Orthobases

Suppose you are given an orthobasis u, v, nWhat is the action of the matrix M withrows u, v, and n as below?

Applying M to u, v, n

Two equally valid interpretations, depending on reference frame:1: Think of uvn basis as a rigid object in a fixed world spaceThen M “rotates” uvn basis into xyz basis2: Think of a fixed axis triad, with “labels” from xyz spaceThen M “reexpresses” an xyz point p in uvn coords!It is this second interpretation that we use todayto “relabel” world-space geometry with eye space coordinates

Positioning Synthetic Camera

Given eyepoint e, basis ˆu, ˆv, ˆnDeduce M that expresses world in eye coordinates:Overlay origins, then change bases:

Positioning Synthetic Camera

Check: does M re-express world geometry in eye coordinates?

Positioning Synthetic Camera

Camera specification must include:World-space eye position eWorld-space “lookat direction” -n

Are e and -n enough to determine the camera DOFs (degrees of freedom)?

Positioning Synthetic Camera

Are e and -n enough to determine the camera DOFs?No. Note that we were not given u and v!(Why not simply require the user to specify them?)

We must also determine u and v, i.e., camera “twist” about n.Typically done by specification of a world-space “up vector”provided by user interface, e.g., using gluLookat(e, c, up)“Twist” constraint: Align v with world up vector (How?)

Positioning Synthetic Camera

Where are we?

What is Projection?

Any operation that reduces dimension (e.g., 3D to 2D)

Orthographic ProjectionPerspective Projection

Orthographic Projection• focal point at infinity • rays are parallel and orthogonal to the image

plane

Image

World

F

F

Image

World

I

W

Comparison

Simple Perspective Camera

• camera looks along z-axis• focal point is the origin• image plane is parallel to xy-plane at

distance d• d is call focal length

Similar TrianglesY

Z

[0, d][0, 0]

[Y, Z]

[(d/Z)Y, d]

• Similar situation with x-coordinate• Similar Triangles:

point [x,y,z] projects to [(d/z)x, (d/z)y, d]

Projection Matrix Projection using homogeneous coordinates:

– transform [x, y, z] to [(d/z)x, (d/z)y, d]

•2-D image point:•discard third coordinate•apply viewport transformation to

obtain physical pixel coordinates

d 0 0 0

0 d 0 0

0 0 d 0

0 0 1 0

x

y

z

1

dx dy dz z d

zxd

zy d

Divide by 4th coordinate

(the “w” coordinate)

Perspective Projection

Perspective Projection

z = 0 not allowed (what happens to points on plane z = 0?)Operation well-defined for all other points

Perspective Projection

Matrix formulation using “homogeneous 4-vectors”:

Finally, recover projected point using homogenous convention:Divide by 4th element to convert 4-vector to 3-vector:

Are we ready to rasterize? Not yet.

• It is difficult to do clipping directly in the viewing frustum

The View Frustum

Canonical View Volume

Matrix Formulation

Perspective ProjectionSuppose we have transformed from World to Eye to Canonical coordinatesHow do we project onto “image plane”?

Simply ignore z coordinate!

Qualitative Features of Perspective Projection

Equal-sized objects at different depths project to different sizes!

Perspective projection does not preserve shape of planar figures!

Families of parallel lines have “vanishing points”projection of point at infinity in direction of lines

Continue withContinue withOpenGLOpenGL

Continue withContinue withOpenGLOpenGL

OpenGL OpenGL is a low-level graphics API Window system independent

No facility for window events/user input Can use additionally libraries (eg. GLUT)

Vertex driven Primitives assembled from vertices

***OpenGL is a state machine***

OpenGL

per vertexoperations &primitiveassembly

Rasterizationper pixeloperations

FrameBuffer

Commands or display list

Clearing the BuffersClears the buffers using the specified valuesglClearColor(GLclampf red,

GLclampf green, GLclampf blue, GLclampf alpha)

glClear(GLbitfield mask)

Masks:GL_COLOR_BUFFER_BIT, GL_DEPTH_BUFFER_BIT,GL_ACCUM_BUFFER_BIT, GL_STENCIL_BUFFER_BIT

Drawing PrimitivesBegin/End drawing a primitive

glBegin(GLenum mode)

glEnd()

Modes:

GL_POINTS, GL_LINES, GL_TRIANGLES,GL_TRIANGLE_STRIP, GL_QUADS,GL_POLYGON

Drawing PrimitivesDraw a vertex of a primitive

glVertex3f(GLfloat x, GLfloat y, GLfloat z)

The vertex is drawn according to the current state

Variants:

glVertex3fv(const GLfloat *v)

2d,3d,4d, shorts, ints, floats, doubles

Elements of Current State

Current: Color Normal Texture coordinates Drawing mode Matrix mode Matrix on:

Modelview stack Perspective stack Texture stack

Drawing ExampleDraw a simple square:

glBegin(GL_POLYGON); glVertex3f(-0.5, 0.5,0.5); glVertex3f( 0.5, 0.5,0.5); glVertex3f( 0.5,-0.5,0.5); glVertex3f(-0.5,-0.5,0.5);glEnd();

Changing the Current Color

Set the current color:

glColor3f(GLfloat red,GLfloat green,GLfloat blue)

Variants:

glColor4f(red, green, blue, alpha)

bytes, unsigned bytes,shorts, ints, floats, doubles

Drawing ExampleAdding color:

glBegin(GL_POLYGON); glColor3f(1,0,0); glVertex3f(-0.5, 0.5,0.5); glVertex3f( 0.5, 0.5,0.5); glVertex3f( 0.5,-0.5,0.5); glVertex3f(-0.5,-0.5,0.5);glEnd();

Changing the Current Normal

Set the current normal:

glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz)

Variants:

glNormal3fv(const GLfloat *v)

bytes, shorts, ints, floats, doubles

Drawing ExampleAdding normals:

glBegin(GL_POLYGON); glColor3f(1,0,0); glNormal3f(0,0,1); glVertex3f(-0.5, 0.5,0.5); glVertex3f( 0.5, 0.5,0.5); glVertex3f( 0.5,-0.5,0.5); glVertex3f(-0.5,-0.5,0.5);glEnd();

Transformation PipelineStages of vertex transformations:

Objectcoords

ModelviewMatrix

ProjectionMatrix

ViewportMapping

Cameracoords

Normalizedcoords

Windowcoords

Transformation PipelineMatrices are set up on stacks

Matrix commands are post-multiplied onto thecurrent matrix

the last command issued is the first transformation applied to the object

Can save/restore the current matrix

Transformation PipelineSave/Restore the current matrix:

glPushMatrix()

glPopMatrix()

Change the current matrix stack:

glMatrixMode(GLenum mode)

GL_MODELVIEW, GL_PROJECTION,GL_TEXTURE

Transformation PipelineTranslate:

glTranslatef(GLfloat x, GLfloat y, GLfloat z)

Scale:

glScalef(GLfloat x, GLfloat y, GLfloat z)

Transformation PipelineRotate:

glRotatef(GLfloat angle,GLfloat x,GLfloat y,GLfloat z)

is given in degreesangle

is the unit rotation axisX,y,z

Transformation PipelineHierarchical Modelling:

glTranslatef(waistx,waisty,waistz);glPushMatrix(); glRotatef(ra,rx,ry,rz); // draw right armglPopMatrix();glPushMatrix(); glRotatef(la,lx,ly,lz); // draw left armglPopMatrix();

Drawing ExampleAdding transformations:glMatrixMode(GL_MODELVIEW);glBegin(GL_POLYGON); glTranslatef(0,0,0); glRotatef(0,0,1,0); glScalef(1,1,1); glColor3f(1,0,0); glNormal3f(0,0,1); glVertex3f(-0.5, 0.5,0.5); glVertex3f( 0.5, 0.5,0.5); glVertex3f( 0.5,-0.5,0.5); glVertex3f(-0.5,-0.5,0.5);glEnd();

CamerasPerspective Camera

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

Orthographic Camera

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

ShadingSetting the Shading Model

glShadeModel(GLenum mode)

Modes:

GL_FLAT - FLAT shadingGL_SMOOTH - GOURAUD shading

LightsDefining Lights

glLightfv(GLenum light, GLenum pname, GLfloat *param)

glEnable(GL_LIGHTING)glEnable(GL_LIGHT0)

Parameters:

GL_AMBIENT - RGBA ambient intensityGL_DIFFUSE - RGBA diffuse intensityGL_SPECULAR - RGBA specular intensityGL_POSITION – light position

LightsSetting the Ambient Light

glLightModelfv(GLenum pname,GLfloat *param)

Parameters:

GL_LIGHT_MODEL_AMBIENT- global RGBA ambient intensity

MaterialsDefining Material Properties

glMaterialfv(GLenum face, GLenum pname, GLfloat *param)

Faces:

GL_FRONT, GL_BACK, GL_FRONT_AND_BACK

Parameters:GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR,GL_EMISSION, GL_SHININESS

Drawing ExampleAdding Lighting:float lPos[] = {1.0,1.0,1.0,1.0};glLightfv(GL_LIGHT0,GL_POSITION,lPos);glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);glShadeModel(GL_SMOOTH);

float diffuse[] = {1.0,0.0,0.0,1.0};glMaterialfv(GL_FRONT,GL_DIFFUSE,diffuse);

// Setup camera// Draw objects

Event Driven Programming

Program responds to events Events are handled by user

defined callback functions Callbacks must know context and

event type (passed through variables)

Event Driven Programming

MainEventLoop

DisplayHandler

KeyboardHandler

MouseHandler

Simple GLUT ExampleDisplaying a squareint main (int argc, char *argv[]){ glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); int windowHandle = glutCreateWindow("Simple GLUT App");

glutDisplayFunc(redraw);

glutMainLoop();

return 0;}

Display CallbackCalled when window is redrawnvoid redraw(){ glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_QUADS); glColor3f(1, 0, 0); glVertex3f(-0.5, 0.5, 0.5); glVertex3f(0.5, 0.5, 0.5); glVertex3f(0.5, -0.5, 0.5); glVertex3f(-0.5, -0.5, 0.5); glEnd(); // GL_QUADS glutSwapBuffers();}

More GLUTAdditional GLUT functions glutPositionWindow(int x,int y); glutReshapeWindow(int w, int h);

Additional callback functions glutReshapeFunction(reshape); glutMouseFunction(mousebutton); glutMotionFunction(motion); glutKeyboardFunction(keyboardCB); glutSpecialFunction(special); glutIdleFunction(animate);

Reshape CallbackCalled when the window is resizedvoid reshape(int w, int h){ glViewport(0.0,0.0,w,h);

glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0.0,w,0.0,h, -1.0, 1.0);

glMatrixMode(GL_MODELVIEW); glLoadIdentity(); }

Mouse CallbacksCalled when the mouse button is pressedvoid mousebutton(int button, int state, int x, int y){ if (button==GLUT_LEFT_BUTTON && state==GLUT_DOWN) { rx = x; ry = winHeight - y; }}

Called when the mouse is moved with button downvoid motion(int x, int y){ rx = x; ry = winHeight - y;}

Keyboard CallbacksCalled when a button is pressedvoid keyboardCB(unsigned char key, int x, int y){ switch(key) { case 'a': cout<<"a Pressed"<<endl; break; }}

Called when a special button is pressedvoid special(int key, int x, int y){ switch(key) { case GLUT_F1_KEY:

cout<<“F1 Pressed"<<endl; break; }}

Animation CallbacksCalled when the system is idlevoid animationCB(){ float time = glutGet(GLUT_ELAPSED_TIME); glRotated(time,0.0,1.0,0.0); glutPostRedisplay();}

Menu CallbacksCreating a menu enum { M_NONE, M_OPEN, M_SAVE, M_EXIT }; glutCreateMenu(menuFunc); glutAddMenuEntry("Open", M_OPEN); glutAddMenuEntry("-----------------------", M_NONE); glutAddMenuEntry("Exit", M_EXIT); glutAttachMenu(GLUT_RIGHT_BUTTON);

Called when a menu button is pressedvoid menuFunc(int value){ switch(value) { case M_EXIT: exit(0); break; }}