1 91.427 Computer Graphics I, Fall 2010 OpenGL Transformations.
-
Upload
marcia-chase -
Category
Documents
-
view
230 -
download
0
Transcript of 1 91.427 Computer Graphics I, Fall 2010 OpenGL Transformations.
291.427 Computer Graphics I, Fall 2010
Objectives
•Learn how to carry out transformations in OpenGL Rotation Translation Scaling
•Introduce OpenGL matrix modes Model-view Projection
391.427 Computer Graphics I, Fall 2010
OpenGL Matrices
•In OpenGL matrices are part of the state•Multiple types
Model-View (GL_MODELVIEW) Projection (GL_PROJECTION) Texture (GL_TEXTURE) (ignore for now) Color(GL_COLOR) (ignore for now)
•Single set of functions for manipulation•Select which to manipulate by
glMatrixMode(GL_MODELVIEW);glMatrixMode(GL_PROJECTION);
491.427 Computer Graphics I, Fall 2010
Current Transformation Matrix (CTM)•Conceptually: 4 x 4 homogeneous coordinate matrix, the current transformation matrix (CTM)
part of stateapplied to all vertices passing down
pipeline•CTM defined in user program
and loaded into transformation unit
CTMvertices vertices
p p’ = CpC
591.427 Computer Graphics I, Fall 2010
CTM operations
•CTM altered by loading new / postmutiplication
Load identity matrix: C ILoad arbitrary matrix: C M
Load translation matrix: C TLoad rotation matrix: C RLoad scaling matrix: C S
Postmultiply by arbitrary matrix: C CMPostmultiply by translation matrix: C CTPostmultiply by rotation matrix: C C RPostmultiply by scaling matrix: C C S
691.427 Computer Graphics I, Fall 2010
Rotation about a Fixed Point
Start with identity matrix: C IMove fixed point to origin: C CTRotate: C CRMove fixed point back: C CT -1
Result: C = TR T –1 which is backwards.
This result is consequence of doing postmultiplications.Let’s try again.
791.427 Computer Graphics I, Fall 2010
Reversing the Order
We want C = T –1 R T so we must do the operations in the following order
C IC CT -1
C CRC CT
Each operation corresponds to one function call in program
Note that last operation specified is first executedDoubts? Use parentheses to disambiguate
891.427 Computer Graphics I, Fall 2010
CTM in OpenGL
•OpenGL has model-view and projection matrix in pipeline
concatenated to form CTM•Can manipulate each by first setting correct matrix mode
991.427 Computer Graphics I, Fall 2010
Rotation, Translation, Scaling
glRotatef(theta, vx, vy, vz)
glTranslatef(dx, dy, dz)
glScalef( sx, sy, sz)
glLoadIdentity()
Load identity matrix:
Multiply on right:
theta in degrees, (vx, vy, vz) define axis of rotation
Each has float (f) and double (d) format (glScaled)
1091.427 Computer Graphics I, Fall 2010
Example
•Rotation about z axis by 30 degrees with fixed point of (1.0, 2.0, 3.0)
•Remember that last matrix specified is first applied
glMatrixMode(GL_MODELVIEW);glLoadIdentity();glTranslatef(1.0, 2.0, 3.0);glRotatef(30.0, 0.0, 0.0, 1.0);glTranslatef(-1.0, -2.0, -3.0);
1191.427 Computer Graphics I, Fall 2010
Arbitrary Matrices
•Can load and multiply by matrices defined in application program
•Matrix m is one dimension array of 16 elements = components of desired 4 x 4 matrix stored by columns
•In glMultMatrixf, m multiplies existing matrix on right
glLoadMatrixf(m)glMultMatrixf(m)
1291.427 Computer Graphics I, Fall 2010
Matrix Stacks
•Often want to save xformation matrices for use later Traversing hierarchical data structures (Chapter 10)
Avoiding state changes when executing display lists
•OpenGL maintains stacks for each type of matrix Access present type (as set by glMatrixMode) byglPushMatrix()
glPopMatrix()
1391.427 Computer Graphics I, Fall 2010
Reading Back Matrices
•Can also access matrices (and other parts of state) by query functions
•For matrices, use as
glGetIntegervglGetFloatvglGetBooleanvglGetDoublevglIsEnabled
double m[16];glGetFloatv(GL_MODELVIEW, m);
1491.427 Computer Graphics I, Fall 2010
Using Transformations
•Example: use idle function to rotate cubemouse function to change dir. of rot.
•Start with program that draws cube (colorcube.c) in standard way Centered at origin Sides aligned with axes Will discuss modeling later
1591.427 Computer Graphics I, Fall 2010
main.c
void main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(500, 500); glutCreateWindow("colorcube"); glutReshapeFunc(myReshape); glutDisplayFunc(display); glutIdleFunc(spinCube); glutMouseFunc(mouse); glEnable(GL_DEPTH_TEST); glutMainLoop();}
1691.427 Computer Graphics I, Fall 2010
Idle and Mouse callbacks
void spinCube() {theta[axis] += 2.0;if( theta[axis] > 360.0 ) theta[axis] -= 360.0;glutPostRedisplay();
}
void mouse(int btn, int state, int x, int y){ if(btn==GLUT_LEFT_BUTTON && state == GLUT_DOWN) axis = 0; if(btn==GLUT_MIDDLE_BUTTON && state == GLUT_DOWN) axis = 1; if(btn==GLUT_RIGHT_BUTTON && state == GLUT_DOWN) axis = 2;}
1791.427 Computer Graphics I, Fall 2010
Display callback
void display(){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glRotatef(theta[0], 1.0, 0.0, 0.0); glRotatef(theta[1], 0.0, 1.0, 0.0); glRotatef(theta[2], 0.0, 0.0, 1.0); colorcube(); glutSwapBuffers();}
Note: fixed form of callbacks ==> variables such as theta and axis must be defined as globals
Camera information is in standard reshape callback
1891.427 Computer Graphics I, Fall 2010
Using the Model-view Matrix
•In OpenGL model-view matrix used to Position camera
•Can be done by rotations and translations but often easier to use gluLookAt
Build models of objects
•Projection matrix used to define view volume, and select camera lens
1991.427 Computer Graphics I, Fall 2010
Model-view and Projection Matrices
•Both manipulated by same functions•But have to be careful because •incremental changes always made by postmultiplication E.g., rotating model-view and projection matrices by same matrix not equivalent operations
Postmultiplication of model-view matrix equivalent to premultiplication of projection matrix
2091.427 Computer Graphics I, Fall 2010
Smooth Rotation
•Practical standpoint: often want to use transformations to move and reorient object smoothly
Problem: find sequence of model-view matrices M0, M1,….., Mn so that when applied successively to one or more objects see smooth transition
•For orientating object, can use the fact that every rotation corresponds to part of great circle on sphere
Find axis of rotation and angle Virtual trackball (see text)
2191.427 Computer Graphics I, Fall 2010
Incremental Rotation
•Consider two approaches For sequence of rotation matrices
R0, R1,….., Rn , • find Euler angles for each • and use Ri= Riz Riy Rix
•Not very efficient
Use final positions to determine axis and angle of rotation
then increment only angle•Quaternions can be more efficient than either
2291.427 Computer Graphics I, Fall 2010
Quaternions
•Extension of imaginary numbers from 2- to 3-d•Requires one real and three imaginary
components i, j, k
•Quaternions can express rotations on sphere smoothly and efficiently
•Process: Model-view matrix quaternion Carry out operations with quaternions Quaternion Model-view matrix
q = q0 + q1i +q2j +q3k
2391.427 Computer Graphics I, Fall 2010
Interfaces
•One major problem in interactive computer graphics:
•how to use 2-d devices E.g., mouse
•to interface with 3-d objects•Example: how to form instance matrix?•Some alternatives
Virtual trackball 3D input devices
• E.g., spaceball
Use areas of screen• Distance from center controls angle, position, scale
depending on mouse button depressed