Professional Documents
Culture Documents
2D transformations
Jack van Wijk
TU/e
Overview
• Why transformations?
• Basic transformations:
– translation, rotation, scaling
• Combining transformations
– homogenous coordinates, transform. Matrices
instantiation…
world
train animation…
viewing…
wheel
modelling…
image
Why transformation?
• Model of objects
world coordinates: km, mm, etc.
Hierarchical models::
human = torso + arm + arm + head + leg + leg
arm = upperarm + lowerarm + hand …
• Viewing
zoom in, move drawing, etc.
• Animation
Translation
Translate over vector (tx, ty) y
H&B 7-1:220-222
Translation polygon
Translate polygon: y
H&B 7-1:222-223
Scaling
Schale with factor sx and sy: y
x’= sx x, y’= sy y P’
or P
Q’
P' SP, with Q x
x' sx 0 x
P' , S and P
y' 0 s y y
H&B 7-1:224-225
Scaling with respect to a point F
Scale with factors sx and sy: y P’
Px’= sx Px, Py’= syPy P
With respect to F: PF Q’
Px’ Fx = sx (Px Fx), F Q
or
Px’= Fx + sx (Px Fx),
Py’= Fy + sy (Py Fy)
H&B 7-1:224-225
Transformations
• Translate with V: y
S
T=P+V
R T
• Schale with factor sx = sy =s:
P
S = sP
x
• Rotate over angle
R’x = cos Px sin Py
R’y = sin Px + cos Py
H&B 7-2:225-228
Transformations…
• Messy!
• Transformations with respect to points:
even more messy!
• How to combine transformations?
H&B 7-2:225-228
Homogeneous coordinates 1
• Uniform representation of translation,
rotation, scaling
• Uniforme representation of points and
vectors
• Compact representation of sequence of
transformations
H&B 7-2:225-228
Homogeneous coordinaten 2
• Add extra coordinate:
P = (px , py , ph) or
x = (x, y, h)
• Cartesian coordinates: divide by h
x = (x/h, y/h)
• Points: h = 1 (for the time being…),
vectors: h = 0
H&B 7-2:225-228
Translation matrix
Translation :
x' 1 0 t x x
y ' 0 1 t y y
1 0 0 1 1
or
P ' T(t x , t y )P
H&B 7-2:225-228
Rotation matrix
Rotation :
x' cos sin 0 x
y ' sin cos 0 y
1 0 0 1 1
or
P' R ( )P
H&B 7-2:225-228
Scaling matrix
Scaling :
x' s x 0 0 x
y' 0 sy 0 y
1 0 0 1 1
or
P ' S( s x , s y ) P
H&B 7-2:225-228
Inverse transformations
Translation :
T -1 (t x , t y ) T(t x ,t y )
Rotation :
R -1 ( ) R ( )
Scaling :
1 1 1
S ( s x , s y ) S( , )
sx s y
H&B 7-3:228
Combining transformations 1
P' M1P first transformation...
P '' M 2 P ' second transformation...
Combined :
''
P M 2 (M 1 P)
M 2 M1P
MP with M M 2 M 1
H&B 7-4:228-229
Combining transformations 2
P ' T(t1x , t1 y )P first translation
P '' T(t 2 x , t 2 y )P ' second translation
Combined :
P '' T(t 2 x , t 2 y )T(t1x , t1 y )P
1 0 t 2 x 1 0 t1x 1 0 t1x t 2 x
0 1 t 2 y 0 1 t1 y P 0 1 t1 y t 2 y P
0 0 1 0 0 1 0 0 1
T(t1x t 2 x , t1x t 2 y )P
H&B 7-4:229
Combining transformations 3
Composite translations :
T(t 2 x , t 2 y )T(t1x , t1 y ) T(t1x t 2 x , t1x t 2 y )
Composite rotations :
R ( 2 ) R (1 ) R (1 2 )
Composite scaling :
S( s2 x , s2 y )S( s1x , s1 y ) S( s1x s2 x , s1 y s2 y )
H&B 7-4:229
Rotation around a point 1
Rotate over angle around point R :
1) Translate such that R coincides with origin;
2) Rotate over angle around origin;
3) Translate back.
1) 2) 3)
H&B 7-4:229-230
Rotation around a point 2
Rotate over angle around point R :
1) P ' T( Rx , R y )P
'' '
2) P R( )P
3) P ''' T( Rx ,R y )P ''
R
1) 2) 3)
H&B 7-4:229-230
Rotation around point 3
1) P ' T( Rx , R y )P
2) P '' R( )P ' R( )T( Rx , R y )P
3) P ''' T( Rx ,R y )P ''
T( Rx ,R y )R( )P '
T( Rx ,R y )R( )T( Rx , R y )P
1) 2) 3)
H&B 7-4:229-230
Rotation around point 4
1 - 3) P ''' T( Rx ,R y )R( )T( Rx , R y )P
or
cos sin Rx (1 cos ) R y sin
'''
P sin cos R y (1 cos ) Rx sin P
0 0 1
1) 2) 3)
H&B 7-4:229-230
Scaling w.r.t. point 1
Scale with factors s x and s x w.r.t. point F :
1) Translate such that F coincides with origin;
2) Schale w.r.t. origin;
3) Translate back again.
1) 2) 3)
H&B 7-4:230-231
Scaling w.r.t.point 2
Schale w.r.t. point F :
1) P ' T( Fx , Fy )P
2) P '' S( s x , s y )P '
3) P ''' T( Fx ,Fy )P ''
1) 2) 3)
H&B 7-4:230-231
Scaling w.r.t.point 3
1 - 3) P ''' T( Fx ,Fy )S( s x , s y )T( Fx , Fy )P
or
sx 0 Fx (1 s x )
'''
P 0 sy Fy (1 s y ) P
0 0 1
F
1) 2) 3)
H&B 7-4:230-231
Scale in other directions 1
Scale with factors s1 and s2 w.r.t. rotated frame :
1) Rotate such that frame coincides with standard xy - frame;
2) Scale w.r.t. origin;
3) Rotate back again.
1) 2) 3)
H&B 7-4:230-231
Scale in other directions 2
Scale in other direction :
1) P ' R( )P
2) P '' S( s1 , s2 )P '
3) P ''' R( )P ''
1) 2) 3)
H&B 7-4:230-231
Scale in other directions 3
1 - 3) P ''' R( )S( s1 , s2 )R( )P
or
s1 cos 2 s2 sin 2 ( s2 s1 ) cos sin 0
'''
P ( s2 s1 ) cos sin s1 sin 2 s2 cos 2 0 P
0 0 1
1) 2) 3)
H&B 7-4:230-231
Order of transformations 1
Rotation, translation… Translation, rotation…
y’
y’’ y’’
x’’ x’’
’ y y
y
x’
x’
x x
Matrix multiplication does not xcommute.
' ' R(30)T(2,3 ) x
x ' ' T(2,3)R(30 ) x
The order of transformations makes a difference!
H&B 7-4:232
Order of transformations 2
• Pre-multiplication:
P’ = M n M n-1…M 2 M 1 P
Transformation M n in global coordinates
• Post-multiplication:
P’ = M 1 M 2…M n-1 M n P
Transformation M n in local coordinates: the
coordinate system after application of
M 1 M 2…M n-1
H&B 7-4:232
Order of transformations 3
OpenGL: glRotate, glScale, etc.:
• Post-multiplication of current
transformation matrix
• Always transformation in local coordinates
• Global coordinate version: read in reverse
order
H&B 7-4:232
Order of transformations 4
Local transformations: Global transformations:
’ y’
y’ y’’
x’’ x’’
y y
y’
x’
x’
x x
x' ' R(30)T(2,3 )x
Local trafo glTranslate(…); Global trafo
interpretation glRotate(…); interpretation
H&B 7-4:232
Matrices in general
rotation and scaling
translation
H&B 7-4:233-235
Direct construction of matrix
If you know the target frame:
Construct matrix directly.
y
Define shape in nice local v
u,v coordinates, use matrix u
transformation to put it B
in x,y space. A
T
x
H&B 7-4:233-235
Direct construction of matrix
If you know the target frame:
Construct matrix directly.
y
P ' Au Bv T , or
v
x u
y A B T v , or
u
B
1 1 A
x Ax Bx Tx u T
y Ay B y T y v x
1 0 0 1 1
H&B 7-4:233-235
Rigid body transformation
only rotation
P ' MP , of translation
x rxx rxy trx u y
y ryx ryy try v u
v
1 0 0 1 1
B
A
T
rxx rxy x
: orthonormal submatrix
ryx ryy
rxx rxy
A and B , | A | 1, | B | 1, A B 0
ryx ryy H&B 7-4:233-235
Other 2D transformations
• Reflection
• Shear
H&B 7-4:240
Reflection over axis
Reflext over x-axis: y
x’= x, y’= y
or
1 0 0 x
P' 0 1 0 P
0 0 1
H&B 7-4:240-242
Reflect over origin
Reflect over origin: y
Find (x’,y’)-coordinates. y’
x’
(x0, y0)
Reverse route as x
object transformaties.
H&B 7-8:246-248
Transformations coordinates
Given (x,y)-coordinates, y
Find (x’,y’)-coordinates. y’
x’
(x0, y0)
Example: user points at x
(x,y), what’s the position
in local coordinates?
H&B 7-8:246-248
Transformations coordinates
Given X: (x,y)-coordinates, y
Find X’: (x’,y’)-coordinates.
Standard: y’
X=MX’ (object trafo:
from local to global) x’
Here: (x0, y0)
X’=M-1X (from global to local) x
H&B 7-8:246-248
Transformations coordinates
Given X: (x,y)-coordinates, y
Find X’: (x’,y’)-coordinates.
Here: y’
X’=M-1X (from global to local)
Approach 1: x’
(x0, y0)and invert
- Determine “standard matrix” M (from local to global coordinates)
x
H&B 7-8:246-248
Transformations coordinates
Given X: (x,y)-coordinates, y
Find X’: (x’,y’)-coordinates.
Here: y’
X’=M-1X (from global to local)
x’
Approach 2:
(x0, y0)of usual).
- construct transformation that maps local frame to global (reverse
x
H&B 7-8:246-248
Transformations coordinates
Given X: (x,y)-coordinates, y
Find X’: (x’,y’)-coordinates.
Here: y’
X’=M-1X (from global to local)
Approach 2: x’
1.Translate (x0, y0) to origin; (x0, y0)
2.Rotate x’-axis to x-axis. x
H&B 7-8:246-248
Transformations coordinates
Given X: (x,y)-coordinates, y
Find X’: (x’,y’)-coordinates.
y’
Here:
X’=M-1X (from global to local) x’
Approach 2: (x0, y0)
M-1 = T(x0, y0) R() x
H&B 7-8:246-248
OpenGL 2D transformations 1
Internally:
• Coordinates are four-element row vectors
• Transformations are 44 matrices
H&B 7-9:248-253
OpenGL 2D transformations 2
OpenGL maintains two matrices:
• GL_PROJECTION
• GL_MODELVIEW
H&B 7-9:248-253
OpenGL 2D transformations 3
Initializing the matrix to I:
• glLoadIdentity();
Rotate over theta degrees (!) around axis [vx, vy, vz]:
glRotate*(theta, vx, vy, vz);
Up to 3D!