Presentation is loading. Please wait.

Presentation is loading. Please wait.

View Transformation CSC 830 Note 3

Similar presentations


Presentation on theme: "View Transformation CSC 830 Note 3"— Presentation transcript:

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; } }


Download ppt "View Transformation CSC 830 Note 3"

Similar presentations


Ads by Google