530 likes | 834 Views
Reminder. Any sequence of matrix operations can be composed into a single matrix We’ll always use an extra dimension for all vertices (x,y,w). Extending to 3D. Homogeneous coordinates in 3D [x,y,z,1] T (x,y,z,w) Matrices of this form: 4x4 Matrices instead of 3x3 for 3D. Translation.
E N D
Reminder • Any sequence of matrix operations can be composed into a single matrix • We’ll always use an extra dimension for all vertices (x,y,w)
Extending to 3D • Homogeneous coordinates in 3D • [x,y,z,1]T (x,y,z,w) • Matrices of this form: • 4x4 Matrices instead of 3x3 for 3D
OpenGL • glTranslated(x, y, z) Post-multiplies translation matrix onto currently selected matrix…
Example… glTranslated(tox, toy, toz); DrawBox();
Scaling How do I do auniform scale? glScaled(x, y, z)
What about Rotation? • How can we convert this to 3D?
Rotation about Z axis Just keep z constant.
OpenGL general glRotated • glRotated(angle, x, y, z) • Rotates by angle (in degrees) around the vector (x, y, z)
Example: Rotating around a point • Suppose we have an object centered on (12, 17, 32) • We want to “spin” the object around that center point • What will be the operations?
Homogenous Coordinates and Vectors • It is convention that • Points in space are indicated with w=1 • Vectors are indicated with w=0 • [12, 13, 5, 1]T is a point • [45, 13, 2, 0]T is a vector (point – point?) • We often want unit-length vectors
OpenGL Transformation Composition • A global modeling transformation matrix (GL_MODELVIEW, called it M here) glMatrixMode(GL_MODELVIEW) • The useris responsible to reset it if necessary glLoadIdentity() -> M = 1 0 0 0 1 0 0 0 1
OpenGL Transformation Composition • Matrices for performing user-specified transformations are multiplied to the current matrix • For example, 1 0 1 glTranslated(1,1 0); M = M x 0 1 1 0 0 1 • All the vertices defined within glBegin() / glEnd() will first go through the transformation (modeling transformation) P’ = M x P
Object Local Coordinates Object World Coordinates Transformation Pipeline Modeling transformation …
Frames • Frame – A center and three coordinate axes • A coordinate system World Frame and Camera Frame
World to Camera • What does gluLookAt do mathematically? void gluLookAt( GLdouble eyex,GLdouble eyey,GLdouble eyez,GLdouble centerx,GLdouble centery,GLdouble centerz,GLdouble upx,GLdouble upy,GLdouble upz);
Defining a Frame(relative to another frame) • Need: • Origin • Vectors for X, Y, and Z axis of frame
Adding Orthogonal Constraint • We can get by with: • Origin • One axis direction and which way is up Z direction is negative of look direction. X is at right angles to Z and Up
Computing the Axis • Z = (eye – center) / | eye – center | • X = (up Z) / | up Z | • Y = Z X z x y Right-hand rule?
Making a frame the reference coordinate system • Move the center to the origin • Rotate the frame axis onto (1,0,0), (0,1,0), (0,0,1)
Moving the center to the origin glTranslated(-eyex, -eyey, -eyez);
Rotating arbitrary axes v1,v2,v3 onto (1,0,0), (0,1,0), (0,0,1) • Notice: v1,v2,v3 must be orthogonal to each other
Suppose we have three ortho-normal vectors… • v1,v2,v3 • Let’s build a matrix like this: • This will rotate: v1 onto the x axis, v2 onto the y axis, v3 onto the z axis
Introduction to 3D viewing • 3D is just like taking a photograph!
Viewing Transformation • Position and orient your camera
Projection Transformation • Control the “lens” of the camera • Project the object from 3D world to 2D screen
(ex, ey, ez) world view up vector (Up_x, Up_y, Up_z) (cx, cy, cz) Viewing Transformation (2) • Important camera parameters to specify • Camera (eye) position (Ex,Ey,Ez) in world coordinate system • Center of interest (coi) (cx, cy, cz) • Orientation (which way is up?) View-up vector (Up_x, Up_y, Up_z)
u v n y Eye coordinate frame coi world x z Viewing Transformation (3) • Transformation? • Form a camera (eye) coordinate frame • Transform objects from world to eye space
world Viewing Transformation (4) • Eye space? • Transform to eye space can simplify many downstream operations (such as projection) in the pipeline (1,0,0) (0,1,0) u v (0,0,1) n y (0,0,0) coi x z
Viewing Transformation (5) • In OpenGL: - gluLookAt (Ex, Ey, Ez, cx, cy, cz, Up_x, Up_y, Up_z) - The view up vector is usually (0,1,0) - Remember to set the OpenGL matrix mode to GL_MODELVIEW first
Viewing Transformation (6) void display() { glClear(GL_COLOR_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0,0,1,0,0,0,0,1,0); display_all(); // your display routine }
Suppose we have three orthogonal vectors… • v1,v2,v3 • Let’s build a matrix like this: • This will rotate: v1 onto the x axis, v2 onto the y axis, v3 onto the z axis
My Version of gluLookAt() void mygluLookAt(Point3 eye, Point3 center, Point3 up) { Point3 cameraZ = Normalize( eye – center ); // v3 Point3 cameraX = Normalize( Cross(up, cameraZ) ); // v1 Point3 cameraY = Cross( cameraZ, cameraX ); // v2 GLdouble m[16]; // Fill the matrix in row by row m[0] = cameraX.X; m[4] = cameraX.Y; m[8] = cameraX.Z; m[12] = 0.0; m[1] = cameraY.X; m[5] = cameraY.Y; m[9] = cameraY.Z; m[13] = 0.0; m[2] = cameraZ.X; m[6] = cameraZ.Y; m[10] = cameraZ.Z; m[14] = 0.0; m[3] = m[7] = m[11] = 0.0; m[15] = 1.0; glMultMatrixd( m ); glTranslated( -eye.X, -eye.Y, -eye.Z ); } Order of transformations!
Messing with the camera • What if I want to PAN the camera? • We need to define “PAN” • There are two possibilities • Crab • Pan
Panning • Suppose we pan around the camera Y axis • This is NOT “up” in world space. • We need to change the lookAt point.
Operations on Points in Space • LookAt is a point in space • Need these transformation: • Translate by –eye • Rotate frame onto axis (using some M) • Rotate around Y by pan angle • Inverse rotate M • Translate by eye • PP=T(eye) MT RY(q) M T(-eye)
Easier #1 • Just replace the matrix using gluLookAt. • Problems?
Easier #2 • The first 2 operations are already what is done to set the camera up: • M T(-eye) • We just need to add a rotate after this is done. • Implies we want to pre-multiply by a rotation matrix.
Easier #2 • Steps: • Read out the current matrix. • Set the matrix to the identity matrix. • Rotate about the y-axis the amount we want to pan. • Post-multiply by the matrix read out in step #1.
Eliot Lash, 2007 (from Wikipedia.org – Camera dolly) Camera Controls • Tilt • Roll • Dolly • Boom • Zoom (same as dolly?) • General camera (or entity) movement and the user interface / control.
Stationary 2 degrees of freedom + zoom QuicktimeVR Camera Controls
Mimic holding an object in your hand. OpenInventor’s Examiner Viewer Used in IRIS Explorer Used in modeling and scientific visualization. Examiner Image courtesy of NAG
Camera specified using Euler angles and position. Many possible control strategies Acceleration / Deceleration Flying
Camera models in games • Many different approaches • Flying model, with a camera pan, tilt according to the mouse position. • Orthographic view with simple translations (occasionally a examiner) • Cinematic camera with view-oriented dolly (look with mouse, move in camera look-at direction with keyboard).
Software Engineering • Define a well-encapsulated Camera class or base class. • Separate the control of the camera from the camera object. • Separate the mouse / keyboard handling from the control as much as possible. • I will share my Camera classes next week.