Presentation is loading. Please wait.

Presentation is loading. Please wait.

Advanced Viewing Glenn G. Chappell U. of Alaska Fairbanks CS 381 Lecture Notes Friday, October 31, 2003.

Similar presentations


Presentation on theme: "Advanced Viewing Glenn G. Chappell U. of Alaska Fairbanks CS 381 Lecture Notes Friday, October 31, 2003."— Presentation transcript:

1 Advanced Viewing Glenn G. Chappell CHAPPELLG@member.ams.org U. of Alaska Fairbanks CS 381 Lecture Notes Friday, October 31, 2003

2 31 Oct 2003CS 3812 Review: Projection in 3-D [1/3] We use the projection to handle camera properties. Perspective or parallel (orthogonal) projection. Wide or narrow angle. But not camera position & orientation. How do we determine wide & narrow angle using glFrustum or gluPerspective ? With gluPerspective, change the 1 st parameter (fovy). With glFrustum, multiply left, right, bottom, top by some number. Fancy projections can mess up screen text, buttons, etc. For these, use a separate gluOrtho2D projection. See printmatrix.cpp, on the web page, for sample code.

3 31 Oct 2003CS 3813 Review: Projection in 3-D [2/3] Computing Perspective Projection Based on the synthetic-camera model, we can find the coordinates of a projected point. We use similar triangles (outlined in red). z = –far z = –near Center of Projection (“eye”) (0, 0, 0) (x, y, z) Screen –z–z (x/[–z/near], y/[–z/near], –near) View Frustum

4 31 Oct 2003CS 3814 Review: Projection in 3-D [3/3] We can perform this projection using the following matrix. This matrix is not exactly what glFrustum produces, since it deals with right, left, top, bottom, far, too. But this gives the general idea.

5 31 Oct 2003CS 3815 Review: More on OpenGL Matrices [1/2] We store an OpenGL matrix in an array of 16 GLdouble ’s: GLdouble matrixd[16]; To put the model/view matrix into this array: glGetDoublev(GL_MODELVIEW_MATRIX, matrixd); This is column-major. 0..3 are the first column, not the first row. To restore the saved model/view matrix: glLoadMatrixd(matrixd); // Mode must be GL_MODELVIEW! More usefully, to multiply saved matrix by current matrix: glMultMatrixd(matrixd); // Mode must be GL_MODELVIEW!

6 31 Oct 2003CS 3816 Review: More on OpenGL Matrices [2/2] How would you write glTranslate * yourself? void myglTranslate(double x, double y, double z) { GLdouble m[16]; // The translation matrix m[ 0] = 1.; m[ 4] = 0.; m[ 8] = 0.; m[12] = x; m[ 1] = 0.; m[ 5] = 1.; m[ 9] = 0.; m[13] = y; m[ 2] = 0.; m[ 6] = 0.; m[10] = 1.; m[14] = z; m[ 3] = 0.; m[ 7] = 0.; m[11] = 0.; m[15] = 1.; glMultMatrixd(m); // Multiply it } Why don’t I set GL_MODELVIEW mode in this function?

7 31 Oct 2003CS 3817 Advanced Viewing: Problem & Solution So far, we have always created the model/view transformation from scratch for each frame. This can get unwieldy if an increasingly long sequence of transformations must be remembered. Consider “flying”. Solution Keep the current state of a sequence of transformations in a matrix. Modify the matrix appropriately when a new transformation is added. In the display function, just do glMultMatrix *.

8 31 Oct 2003CS 3818 Advanced Viewing: Example 1: “Zoom & Pan” [1/2] In traditional zoom & pan (with a real camera): Zoom means changing the wide/narrow-angle properties of the lens. Pan means rotating the camera. We will misuse these terms somewhat, in order to make a more helpful example. Our “zoom” will scale the world. Our “pan” will translate it. We will use model/view for both of these. Think: What is a problem with panning while zoomed in close?

9 31 Oct 2003CS 3819 Advanced Viewing: Example 1: “Zoom & Pan” [2/2] Suppose we handle “zoom & pan” with a saved viewing matrix. What do we do to this matrix, in order to pan? Translate, then do the saved transformations. Result is the new transformation. What do we do to this matrix, in order to zoom? Scale, then do the saved transformations. Result is the new transformation. How do we use this matrix in the display function? Load it ( glLoadMatrixd ). Or do whatever else needs to be done first, then multiply by it ( glMultMatrixd ).

10 31 Oct 2003CS 38110 Advanced Viewing: Handling the Saved Matrix Don’t forget to initialize the saved matrix. glMatrixMode(GL_MODELVIEW); glPushMatrix(); ***** Transformation commands go here? ***** glGetDoublev(GL_MODELVIEW_MATRIX, your_matrix_variable ); glPopMatrix(); Whenever you do anything with the model/view transformation, use push & pop. Changing the matrix alters the display. So post a redisplay event whenever you change the matrix outside the display function. Generally, to alter a saved model/view matrix outside the display function: glPushMatrix(); glLoadIdentity(); // May not be necessary ***** Transformation commands go here ***** glMultMatrixd( your_matrix_variable ); // If this is appropriate glGetDoublev(GL_MODELVIEW_MATRIX, your_matrix_variable ); glPopMatrix(); glutPostRedisplay();

11 31 Oct 2003CS 38111 Advanced Viewing: Example 2: A Driving Interface Imagine a car at the center of the window, driving through the city streets. How can we turn our zoom-pan interface into a 2-D driving-style interface (viewed from above) with only minimal modifications? Change the pan-left and pan-right code to do rotations about the z-axis.

12 31 Oct 2003CS 38112 Advanced Viewing: Example 3: Flying [1/2] We implemented the first two examples using a saved matrix to hold viewing transformations. Viewing transform’s = camera motions. Okay, the “zoom” part didn’t quite fit this model … The ultimate generality in camera motions is achieved in “flying”. Flying = moving in the viewing direction & rotating about the camera. How do we fly forward? Put a +z translation before (in the code) all previous transformations. How to we turn? Put a y-axis (or x-axis, for going up & down) rotation before (in the code) all previous transformations.

13 31 Oct 2003CS 38113 Advanced Viewing: Example 3: Flying [2/2] Wouldn’t it be nicer to use the mouse? Yes. We’ll talk about that next time.


Download ppt "Advanced Viewing Glenn G. Chappell U. of Alaska Fairbanks CS 381 Lecture Notes Friday, October 31, 2003."

Similar presentations


Ads by Google