View Transformation
description
Transcript of View Transformation
View TransformationView TransformationCSC 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” -nAre 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 00 d 0 00 0 d 00 0 1 0
xyz1
dx dy dz z dzx dzy 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
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
Rasterization per 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 ModelglShadeModel(GLenum mode)
Modes:GL_FLAT - FLAT shadingGL_SMOOTH - GOURAUD shading
LightsDefining LightsglLightfv(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 LightglLightModelfv(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; }}