Computer Graphics 3D Transformations
3D Translation • Remembering 2D transformations -> 3x3 matrices, take a wild guess what happens to 3D transformations. T=(tx, ty, tz)
3D Scale S=(sx, sy, sz)
3D Rotations What does a rotation in 3D mean? Q: How do we specify a rotation? R=(rx, ry, rz, ) A: We give a vector to rotate about, and a theta that describes how much we rotate. Q: Since 2D is sort of like a special case of 3D, what is the vector we’ve been rotating about in 2D?
Rotations about the Z axis What do you think the rotation matrix is for rotations about the z axis? R=(0,0,1,)
Rotations about the X axis Let’s look at the other axis rotations R=(1,0,0,)
Rotations about the Y axis R=(0,1,0,)
Rotations for an arbitrary axis u Steps: 1. Normalize vector u 2. Compute 3. Compute 4. Create rotation matrix
Vector Normalization • Given a vector v, we want to create a unit vector that has a magnitude of 1 and has the same direction as v. Let’s do an example.
Computing the Rotation Matrix • 1. Normalize u ( the vector we are rotating around ) • 2. Compute Rx(x) • 3. Compute Ry(y) • 4. Generate Rotation Matrix
Rotations for an arbitrary axis • Unit vectors are made of direction cosines:
Axis-Angle Rotations in OpenGL glRotatef( angle, x, y, z);
Euler Angles More intuitive: represent rotations by 3 angles, one for each axis glRotatef(anglex,1,0,0); glRotatef(angley,0,1,0); glRotatef(anglez,0,0,1); Think: if we have a torus unstranformed at the origin, what will the torus look like if you have anglex=90, angley=90, and anglez=90 Transformed
Gimbal Lock Rotate around these Initial orientation (x=blue, y=green, z = red) How can we gain altitude here?
Gimbal Lock in OpenGL What is the problem here? glRotatef(anglex,1,0,0); glRotatef(angley,0,1,0); glRotatef(anglez,0,0,1);
Avoiding Gimbal Lock: Quaternions • Quaternions represent 3D rotations in 4D using imaginary numbers – a 4-tuple Q = (w,x,y,z) • Convert Angle-axis -> Quaternion • (,x,y,z) -> ( cos( /2), xsin(/2), ysin(/2), zsin(/2) ) • Why quaternions? • No gimbal lock • Smooth interpolation between rotations (for animation)
Quaternions • Quaternions have rules for multiplication, inversion, etc • See: http://www.j3d.org/matrix_faq/matrfaq_latest.html • Typical usage: • Convert from euler, matrix, or angle-axis • Do rotations • Convert to angle-axis or matrix
What is going on here? frame1 frame3 frame2
gluLookAt Orients and positions the “camera” gluLookat( eyex, eyey, eyez, centerx, centery, centerz, upx,upy, upz); eye – the position of the camera in world coordinates center – the camera is pointed at this point up – the direction defined to be up for the camera
u Cross Products Given two vectors, the cross product returns a vector that is perpendicular to the plane of the two vectors and with magnitude equal to the area of the parallelogram formed by the two vectors.
Let’s Examine the Camera • If I gave you a world, and said I want to “render” it from another viewpoint, what information do I have to give you? • Position • Which way we are looking • Which way is “up” • Aspect Ratio • Field of View • Near and Far
Camera View Right View Up View Normal View Direction
Camera View Up View Right What are the vectors?
Graphics Pipeline So Far Object Object Coordinates Transformation Object -> World World World Coordinates Projection Xform World -> Projection Normalize Xform & Clipping Projection -> Normalized Camera Projection Coordinates Viewport Normalized Coordinates Viewport Transform Normalized -> Device Screen Device Coordinates
Transformation World->Camera View Right View Up View Normal View Direction
Transformation World->Camera View Right = u View Up = V View Direction = -N