Geometric Transforms Changing coordinate systems
The plan Describe coordinate systems and transforms Introduce homogeneous coordinates Introduce numerical integration for animation Later: – camera transforms – physics – more on vectors and matrices
World Coordinates Objects exist in the world without need for coordinate systems But, describing their positions is easier with a frame of reference “ World ” or “ object-space ” or “ global ” coordinates
Screen vs World Coordinates Some objects only exist on the screen – mouse pointer, “ radar ” display, score, UI elements Screen coordinates typically 2D Cartesian – x, y Objects in the world also appear on the screen – need to project world coordinates to screen coordinates – camera transform
Coordinate Transforms A Cartesian coordinate system has three things: an origin – reference point measurements are taken from axes – canonical directions scale – meaning of units of distance
Types of transforms Translation – moving in a fixed position Rotation – changing orientation Scale – changing size All can be viewed either as affecting the model or as affecting the coordinate system
Changing coordinate systems Translation: changing the origin of the coordinate system (0,0) (5,13) (2,12)
Changing coordinate systems Rotation: changing the axes of the coordinate system (0,0) (5,5) (7,1)
Changing coordinate systems Scaling: changing the units of the coordinate system (0,0) (4,4) (8,8)
Matrix Transforms For "simplicity"s sake, we want to represent our transforms as matrix operations Why is this simple? – single type of operation for all transforms – IMPORTANT: collection of transforms can be expressed as a single matrix efficiency
Scaling If we express our 2D coordinates as (x,y), scaling by a factor a multiplies each coordinate: so (ax, ay) Can write as a matrix multiplication: a0 0b x y ax by =
Scaling Syntax Matrix.CreateScale( s ); – scalar argument s describes amount of scaling alternatively, Matrix.CreateScale( v ); – vector argument v describes scale amount in x y z
Rotation Similarly, rotating a point by an angle θ: – (x,y) (x cos θ - y sin θ, x sin θ + y cos θ) cos θ-sin θ sin θcos θ x y x cos θ – y sin θ x sin θ + y cos θ =
Rotation Syntax Matrix.CreateRotationZ(angle) Note, specify the axis about which the rotation occurs – also have CreateRotationX, CreateRotationY argument is angle of rotation, in radians
Translation Translating a point by a vector involves a vector addition: – (x,y) + (s,t) = (x+s, y+t)
Translation Translating a point by a vector involves a vector addition: – (x,y) + (s,t) = (x+s, y+t) Problem: cannot compose multiplications and additions into one operation
Coordinate Transforms Scaling: p ’ = Sp Rotation: p ’ = Rp Translation: p ’ = t + p Problem: Translation is treated differently.
Homogeneous Coordinates Add an extra coordinate w 2D point written (x,y,w) Cartesian coordinates of this point are (x/w, y/w) – w=0 represents points at infinity and should be avoided if representing location [Aside: w=0 also used to represent vector, e.g., normal] – in practice, usually have w=1
Translation now (x,y,1) + (s,t,0) = (x+s,y+t, 1) 10s 01t 001 x y 1 x+s y+t 1 =
Composing Translations 10s1s1 01t1t s2s2 01t2t s 1 +s 2 01t 1 +t =
Translation Syntax Matrix.CreateTranslation( v ); – vector v is the translation vector Also, Matrix.CreateTranslation( x, y, z); – x, y, z are scalars (floats)
Composing Transformations Rotation, scale, and translate are all matrix multiplications We can compose an arbitrary sequence of transformations into one matrix C = T 0 T 1 … T n-1 T n Remember – order matters In XNA, later transforms are added on the right
Kinds of Transformations Rigid transformations – composed of only rotations and translations – preserve distances between points Affine transformations – include scales – preserve parallelism of lines – distances and angles might change
More on Rotations R matrix we wrote allows rotation about origin Usually, origin and point of rotation do not coincide
More on Rotations Want to rotate about arbitrary point How to achieve this?
More on Rotations Want to rotate about arbitrary point How to achieve this? Composite transform – first translate to origin – next, rotate desired amount – finally, translate back – C = T -1 RT
More on Order of Operations AB != BA in general But, AB = BA if: – A is translation, B is translation – A is scale, B is scale – A is rotation, B is rotation – A is rotation, B is scale (that preserves aspect ratio) All in two dimensions, note Like transforms commute
ISROT ISROT: a mnemonic for the order of transformations – Identity: gets you started – Scale: change the size of your model – Rotation: rotate in place – Orbit: rotate about an external point first translate then rotate (about origin) – Translation: move to final position
3D transforms Translation same as in 2D – use 4D homogeneous coordinates x,y,z,w Scaling same as 2D For rotation, need to specify axis – unique in 2D, but different possibilities available in 3D – can represent any 3D rotation by a composition of rotations about axes
Transforming objects So far, talked about transforming points How about objects? Lines get transformed sensibly with transforms on endpoints Polygons same, mutatis mutandis
Hierarchical Models Many times, structures (and models) will be built as a hierarchy: Body Arm Other limbs... Hand Thumbother fingers...
Transforms on Hierarchies Transforms applied to nodes higher in the hierarchy are also applied to lower nodes – parent transforms propagate to children How to achieve this? Simple: multiply your transform with your parent's transform May want a stack for hierarchy management – push transform on descending – pop when current node finished
Transforms on Hierarchies pseudocode for computing final transform: applyWorld = myWorld * parentWorld; applyWorld is the final transform myWorld is the local transform parentWorld is the parent node's transform The power of matrix transforms! Complex hierarchical models can be expressed simply.
Moving objects Want to get things to move Can adjust transform parameters – translation amount – rotation, orbit angles Just incorporate changes into Update() Need to do this in a disciplined way
Speed position If we know – where an object started – how fast it is moving (and the direction) – and how much time has passed we can figure out where it is now x(t + dt) = x(t) + v(t)dt Numerical integration!
Euler integration Assumes constant speed within a timestep – still gives an answer if speed changes, but answer might be wrong x(t + dt) = x(t) + v(t)dt "Explicit integration" Most commonly used in graphics/game applications
Implementation Time available in Update as gameTime object.position += object.velocity * gameTime.ElapsedGameTime.TotalSeconds; – if speed expressed in distance units per second – assumes that position and velocity are vectors – may have some way of updating velocity physics, player control, AI,... Similar approach for angle updates (need angular velocity)
Recap How to use world transformations – scale, rotate, translate Use of homogeneous coordinates for translation Order of operations – ISROT Animation and Euler integration
Future lectures matrix and vector math camera transformations illumination and texture particle systems – linear physics