glMath.c
上传用户:shxiangxiu
上传日期:2007-01-03
资源大小:1101k
文件大小:11k
源码类别:

OpenGL

开发平台:

Visual C++

  1. /////////////////////////////////////////////////////////////////////////////
  2. // glMath.c : global glMath function implementation file
  3. //
  4. // glOOP (OpenGL Object Oriented Programming library)
  5. // Copyright (c) Craig Fahrnbach 1997, 1998
  6. //
  7. // OpenGL is a registered trademark of Silicon Graphics
  8. //
  9. //
  10. // This program is provided for educational and personal use only and
  11. // is provided without guarantee or warrantee expressed or implied.
  12. //
  13. // Commercial use is strickly prohibited without written permission
  14. // from ImageWare Development.
  15. //
  16. // This program is -not- in the public domain.
  17. //
  18. /////////////////////////////////////////////////////////////////////////////
  19. #include <windows.h>
  20. #include <glgl.h>
  21. #include <glglu.h>
  22. #include <glglaux.h>
  23. #include <math.h>
  24. #include "glMath.h"
  25. /*****************************************************************************
  26.  *
  27.  *  Misc. Math Routines
  28.  *
  29.  *****************************************************************************
  30.  */
  31. GLfloat Radiansf(GLfloat Angle)
  32. {
  33. double r = (double)Angle*PiOver180; 
  34. return(GLfloat)r;
  35. }
  36. GLfloat Degreesf(GLfloat Angle)
  37. {
  38. double d = (double)Angle*PiUnder180;
  39. return(GLfloat)d;
  40. }
  41. GLfloat Cosf(GLfloat Angle)
  42. {
  43. return((GLfloat)cos(Radiansf(Angle)));
  44. }
  45. GLfloat Sinf(GLfloat Angle)
  46. {
  47. return((GLfloat)sin(Radiansf(Angle)));
  48. }
  49. GLfloat Powerf(GLfloat Base, int Exponent)
  50. {
  51. GLfloat BPower;
  52. int   t;
  53. if(Exponent==0)
  54. return(1.0f);
  55. else
  56. {
  57. BPower=1.0f;
  58. for(t=1; t<=Exponent; t++)
  59. {
  60. BPower*=Base;
  61. }
  62. return(BPower);
  63. }
  64. }
  65. GLfloat Sqrf(GLfloat x)
  66. {
  67. return(x*x);
  68. }
  69. int Roundf(GLfloat x)
  70. {
  71. if(x<0)
  72. return((int)(x-0.5));
  73. else
  74. return((int)(x+0.5));
  75. }
  76. GLdouble Radiansd(GLdouble Angle)
  77. {
  78. double r = Angle*PiOver180; 
  79. return r;
  80. }
  81. GLdouble Degreesd(GLdouble Angle)
  82. {
  83. double d = Angle*PiUnder180;
  84. return d;
  85. }
  86. GLdouble Cosd(GLdouble Angle)
  87. {
  88. return((GLdouble)cos(Radiansd(Angle)));
  89. }
  90. GLdouble Sind(GLdouble Angle)
  91. {
  92. return((GLdouble)sin(Radiansd(Angle)));
  93. }
  94. /*****************************************************************************
  95.  *
  96.  *  Vector Functions:
  97.  *
  98.  *****************************************************************************
  99.  */
  100. void Vec3f(GLfloat r, GLfloat s, GLfloat t, VECTORF A)
  101. {
  102. A[0]=r;
  103. A[1]=s;
  104. A[2]=t;
  105. }
  106. void UnVec3f(VECTORF A, GLfloat *r, GLfloat *s, GLfloat *t)
  107. {
  108. *r=A[0];
  109. *s=A[1];
  110. *t=A[2];
  111. }
  112. void Vec4f(GLfloat r, GLfloat s, GLfloat t, GLfloat u, VECTORF A)
  113. {
  114. A[0]=r;
  115. A[1]=s;
  116. A[2]=t;
  117. A[3]=u;
  118. }
  119. void UnVec4f(VECTORF A, GLfloat *r, GLfloat *s, GLfloat *t, GLfloat *u)
  120. {
  121. *r=A[0];
  122. *s=A[1];
  123. *t=A[2];
  124. *u=A[3];
  125. }
  126. void VecClear3f(VECTORF A)
  127. {
  128. A[X] = 0.0f;
  129. A[Y] = 0.0f;
  130. A[Z] = 0.0f;
  131. }
  132. void VecClear4f(VECTORF A)
  133. {
  134. A[X] = 0.0f;
  135. A[Y] = 0.0f;
  136. A[Z] = 0.0f;
  137. A[W] = 0.0f;
  138. }
  139. void VecCopy3f(VECTORF A, VECTORF B)
  140. {
  141. B[X]=A[X];
  142. B[Y]=A[Y];
  143. B[Z]=A[Z];
  144. }
  145. void VecCopy4f(VECTORF A, VECTORF B)
  146. {
  147. B[X]=A[X];
  148. B[Y]=A[Y];
  149. B[Z]=A[Z];
  150. B[W]=A[W];
  151. }
  152. void VecSubf(VECTORF A, VECTORF B, VECTORF C)
  153. {
  154. C[0]=A[0]-B[0];
  155. C[1]=A[1]-B[1];
  156. C[2]=A[2]-B[2];
  157. }
  158. void VecAddf(VECTORF A, VECTORF B, VECTORF C)
  159. {
  160. C[0]=A[0]+B[0];
  161. C[1]=A[1]+B[1];
  162. C[2]=A[2]+B[2];
  163. }
  164. void VecAdd3f(VECTORF A, VECTORF B, VECTORF C, VECTORF D)
  165. {
  166. D[0]=A[0]+B[0]+C[0];
  167. D[1]=A[1]+B[1]+C[1];
  168. D[2]=A[2]+B[2]+C[2];
  169. }
  170. GLfloat VecDiFFf(VECTORF A, VECTORF B)
  171. {
  172. GLfloat fDiff;
  173. fDiff  = A[X]-B[X];
  174. fDiff += A[Y]-B[Y];
  175. fDiff += A[Z]-B[Z];
  176. return fDiff;
  177. }
  178. GLfloat VecDotf(VECTORF A, VECTORF B)
  179. {
  180. return(A[0]*B[0] + A[1]*B[1] + A[2]*B[2]);
  181. }
  182. void VecCrossf(VECTORF A, VECTORF B, VECTORF C)
  183. {
  184. C[0]=A[1]*B[2] - A[2]*B[1];
  185. C[1]=A[2]*B[0] - A[0]*B[2];
  186. C[2]=A[0]*B[1] - A[1]*B[0];
  187. }
  188. GLfloat VecLenf(VECTORF A)
  189. {
  190. return(GLfloat)(sqrt(Sqrf(A[0])+Sqrf(A[1])+Sqrf(A[2])));
  191. }
  192. void VecNormalizef(VECTORF A)
  193. {
  194. GLfloat dist,invdist;
  195. dist=VecLenf(A);
  196. if(dist==0.0)
  197. return;
  198. else {
  199. invdist=1.0f/dist;
  200. A[0]*=invdist;
  201. A[1]*=invdist;
  202. A[2]*=invdist;
  203. }
  204. }
  205. void CalNormalf(VECTORF A, VECTORF B, VECTORF C, VECTORF N)
  206. {
  207. // Calculate the surface normals of a plane, given points A, B and C
  208. // which reside on the surface of the plane.
  209. /*
  210.                      ^ Vn (Normal)
  211.                      |
  212.                      | 
  213.                      |
  214.                      | 
  215.                  Va  *------------------* Vb  (Vu)
  216.                     /                 /
  217.                   /                 / 
  218.                 /                 /
  219.               /                 /
  220.          Vc *------------------
  221.        (Vv)
  222. */
  223. VECTORF u, v;
  224. VecSubf(B, A, u);
  225. VecSubf(C, A, v);
  226. VecCrossf(v, u, N);
  227. VecNormalizef(N);
  228. }
  229. /*****************************************************************************
  230.  *
  231.  *  Affine Matrix Transformation Routines
  232.  *
  233.  *****************************************************************************
  234.   We define a 4x4 matrix array, referenced as Row,Column as:
  235. | 0,0  0,1  0,2  0,3 |
  236. |                    |
  237. | 1,0  1,1  1,2  1,3 |
  238. |                    |
  239. | 2,0  2,1  2,2  2,3 |
  240. |                    |
  241. | 3,0  3,1  3,2  3,3 |
  242. */
  243. void ZeroMatrix(Matx4x4 A)
  244. {
  245. // Initialize the matrix to the following values:
  246. // 0.0 0.0 0.0 0.0
  247. // 0.0 0.0 0.0 0.0
  248. // 0.0 0.0 0.0 0.0
  249. // 0.0 0.0 0.0 0.0
  250. //
  251. int i, j;
  252. for (i=0; i<4; i++) {
  253. for (j=0; j<4; j++)
  254. A[i][j]=0.0;
  255. }
  256. }
  257. void Translate3D(float tx, float ty, float tz, Matx4x4 A)
  258. {
  259. // Translation matrix identified as:
  260. //  ----------------
  261. // | 1   0   0   Tx |
  262. // | 0   1   0   Ty |
  263. // | 0   0   1   Tz |
  264. // | 0   0   0   1  |
  265. //  ----------------
  266. int i;
  267. ZeroMatrix(A);
  268. for (i=0; i<4; i++)
  269. A[i][i]=1.0;
  270. A[0][3]=tx;
  271. A[1][3]=ty;
  272. A[2][3]=tz;
  273. }
  274. void Scale3D(float sx, float sy, float sz, Matx4x4 A)
  275. {
  276. // Scaling matrix identified as:
  277. //  ----------------
  278. // | Sx  0   0   0 |
  279. // | 0   Sy  0   0 |
  280. // | 0   0   Sz  0 |
  281. // | 0   0   0   1 |
  282. //  ----------------
  283. ZeroMatrix(A);
  284. A[0][0]=sx;
  285. A[1][1]=sy;
  286. A[2][2]=sz;
  287. A[3][3]=1.0;
  288. }
  289. void Rotate3D(int m, float Theta, Matx4x4 A)
  290. {
  291. float c, s;
  292. ZeroMatrix(A);
  293. c=Cosf(Theta);
  294. s=Sinf(Theta);
  295. // Compensate for rounding errors
  296. if(fabs(c)<SMALL_NUMBER)
  297. c=0.0f;
  298. if(fabs(s)<SMALL_NUMBER)
  299. s=0.0f;
  300. switch(m)
  301. {
  302. case X:
  303. // Rotation about the X-Axis matrix identified as:
  304. //  -----------------------
  305. // | 1     0      0      0 |
  306. // | 0     cosX   -sinX  0 |
  307. // | 0     sinX   cosX   0 |
  308. // | 0     0      0      1 |
  309. //  -----------------------
  310. A[0][0]= 1.0;
  311. A[1][1]= c;
  312. A[1][2]=-s;
  313. A[2][1]= s;
  314. A[2][2]= c;
  315. A[3][3]= 1.0;
  316. break;
  317. case Y:
  318. // Rotation about the Y-Axis matrix identified as:
  319. //  -----------------------
  320. // | cosY  0      sinY   0 |
  321. // | 0     1      0      0 |
  322. // | -sinY 0      cosY   0 |
  323. // | 0     0      0      1 |
  324. //  -----------------------
  325. A[0][0]= c;
  326. A[0][2]= s;
  327. A[1][1]= 1.0;
  328. A[2][0]=-s;
  329. A[2][2]= c;
  330. A[3][3]= 1.0;
  331. break;
  332. case Z:
  333. // Rotation about the Z-Axis matrix identified as:
  334. //  -----------------------
  335. // | cosZ  -sinZ  0      0 |
  336. // | sinZ  cosZ   0      0 |
  337. // | 0     0      0      0 |
  338. // | 0     0      0      1 |
  339. //  -----------------------
  340. A[0][0]= c;
  341. A[0][1]=-s;
  342. A[1][0]= s;
  343. A[1][1]= c;
  344. A[2][2]= 1.0;
  345. A[3][3]= 1.0;
  346. break;
  347. }
  348. }
  349. void MultiplyMatricies(Matx4x4 A, Matx4x4 B, Matx4x4 C)
  350. {
  351. int   i, j, k;
  352. for(i=0; i<4; i++) {
  353. for(j=0; j<4; j++) {
  354. for(k=0, C[i][j]=0; k<4; k++)
  355. C[i][j] += A[i][k] * B[k][j];
  356. }
  357. }
  358. }
  359. void MatrixCopy(Matx4x4 A, Matx4x4 B)
  360. {
  361. int  i, j;
  362. for(i=0; i<4; i++)
  363. {
  364. for(j=0; j<4; j++)
  365. B[i][j]=A[i][j];
  366. }
  367. }
  368. void TransposeMatrix(Matx4x4 A)
  369. {
  370. Matx4x4 M;
  371. int  i, j;
  372. for(i=0; i<4; i++) {
  373. for(j=0; j<4; j++)
  374. M[j][i]=A[i][j];
  375. }
  376. MatrixCopy(M, A);
  377. }
  378. void PrepareMatrix(float Ox, float Oy, float Oz,
  379.    float Sx, float Sy, float Sz,
  380.    float Rx, float Ry, float Rz,
  381.    float Tx, float Ty, float Tz,
  382.    Matx4x4 XForm)
  383. {
  384. Matx4x4 M1, M2, M3, M4, M5, M6, M7, M8, M9, M10, M11;
  385. Translate3D(Tx, Ty, Tz, M1);
  386. Scale3D(Sx, Sy, Sz, M2);
  387. Rotate3D(Z, Rz, M3);
  388. Rotate3D(Y, Ry, M4);
  389. Rotate3D(X, Rx, M5);
  390. Translate3D(Ox, Oy, Oz, M6);
  391. MultiplyMatricies(M2, M1, M7);
  392. MultiplyMatricies(M3, M7, M8);
  393. MultiplyMatricies(M4, M8, M9);
  394. MultiplyMatricies(M5, M9, M10);
  395. MultiplyMatricies(M6, M10, M11);
  396. MatrixCopy(M11, XForm);
  397. }
  398. void PrepareInvMatrix(float Ox, float Oy, float Oz,
  399.   float Sx, float Sy, float Sz,
  400.   float Rx, float Ry, float Rz,
  401.   float Tx, float Ty, float Tz,
  402.   Matx4x4 XForm)
  403. {
  404. Matx4x4 M1, M2, M3, M4, M5, M6, M7, M8, M9, M10, M11;
  405. Translate3D(-Ox, -Oy, -Oz, M1);
  406. Rotate3D(X, -Rx, M2);
  407. Rotate3D(Y, -Ry, M3);
  408. Rotate3D(Z, -Rz, M4);
  409. Scale3D(1/Sx, 1/Sy, 1/Sz, M5);
  410. Translate3D(-Tx, -Ty, -Tz, M6);
  411. MultiplyMatricies(M2, M1, M7);
  412. MultiplyMatricies(M3, M7, M8);
  413. MultiplyMatricies(M4, M8, M9);
  414. MultiplyMatricies(M5, M9, M10);
  415. MultiplyMatricies(M6, M10, M11);
  416. MatrixCopy(M11, XForm);
  417. }
  418. void VecTransformf(VECTORF S, VECTORF D, Matx4x4 M)
  419. {
  420. GLdouble x, y, z;
  421. // Transform the Source vector 'S' by the matrix 'M'
  422. x = M[0][0]*S[0] + M[0][1]*S[1] + M[0][2]*S[2] + M[0][3];
  423. y = M[1][0]*S[0] + M[1][1]*S[1] + M[1][2]*S[2] + M[1][3];
  424. z = M[2][0]*S[0] + M[2][1]*S[1] + M[2][2]*S[2] + M[2][3];
  425. // Compensate for rounding errors
  426. if(fabs(x) < SMALL_NUMBER)
  427. x = 0.0f;
  428. if(fabs(y) < SMALL_NUMBER)
  429. y = 0.0f;
  430. if(fabs(z) < SMALL_NUMBER)
  431. z = 0.0f;
  432. // Store the transformed values in the Destination
  433. // vector 'D'
  434. D[0] = (GLfloat)x;
  435. D[1] = (GLfloat)y;
  436. D[2] = (GLfloat)z;
  437. }
  438. /*****************************************************************************
  439.  *
  440.  *  Misc OpenGL Related Functions:
  441.  *
  442.  *****************************************************************************
  443.   We define a 4x4 matrix array, OpenGL linear matrix format:
  444.   referenced as Row,Column as:
  445. | 0,0  0,1  0,2  0,3 | |a0  a4  a8   a12|
  446. |                    | |                |
  447. | 1,0  1,1  1,2  1,3 | |a1  a5  a9   a13|
  448. |                    | |                |
  449. | 2,0  2,1  2,2  2,3 | |a2  a6  a10  a14|
  450. |                    | |                |
  451. | 3,0  3,1  3,2  3,3 | |a3  a7  a11  a15|
  452.  */
  453. void glMatrixTo4x4(GLdouble M[16], Matx4x4 A)
  454. {
  455. int i, j;
  456. for(i=0; i<4; i++) {
  457. for(j=0; j<4; j++)
  458. A[i][j]=(float)M[(i*4)+j];
  459. }
  460. }
  461. void Matx4x4ToglMatrix(Matx4x4 A, GLdouble M[16])
  462. {
  463. int i, j;
  464. for(i=0; i<4; i++) {
  465. for(j=0; j<4; j++)
  466. M[(i*4)+j]=(GLdouble)A[i][j];
  467. }
  468. }
  469. void Transformf(VECTORF S, VECTORF D, GLdouble M[16])
  470. {
  471. GLdouble x, y, z;
  472. // Transform the Source vector 'S' by the matrix 'M'
  473. x = M[0]*S[0] + M[1]*S[1] + M[2] *S[2]; // + M[3];
  474. y = M[4]*S[0] + M[5]*S[1] + M[6] *S[2]; // + M[7];
  475. z = M[8]*S[0] + M[9]*S[1] + M[10]*S[2]; // + M[11];
  476. // Compensate for rounding errors
  477. if(fabs(x) < SMALL_NUMBER)
  478. x = 0.0f;
  479. if(fabs(y) < SMALL_NUMBER)
  480. y = 0.0f;
  481. if(fabs(z) < SMALL_NUMBER)
  482. z = 0.0f;
  483. // Store the transformed values in the Destination
  484. // vector 'D'
  485. D[0] = (GLfloat)x;
  486. D[1] = (GLfloat)y;
  487. D[2] = (GLfloat)z;
  488. }