• 沒有找到結果。

OpenGL Transformations

N/A
N/A
Protected

Academic year: 2022

Share "OpenGL Transformations"

Copied!
23
0
0

加載中.... (立即查看全文)

全文

(1)

OpenGL Transformations

Ed Angel

Professor of Computer Science, Electrical and Computer

Engineering, and Media Arts

University of New Mexico

(2)

Objectives

• Learn how to carry out transformations in OpenGL

- Rotation - Translation - Scaling

• Introduce OpenGL matrix modes

- Model-view

- Projection

(3)

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 manipulated by

-glMatrixMode(GL_MODELVIEW);

-glMatrixMode(GL_PROJECTION);

(4)

Current Transformation Matrix (CTM)

• Conceptually there is a 4 x 4 homogeneous coordinate matrix, the current transformation matrix (CTM) that is part of the state and is applied to all vertices that pass down the pipeline

• The CTM is defined in the user program and loaded into a transformation unit

p C p’=Cp

(5)

CTM operations

• The CTM can be altered either by loading a new CTM or by postmutiplication

Load an identity matrix: C ← I Load an arbitrary matrix: C ← M Load a translation matrix: C ← T Load a rotation matrix: C ← R Load a scaling matrix: C ← S

Postmultiply by an arbitrary matrix: C ← CM

Postmultiply by a translation matrix: C ← CT

Postmultiply by a rotation matrix: C ← C R

Postmultiply by a scaling matrix: C ← C S

(6)

Rotation about a Fixed Point

Start with identity matrix: C ← I

Move fixed point to origin: C ← CT Rotate: C ← CR

Move fixed point back: C ← CT -1

Result: C = TR T –1 which is backwards.

This result is a consequence of doing postmultiplications.

Let’s try again.

(7)

Reversing the Order

We want C = T –1 R T

so we must do the operations in the following order C ← I

C ← CT -1 C ← CR C ← CT

Each operation corresponds to one function call in the program.

Note that the last operation specified is the first

executed in the program

(8)

CTM in OpenGL

• OpenGL has a model-view and a

projection matrix in the pipeline which are concatenated together to form the CTM

• Can manipulate each by first setting the

correct matrix mode

(9)

Rotation, Translation, Scaling

glRotatef(theta, vx, vy, vz)

glTranslatef(dx, dy, dz) glScalef( sx, sy, sz)

glLoadIdentity() Load an identity matrix:

Multiply on right:

theta in degrees, (vx, vy, vz) define axis of rotation

Each has a float (f) and double (d) format (glScaled)

(10)

Example

• Rotation about z axis by 30 degrees with a fixed point of (1.0, 2.0, 3.0)

• Remember that last matrix specified in the program is the 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);

(11)

Arbitrary Matrices

• Can load and multiply by matrices defined in the application program

• The matrix m is a one dimension array of 16 elements which are the components of the desired 4 x 4 matrix stored by columns

• In glMultMatrixf , m multiplies the existing matrix on the right

glLoadMatrixf(m)

glMultMatrixf(m)

(12)

Matrix Stacks

• In many situations we want to save transformation 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) by

glPushMatrix()

(13)

Reading Back Matrices

• Can also access matrices (and other parts of the state) by query functions

• For matrices, we use as

glGetIntegerv glGetFloatv glGetBooleanv glGetDoublev glIsEnabled

double m[16];

glGetFloatv(GL_MODELVIEW, m);

(14)

Using Transformations

• Example: use idle function to rotate a cube and mouse function to change direction of rotation

• Start with a program that draws a cube

( colorcube.c ) in a standard way - Centered at origin

- Sides aligned with axes

- Will discuss modeling in next lecture

(15)

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

}

(16)

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)

(17)

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 that because of fixed from of callbacks, variables

such as theta and axis must be defined as globals

Camera information is in standard reshape callback

(18)

Using the Model-view Matrix

• In OpenGL the model-view matrix is used to

- Position the camera

• Can be done by rotations and translations but is often easier to use gluLookAt

- Build models of objects

• The projection matrix is used to define the

view volume and to select a camera lens

(19)

Model-view and Projection Matrices

• Although both are manipulated by the same functions, we have to be careful because

incremental changes are always made by postmultiplication

- For example, rotating model-view and projection

matrices by the same matrix are not equivalent

operations. Postmultiplication of the model-view

matrix is equivalent to premultiplication of the

projection matrix

(20)

Smooth Rotation

• From a practical standpoint, we are often want to use transformations to move and reorient an object smoothly

- Problem: find a sequence of model-view

matrices M 0 ,M 1 ,…..,M n so that when they are applied successively to one or more objects we see a smooth transition

• For orientating an object, we can use the fact

that every rotation corresponds to part of a

great circle on a sphere

(21)

Incremental Rotation

• Consider the two approaches

- For a sequence of rotation matrices

R 0 ,R 1 ,…..,R n , find the Euler angles for each and use R i = R iz R iy R ix

• Not very efficient

- Use the final positions to determine the axis and angle of rotation, then increment only the angle

• Quaternions can be more efficient than either

(22)

Quaternions

• Extension of imaginary numbers from two to three dimensions

• 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

q=q 0 +q 1 i+q 2 j+q 3 k

(23)

Interfaces

• One of the major problems in interactive computer graphics is how to use two-

dimensional devices such as a mouse to interface with three dimensional obejcts

• Example: how to form an instance matrix?

• Some alternatives - Virtual trackball

- 3D input devices such as the spaceball - Use areas of the screen

• Distance from center controls angle, position,

scale depending on mouse button depressed

參考文獻

相關文件

In this chapter we develop the Lanczos method, a technique that is applicable to large sparse, symmetric eigenproblems.. The method involves tridiagonalizing the given

One of the technical results of this paper is an identifi- cation of the matrix model couplings ti(/x) corresponding to the Liouville theory coupled to a

Courtesy: Ned Wright’s Cosmology Page Burles, Nolette & Turner, 1999?. Total Mass Density

However, it is worthwhile to point out that they can not inherit all relations between matrix convex and matrix monotone functions, since the class of contin- uous

Proof. The proof is complete.. Similar to matrix monotone and matrix convex functions, the converse of Proposition 6.1 does not hold. 2.5], we know that a continuous function f

It is useful to augment the description of devices and services with annotations that are not captured in the UPnP Template Language. To a lesser extent, there is value in

Pursuant to the service agreement made between the Permanent Secretary for Education Incorporated (“Grantor”) and the Grantee in respect of each approved programme funded by the

* All rights reserved, Tei-Wei Kuo, National Taiwan University, 2005..