Download - Composing Transformations

Transcript
Page 1: Composing Transformations

Composing Transformations

Composing Transformations – the process of applying several transformations in succession to form one overall transformation

If we transform a point P using matrix M1 first, and then transform using M2, and then M3, we have:

(M3 x (M2 x (M1 x P ))) = M3 x M2 x M1 x P M

(pre-compute)

Page 2: Composing Transformations

Composing Transformation

Matrix multiplication is associative M3 x M2 x M1 = (M3 x M2) x M1 = M3 x (M2 x M1) Transformation products may not be commutative A x

B != B x A Some cases where A x B = B x A A B translation translation scaling scaling rotation rotation uniform scaling rotation

(sx = sy)

Page 3: Composing Transformations

Transformation order matters!

Example: rotation and translation are not commutative

Translate (5,0) and then Rotate 60 degree

OR

Rotate 60 degree and then translate (5,0)??

Rotate and then translate !!

Page 4: Composing Transformations

How OpenGL does it?

OpenGL’s transformation functions are meant to be used in 3D

No problem for 2D though – just ignore the z dimension

Translation: glTranslatef(d)(tx, ty, tz) ->

glTranslatef(d)(tx,ty,0) for 2D

Page 5: Composing Transformations

How OpenGL does it?

Rotation: glRotatef(d)(angle, vx, vy, vz) ->

glRotatef(d)(angle, 0,0,1) for 2D

x

y

z

(vx, vy, vz) – rotation axis

x

y

You can imagine z is pointing outof the slide

Page 6: Composing Transformations

OpenGL Transformation Composition

A global modeling transformation matrix (GL_MODELVIEW, called it M here) glMatrixMode(GL_MODELVIEW) The user is responsible to reset it if

necessary glLoadIdentity() -> M = 1 0 0 0 1 0 0 0 1

Page 7: Composing Transformations

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

Page 8: Composing Transformations

Transformation Pipeline

Object Local Coordinates

Object World Coordinates

Modeling transformation

Page 9: Composing Transformations

Something noteworthy

Very very noteworthy … OpenGL post-multiplies each new transformation

matrix M = M x Mnew

Example: perform translation, then rotation 0) M = Identity 1) translation T(tx,ty,0) -> M = M x T(tx,ty,0) 2) rotation R() -> M = M x R() 3) Now, transform a point P -> P’ = M x P = T(tx, ty, 0) x R() x P

Wrong!!!

Page 10: Composing Transformations

Example Revisit We want rotation and then translation Generate wrong results if you do:

glRotated(60,0,0,1);

glTranslated(5,0,0);

glBegin()

glTranslated(5,0,0); glRotate(60,0,0,1); glBegin()…

You need to specify the transformation in the opposite order!!

Page 11: Composing Transformations

How Strange …

OpenGL has its reason … It wants you to think of transformation

in a different way Instead of thinking of transforming the

object in a fixed global coordinate system, you should think of transforming an object as moving (transforming) its local coordinate system

Page 12: Composing Transformations

When using OpenGL, we need to think of object transformations as moving (transforming) its local coordinate frame

All the transformations are performed relative to the current coordinate frame origin and axes

OpenGL Transformation

Page 13: Composing Transformations

Translate Coordinate Frame

Translate (3,3)?

Page 14: Composing Transformations

Translate Coordinate Frame (2)

Translate (3,3)?

Page 15: Composing Transformations

Rotate Coordinate Frame

Rotate 30 degree?

30 degree

Page 16: Composing Transformations

Scale Coordinate Frame

Scale (0.5,0.5)?

Page 17: Composing Transformations

Compose Transformations

(7,9)

45o

Answer:

1. Translate(7,9)2. Rotate 453. Scale (2,2)

Transformations?

Page 18: Composing Transformations

Another example

(5,5)

60o

How do you transform from C1 to C2?

Translate (5,5) and then Rotate (60)

OR

Rotate (60) and then Translate (5,5) ???

Answer: Translate(5,5) and then Rotate (60)

C1

C2

Page 19: Composing Transformations

Another example (cont’d)

60o

If you Rotate(60) and then Translate(5,5) …

60o

55

C1 C2

You will be translated (5,5)relative to C2!!

Page 20: Composing Transformations

Transform Objects

What does coordinate frame transformations have to do with object transformations? You can view transformations as tying

the object to a local coordinate frame and moving that coordinate frame

Page 21: Composing Transformations

Put it all together

When you use OpenGL … Think of transformation as moving

coordinate frames Call OpenGL transformation functions in

that order OpenGL will actually perform the

transformations in the reverse order Everything will be just right!!!