CS-460/560, Week 12-B Spring, 1998 R. Eckert 3-D GEOMETRIC TRANSFORMATIONS We want to be able to move and manipulate objects in 3-D space. For example, we might want to translate an object, rotate an object about a given axis, or scale an object. These are examples of three dimensional geometric transformations. Just as we were able to implement such transformations in two dimensions by using homogeneous coordinates and matrices, we will be able to do the same in 3-D. TRANSLATIONS-- We wish to translate point P = (x,y,z) by a 3-D translation vector T = (tx, ty, tz) giving a new point P' = (x',y',z'). The component equations are: x' = x + tx y' = y + ty z' = z + tz We define a homogeneous representation of a vectors P and P' whose components in 3-D Cartesian space are (x,y,z) and (x',y',z') as follows: |x| |x'| P = |y| and P' = |y'| |z| |z'| |1| |1 | We can than represent the translation by the following matrix equation: P' = T * P where T is the following 4 X 4 homogeneous translation matrix: | 1 0 0 tx | T = | 0 1 0 ty | | 0 0 1 tz | | 0 0 0 1 | Notice the obvious extension from 2-D to 3-D. SCALING-- To perform a 3-D scaling with respect to the origin (0,0,0), we specify the three scaling factors sx, sy, sz. Point P=(x,y,z) will be converted to point P'=(x',y',z') by the following scaling transformation: P' = S * P where S is the following 4 X 4 scaling matrix: | sx 0 0 0 | S = | 0 sy 0 0 | | 0 0 sz 0 | | 0 0 0 1 | ROTATIONS-- To handle 3-D rotations, we need to specify the angle of rotation and the axis about which the rotation is to be performed. There is an infinite number of possible rotation axes. It turns out, however, that a rotation about any axis can be obtained by linear combinations of rotations about the x-axis, the y-axis, and the z-axis. We will first consider the rotation of a point P=(x,y,z) by angle theta about the z-axis, giving the rotated point P'=(x',y',z'). This kind of rotation will give exactly the same equations for x and y as in the 2-D case. And, of course, z will not change. x' = x*cos(theta) - y*sin(theta) y' = x*sin(theta) + y*cos(theta) z' = z This can be represented by the following homogeneous matrix equation: P' = Rz * P where Rz is the following 4 X 4 matrix for rotations about the z-axis: | cos(theta) -sin(theta) 0 0 | Rz = | sin(theta) cos(theta) 0 0 | | 0 0 1 0 | | 0 0 0 1 | To get the matrix Rx for rotations about the x axis, we make a symmetry argument. y z | | | | | | ------x ------y / / / / z x about z about x From the diagram, we see that rotations about the x-axis are equivalent to rotations about z-axis if we make the following replacements: x --> y y --> z z --> x Making these replacements in the component equations above, we get: y' = y*cos(theta) - z*sin(theta) z' = y*sin(theta) + z*cos(theta) x' = x These can be represented by the following homogeneous matrix equation: P' = Rx * P where Rx is the following 4 X 4 matrix for rotations about the x-axis: | 1 0 0 0 | Rx = | 0 cos(theta) -sin(theta) 0 | | 0 sin(theta) cos(theta) 0 | | 0 0 0 1 | A similar symmetry argument can be made to get the matrix Ry for rotations about the y-axis. y x | | | | | | ------x ------z / / / / z y about z about y From the diagram, we see that rotations about the y-axis are equivalent to rotations about z-axis if we make the following replacements: x --> z y --> x z --> y Making these replacements in the component equations above, we get: z' = z*cos(theta) - x*sin(theta) x' = z*sin(theta) + x*cos(theta) y' = y These can be represented by the following homogeneous matrix equation: P' = Ry * P where Ry is the following 4 X 4 matrix for rotations about the x-axis: | cos(theta) 0 sin(theta) 0 | Ry = | 0 1 0 0 | | -sin(theta) 0 cos(theta) 0 | | 0 0 0 1 | For all three of these fundamental rotations, the positive sense is defined as counter clockwise as we look down the rotation axis toward the origin. COMPOSITE 3-D GEOMETRIC TRANSFORMATIONS-- Just as in 2-D, a series of consecutive transformations represented by the homogeneous transformation matrices T1, T2, ..., Tn is equivalent to a single transformation represented by the composite transformation matrix T, where T is given by the matrix product: T = Tn*...*T2*T1 Because of the simple way in which transformations in 3-D are extensions of transformations in 2-D, it is very straightforward to build a library of 3-D transformation functions from the 2-D transformation package you designed earlier. This might contain some of the following functions that will enable you to set up and transform points and polygons (see notes on 2-D transformations). (In the following, a, b, and c are arrays containing the 12 non-trivial matrix elements of a 4 X 4 homogeneous transformation matrix; vi and vo are 3-D point structures; inpoly and outpoly are polygon structures. These latter structures were described in the previous set of notes.) void settranslate3d(a[12], tx, ty, tz); // set up translation matrix from // components (tx,ty,tz) of translation void setscale3d(a[12], sx, sy, sz); // set up scaling matrix from // scaling factors (sx,sy,sz) void setrotatex3d(a[12], theta); // set up x-axis rotation matrix // from rotation angle theta void setrotatey3d(a[12], theta); // set up y-axis rotation matrix void setrotatez3d(a[12], theta); // set up z-axis rotation matrix void combine3d(c[12], a[12], b[12]); // C = A * B (matrix product) void xformcoord3d(c[12], vi, *vo); // vo = C * vi void xformpoly3d(inpoly[], outpoly[], float c[12]); // transform polygon ROTATION ABOUT AN ARBITRARY AXIS-- To determine the composite transformation matrix that will rotate a point by angle alpha about an axis of rotation which is the line segment whose endpoints are P1=(x1,y1,z1) and P2=(x2,y2,z2), we can convert this problem into a rotation about the x-axis. We need to do the following: 1. Translate so that endpoint P1 is at the origin: T1 = T(-x1,-y1,-z1). 2. Compute the spherical coordinates of the other endpoint: rho = sqrt((x2-x1)^2 + (y2-y1)^2 + (z2-z1)^2) phi = arccos((z2-z1)/rho) theta = arctan((y2-y1)/(x2-x1)) 3. Rotate about the z-axis by -theta so that the line lies in the x-z plane: T2 = Rz(-theta). 4. Rotate about the y-axis by (90-phi) to make the line coincide with the x-axis: T3 = Ry(90-phi). 5. Rotate about the x-axis by the given angle alpha: T4 = Rx(alpha). 6. Rotate back to undo step 4: T5 = Ry(phi-90). 7. Rotate back to undo step 3: T6 = Rz(theta). 8. Translate back to undo step 1: T7 = T(x1,y1,z1) The composite transformation then will be: T = T7*T6*T5*T4*T3*T2*T1 3-D COORDINATE SYSTEM TRANSFORMATIONS-- Just as for 2-D transformations, there is a symmetrical relationship between 3-D geometric transformations (moving the object) and 3-D coordinate system transformations (moving the coordinate system). For translations, the relationship is: Tcoord(x,y,z) = Tgeom(-x,-y,-z) For each of the 3 principal-axis rotations, the relationship is: Rcoord(theta) = Rgeom(-theta) We'll use these relationships when we derive the equations for the 3-D viewing transformation.