www.pudn.com > CG2Programs.rar > transformObject3.c
/* transformObject3, Chapter 11, pp. 423-425 */ /* EXAMPLE STARTS HERE */ #include#include "graphics.h" #define PI 3.14159 typedef float Matrix4x4[4][4]; Matrix4x4 theMatrix; void matrix4x4SetIdentity (Matrix4x4 m) { int r,c; for (r=0; r<4; r++) for (c=0; c<4; c++) m[r][c] = (r == c); } /* Multiplies matrix a times b, putting result in b */ void matrix4x4PreMultiply (Matrix4x4 a, Matrix4x4 b) { int r,c; Matrix4x4 tmp; for (r=0; r<4; r++) for (c=0; c<4; c++) tmp[r][c] = a[r][0]*b[0][c] + a[r][1]*b[1][c] + a[r][2]*b[2][c] + a[r][3]*b[3][c]; for (r=0; r<4; r++) for (c=0; c<4; c++) b[r][c] = tmp[r][c]; } void translate3 (float tx, float ty, float tz) { Matrix4x4 m; matrix4x4SetIdentity (m); m[0][3] = tx; m[1][3] = ty; m[2][3] = tz; matrix4x4PreMultiply (m, theMatrix); } void scale3 (float sx, float sy, float sz, wcPt3 center) { Matrix4x4 m; matrix4x4SetIdentity (m); m[0][0] = sx; m[0][3] = (1 - sx) * center.x; m[1][1] = sy; m[1][3] = (1 - sy) * center.y; m[2][2] = sz; m[2][3] = (1 - sz) * center.z; matrix4x4PreMultiply (m, theMatrix); } void rotate3 (wcPt3 p1, wcPt3 p2, float radianAngle) { float length = sqrt ((p2.x - p1.x) * (p2.x - p1.x) + (p2.y - p1.y) * (p2.y - p1.y) + (p2.z - p1.z) * (p2.z - p1.z)); float cosA2 = cosf (radianAngle / 2.0); float sinA2 = sinf (radianAngle / 2.0); float a = sinA2 * (p2.x - p1.x) / length; float b = sinA2 * (p2.y - p1.y) / length; float c = sinA2 * (p2.z - p1.z) / length; Matrix4x4 m; translate3 (-p1.x, -p1.y, -p1.z); matrix4x4SetIdentity (m); m[0][0] = 1.0 - 2*b*b - 2*c*c; m[0][1] = 2*a*b - 2*cosA2*c; m[0][2] = 2*a*c + 2*cosA2*b; m[1][0] = 2*a*b + 2*cosA2*c; m[1][1] = 1.0 - 2*a*a - 2*c*c; m[1][2] = 2*b*c - 2*cosA2*a; m[2][0] = 2*a*c - 2*cosA2*b; m[2][1] = 2*b*c + 2*cosA2*a; m[2][2] = 1.0 - 2*a*a - 2*b*b; matrix4x4PreMultiply (m, theMatrix); translate3 (p1.x, p1.y, p1.z); } void transformPoints3 (int nPts, wcPt3 * pts) { int k, j; float tmp[3]; for (k=0; k