Download presentation
1
View Transformation CSC 830 Note 3
Course note credit to Prof. Seth Teller, MIT
2
View Transformation Transform (i.e., express) geometry into coordinates that are well-suited to (simple) clipping and projection hardware
3
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 scene 2) the view to be directed toward region of interest, and 3) the image plane to have a reasonable “twist”
4
Eye Coordinates Eyepoint at origin
u axis toward “right” of image plane v axis toward “top” of image plane view direction along negative n axis
5
Transformation to Eye Coordinates
Our task: construct the transformation M that re-expresses world coordinates in the viewer frame
6
Machinery: Changing Orthobases
Suppose you are given an orthobasis u, v, n What is the action of the matrix M with rows u, v, and n as below?
7
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 space Then M “rotates” uvn basis into xyz basis 2: Think of a fixed axis triad, with “labels” from xyz space Then M “reexpresses” an xyz point p in uvn coords! It is this second interpretation that we use today to “relabel” world-space geometry with eye space coordinates
8
Positioning Synthetic Camera
Given eyepoint e, basis ˆu, ˆv, ˆn Deduce M that expresses world in eye coordinates: Overlay origins, then change bases:
9
Positioning Synthetic Camera
Check: does M re-express world geometry in eye coordinates?
10
Positioning Synthetic Camera
Camera specification must include: World-space eye position e World-space “lookat direction” -n Are e and -n enough to determine the camera DOFs (degrees of freedom)?
11
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?)
12
Positioning Synthetic Camera
13
Where are we?
14
What is Projection? Any operation that reduces dimension (e.g., 3D to 2D) Orthographic Projection Perspective Projection
15
Orthographic Projection
focal point at infinity rays are parallel and orthogonal to the image plane F Image World I W Image World F
16
Comparison
17
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
18
Similar Triangles Similar situation with x-coordinate
Y 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]
19
Divide by 4th coordinate
Projection Matrix Projection using homogeneous coordinates: transform [x, y, z] to [(d/z)x, (d/z)y, d] d 1 é ë ê ù û ú x y z = dx dy dz [ ] Þ Divide by 4th coordinate (the “w” coordinate) 2-D image point: discard third coordinate apply viewport transformation to obtain physical pixel coordinates
20
Perspective Projection
21
Perspective Projection
z = 0 not allowed (what happens to points on plane z = 0?) Operation well-defined for all other points
22
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:
23
Are we ready to rasterize? Not yet.
It is difficult to do clipping directly in the viewing frustum
24
The View Frustum
25
Canonical View Volume
26
Matrix Formulation
27
Perspective Projection
Suppose we have transformed from World to Eye to Canonical coordinates How do we project onto “image plane”? Simply ignore z coordinate!
28
Qualitative Features of Perspective Projection
Equal-sized objects at different depths project to different sizes! Perspective projection does not preserve shape of planar figures!
29
Families of parallel lines have “vanishing points”
projection of point at infinity in direction of lines
30
Continue with OpenGL
31
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***
32
OpenGL Commands or display list per vertex operations & primitive
assembly per pixel operations Frame Buffer Rasterization
33
Clearing the Buffers Clears the buffers using the specified values
glClearColor(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
34
Drawing Primitives Begin/End drawing a primitive Modes:
glBegin(GLenum mode) glEnd() Modes: GL_POINTS, GL_LINES, GL_TRIANGLES, GL_TRIANGLE_STRIP, GL_QUADS, GL_POLYGON
35
Drawing Primitives Draw a vertex of a primitive Variants:
glVertex3f(GLfloat x, GLfloat y, GLfloat z) Variants: glVertex3fv(const GLfloat *v) 2d,3d,4d, shorts, ints, floats, doubles The vertex is drawn according to the current state
36
Elements of Current State
Color Normal Texture coordinates Drawing mode Matrix mode Matrix on: Modelview stack Perspective stack Texture stack
37
Drawing Example Draw 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();
38
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
39
Drawing Example Adding 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();
40
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
41
Drawing Example Adding 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();
42
Transformation Pipeline
Stages of vertex transformations: Modelview Matrix Projection Matrix Viewport Mapping Object coords Camera coords Normalized coords Window coords
43
Transformation Pipeline
Matrices are set up on stacks Matrix commands are post-multiplied onto the current matrix the last command issued is the first transformation applied to the object Can save/restore the current matrix
44
Transformation Pipeline
Save/Restore the current matrix: glPushMatrix() glPopMatrix() Change the current matrix stack: glMatrixMode(GLenum mode) GL_MODELVIEW, GL_PROJECTION, GL_TEXTURE
45
Transformation Pipeline
Translate: glTranslatef(GLfloat x, GLfloat y, GLfloat z) Scale: glScalef(GLfloat x, GLfloat y, GLfloat z)
46
Transformation Pipeline
Rotate: glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z) angle is given in degrees X,y,z is the unit rotation axis
47
Transformation Pipeline
Hierarchical Modelling: glTranslatef(waistx,waisty,waistz); glPushMatrix(); glRotatef(ra,rx,ry,rz); // draw right arm glPopMatrix(); glRotatef(la,lx,ly,lz); // draw left arm
48
Drawing Example Adding 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();
49
Cameras Perspective Camera Orthographic 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)
50
Shading Setting the Shading Model Modes: glShadeModel(GLenum mode)
GL_FLAT - FLAT shading GL_SMOOTH - GOURAUD shading
51
Lights Defining Lights Parameters:
glLightfv(GLenum light, GLenum pname, GLfloat *param) glEnable(GL_LIGHTING) glEnable(GL_LIGHT0) Parameters: GL_AMBIENT - RGBA ambient intensity GL_DIFFUSE - RGBA diffuse intensity GL_SPECULAR - RGBA specular intensity GL_POSITION – light position
52
Lights Setting the Ambient Light Parameters:
glLightModelfv(GLenum pname, GLfloat *param) Parameters: GL_LIGHT_MODEL_AMBIENT - global RGBA ambient intensity
53
Materials Defining Material Properties Faces: Parameters:
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
54
Drawing Example Adding 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
55
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)
56
Event Driven Programming
Display Handler Main Event Loop Keyboard Handler Mouse Handler
57
Simple GLUT Example Displaying a square
int main (int argc, char *argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); int windowHandle = glutCreateWindow("Simple GLUT App"); glutDisplayFunc(redraw); glutMainLoop(); return 0; }
58
Display Callback Called when window is redrawn void 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(); }
59
More GLUT Additional GLUT functions Additional callback 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);
60
Reshape Callback Called when the window is resized
void 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); }
61
Mouse Callbacks Called when the mouse button is pressed
void 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 down void motion(int x, int y) { rx = x; ry = winHeight - y; }
62
Keyboard Callbacks Called when a button is pressed
void keyboardCB(unsigned char key, int x, int y) { switch(key) { case 'a': cout<<"a Pressed"<<endl; break; } } Called when a special button is pressed void special(int key, int x, int y) { switch(key) { case GLUT_F1_KEY: cout<<“F1 Pressed"<<endl; break; } }
63
Animation Callbacks Called when the system is idle void animationCB()
{ float time = glutGet(GLUT_ELAPSED_TIME); glRotated(time,0.0,1.0,0.0); glutPostRedisplay(); }
64
Menu Callbacks Creating a menu Called when a menu button is pressed
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 pressed void menuFunc(int value) { switch(value) { case M_EXIT: exit(0); break; } }
Similar presentations
© 2025 SlidePlayer.com Inc.
All rights reserved.