Top Banner
1 91.427 Computer Graphics I, Fall 2010 OpenGL Transformations
23
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: 1 91.427 Computer Graphics I, Fall 2010 OpenGL Transformations.

191.427 Computer Graphics I, Fall 2010

OpenGL Transformations

Page 2: 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

Page 3: 1 91.427 Computer Graphics I, Fall 2010 OpenGL Transformations.

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

Page 4: 1 91.427 Computer Graphics I, Fall 2010 OpenGL Transformations.

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

Page 5: 1 91.427 Computer Graphics I, Fall 2010 OpenGL Transformations.

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

Page 6: 1 91.427 Computer Graphics I, Fall 2010 OpenGL Transformations.

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.

Page 7: 1 91.427 Computer Graphics I, Fall 2010 OpenGL Transformations.

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

Page 8: 1 91.427 Computer Graphics I, Fall 2010 OpenGL Transformations.

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

Page 9: 1 91.427 Computer Graphics I, Fall 2010 OpenGL Transformations.

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)

Page 10: 1 91.427 Computer Graphics I, Fall 2010 OpenGL Transformations.

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

Page 11: 1 91.427 Computer Graphics I, Fall 2010 OpenGL Transformations.

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)

Page 12: 1 91.427 Computer Graphics I, Fall 2010 OpenGL Transformations.

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()

Page 13: 1 91.427 Computer Graphics I, Fall 2010 OpenGL Transformations.

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

Page 14: 1 91.427 Computer Graphics I, Fall 2010 OpenGL Transformations.

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

Page 15: 1 91.427 Computer Graphics I, Fall 2010 OpenGL Transformations.

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

Page 16: 1 91.427 Computer Graphics I, Fall 2010 OpenGL Transformations.

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

Page 17: 1 91.427 Computer Graphics I, Fall 2010 OpenGL Transformations.

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

Page 18: 1 91.427 Computer Graphics I, Fall 2010 OpenGL Transformations.

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

Page 19: 1 91.427 Computer Graphics I, Fall 2010 OpenGL Transformations.

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

Page 20: 1 91.427 Computer Graphics I, Fall 2010 OpenGL Transformations.

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)

Page 21: 1 91.427 Computer Graphics I, Fall 2010 OpenGL Transformations.

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

Page 22: 1 91.427 Computer Graphics I, Fall 2010 OpenGL Transformations.

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

Page 23: 1 91.427 Computer Graphics I, Fall 2010 OpenGL Transformations.

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