1 91.427 Computer Graphics I, Fall 2010 OpenGL Transformations.

23
1 91.427 Computer Graphics I, Fall 2010 OpenGL Transformations

Transcript of 1 91.427 Computer Graphics I, Fall 2010 OpenGL Transformations.

191.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