DUMB3D.CPP
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:8k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /**************************************************************************
  2.   dumb3d.cpp - A simple linear algebra library for 3D.
  3.  **************************************************************************/
  4. /**************************************************************************
  5.     (C) Copyright 1995-1996 Microsoft Corp.  All rights reserved.
  6.     You have a royalty-free right to use, modify, reproduce and 
  7.     distribute the Sample Files (and/or any modified version) in 
  8.     any way you find useful, provided that you agree that 
  9.     Microsoft has no warranty obligations or liability for any 
  10.     Sample Application Files which are modified. 
  11.  **************************************************************************/
  12. #include<memory.h>
  13. #include<math.h>
  14. #include"dumb3d.h"
  15. /*--------------------------------------------------------------------------
  16. matrix multiplication.
  17. */
  18. matrix_4x4 operator*( matrix_4x4 const &Multiplicand,
  19.     matrix_4x4 const &Multiplier )
  20. {
  21.   matrix_4x4 ReturnMatrix;
  22.   for(int i = 0;i < 4;i++)
  23.   {
  24.     for(int j = 0;j < 4;j++)
  25.     {
  26.       real Value = 0;
  27.       
  28.       for(int k = 0;k < 4;k++)
  29.       {
  30.         Value += Multiplicand.GetElement(i,k) *
  31.             Multiplier.GetElement(k,j);
  32.       }
  33.       ReturnMatrix.SetElement(i,j,Value);
  34.     }
  35.   }
  36.   return ReturnMatrix;
  37. }
  38. vector_4 operator*( matrix_4x4 const &Multiplicand,
  39.     vector_4 const &Multiplier )
  40. {
  41.   vector_4 ReturnPoint;
  42.   for(int i = 0;i < 4;i++)
  43.   {
  44.     real Value = 0;
  45.     
  46.     for(int k = 0;k < 4;k++)
  47.     {
  48.       Value += Multiplicand.GetElement(i,k) *
  49.           Multiplier.GetElement(k);
  50.     }
  51.     ReturnPoint.SetElement(i,Value);
  52.   }
  53.   return ReturnPoint;
  54. }
  55. point_4 operator*( matrix_4x4 const &Multiplicand,
  56.     point_4 const &Multiplier )
  57. {
  58.   point_4 ReturnPoint;
  59.   for(int i = 0;i < 4;i++)
  60.   {
  61.     real Value = 0;
  62.     
  63.     for(int k = 0;k < 4;k++)
  64.     {
  65.       Value += Multiplicand.GetElement(i,k) *
  66.           Multiplier.GetElement(k);
  67.     }
  68.     ReturnPoint.SetElement(i,Value);
  69.   }
  70.   return ReturnPoint;
  71. }
  72. /*--------------------------------------------------------------------------
  73. constructor.
  74. */
  75. matrix_4x4::matrix_4x4( void )
  76. {
  77.   for(int Counter = 0;Counter < 16;Counter++)
  78.   {
  79.     aElements[0][Counter] = 0;
  80.   }
  81.   aElements[0][0] = aElements[1][1] = aElements[2][2] = aElements[3][3] = 1;
  82. }
  83. /*--------------------------------------------------------------------------
  84. Rotations.
  85. */
  86. matrix_4x4 &matrix_4x4::ConcatenateXRotation( real Degrees )
  87. {
  88.   real Temp01, Temp11, Temp21, Temp31;
  89.   real Temp02, Temp12, Temp22, Temp32;
  90.   real Radians = (Degrees/360) * M_PI * 2;
  91.   real Sin = sin(Radians), Cos = cos(Radians);
  92.   Temp01 = aElements[0][1] * Cos + aElements[0][2] * Sin;
  93.   Temp11 = aElements[1][1] * Cos + aElements[1][2] * Sin;
  94.   Temp21 = aElements[2][1] * Cos + aElements[2][2] * Sin;
  95.   Temp31 = aElements[3][1] * Cos + aElements[3][2] * Sin;
  96.   Temp02 = aElements[0][1] * -Sin + aElements[0][2] * Cos;
  97.   Temp12 = aElements[1][1] * -Sin + aElements[1][2] * Cos;
  98.   Temp22 = aElements[2][1] * -Sin + aElements[2][2] * Cos;
  99.   Temp32 = aElements[3][1] * -Sin + aElements[3][2] * Cos;
  100.   aElements[0][1] = Temp01;
  101.   aElements[1][1] = Temp11;
  102.   aElements[2][1] = Temp21;
  103.   aElements[3][1] = Temp31;
  104.   aElements[0][2] = Temp02;
  105.   aElements[1][2] = Temp12;
  106.   aElements[2][2] = Temp22;
  107.   aElements[3][2] = Temp32;
  108.   return *this;
  109. }
  110. matrix_4x4 &matrix_4x4::ConcatenateYRotation( real Degrees )
  111. {
  112.   real Temp00, Temp10, Temp20, Temp30;
  113.   real Temp02, Temp12, Temp22, Temp32;
  114.   real Radians = (Degrees/360) * M_PI * 2;
  115.   real Sin = sin(Radians), Cos = cos(Radians);
  116.   Temp00 = aElements[0][0] * Cos + aElements[0][2] * -Sin;
  117.   Temp10 = aElements[1][0] * Cos + aElements[1][2] * -Sin;
  118.   Temp20 = aElements[2][0] * Cos + aElements[2][2] * -Sin;
  119.   Temp30 = aElements[3][0] * Cos + aElements[3][2] * -Sin;
  120.   Temp02 = aElements[0][0] * Sin + aElements[0][2] * Cos;
  121.   Temp12 = aElements[1][0] * Sin + aElements[1][2] * Cos;
  122.   Temp22 = aElements[2][0] * Sin + aElements[2][2] * Cos;
  123.   Temp32 = aElements[3][0] * Sin + aElements[3][2] * Cos;
  124.   aElements[0][0] = Temp00;
  125.   aElements[1][0] = Temp10;
  126.   aElements[2][0] = Temp20;
  127.   aElements[3][0] = Temp30;
  128.   aElements[0][2] = Temp02;
  129.   aElements[1][2] = Temp12;
  130.   aElements[2][2] = Temp22;
  131.   aElements[3][2] = Temp32;
  132.   return *this;
  133. }
  134. matrix_4x4 &matrix_4x4::ConcatenateZRotation( real Degrees )
  135. {
  136.   real Temp00, Temp10, Temp20, Temp30;
  137.   real Temp01, Temp11, Temp21, Temp31;
  138.   real Radians = (Degrees/360) * M_PI * 2;
  139.   real Sin = sin(Radians), Cos = cos(Radians);
  140.   Temp00 = aElements[0][0] * Cos + aElements[0][1] * Sin;
  141.   Temp10 = aElements[1][0] * Cos + aElements[1][1] * Sin;
  142.   Temp20 = aElements[2][0] * Cos + aElements[2][1] * Sin;
  143.   Temp30 = aElements[3][0] * Cos + aElements[3][1] * Sin;
  144.   Temp01 = aElements[0][0] * -Sin + aElements[0][1] * Cos;
  145.   Temp11 = aElements[1][0] * -Sin + aElements[1][1] * Cos;
  146.   Temp21 = aElements[2][0] * -Sin + aElements[2][1] * Cos;
  147.   Temp31 = aElements[3][0] * -Sin + aElements[3][1] * Cos;
  148.   aElements[0][0] = Temp00;
  149.   aElements[1][0] = Temp10;
  150.   aElements[2][0] = Temp20;
  151.   aElements[3][0] = Temp30;
  152.   aElements[0][1] = Temp01;
  153.   aElements[1][1] = Temp11;
  154.   aElements[2][1] = Temp21;
  155.   aElements[3][1] = Temp31;
  156.   return *this;
  157. }
  158. /*--------------------------------------------------------------------------
  159. Translations.
  160. */
  161. matrix_4x4 &matrix_4x4::ConcatenateXTranslation( real Distance )
  162. {
  163.   aElements[0][3] = aElements[0][0] * Distance + aElements[0][3];
  164.   aElements[1][3] = aElements[1][0] * Distance + aElements[1][3];
  165.   aElements[2][3] = aElements[2][0] * Distance + aElements[2][3];
  166.   aElements[3][3] = aElements[3][0] * Distance + aElements[3][3];
  167.   return *this;
  168. }
  169. matrix_4x4 &matrix_4x4::ConcatenateYTranslation( real Distance )
  170. {
  171.   aElements[0][3] = aElements[0][1] * Distance + aElements[0][3];
  172.   aElements[1][3] = aElements[1][1] * Distance + aElements[1][3];
  173.   aElements[2][3] = aElements[2][1] * Distance + aElements[2][3];
  174.   aElements[3][3] = aElements[3][1] * Distance + aElements[3][3];
  175.   return *this;
  176. }
  177. matrix_4x4 &matrix_4x4::ConcatenateZTranslation( real Distance )
  178. {
  179.   aElements[0][3] = aElements[0][2] * Distance + aElements[0][3];
  180.   aElements[1][3] = aElements[1][2] * Distance + aElements[1][3];
  181.   aElements[2][3] = aElements[2][2] * Distance + aElements[2][3];
  182.   aElements[3][3] = aElements[3][2] * Distance + aElements[3][3];
  183.   return *this;
  184. }
  185. /*--------------------------------------------------------------------------
  186. vector normalize.
  187. */
  188. vector_4 &vector_4::Normalize( void )
  189. {
  190.   real Length = sqrt(GetX()*GetX() + GetY()*GetY() + GetZ()*GetZ());
  191.   SetX(GetX() / Length);
  192.   SetY(GetY() / Length);
  193.   SetZ(GetZ() / Length);
  194.   return *this;
  195. }
  196.   
  197. /*--------------------------------------------------------------------------
  198. view transform ctor.
  199. */
  200. view_transform::view_transform( point_4 const &Viewpoint,
  201.   vector_4 const &ViewDirection, vector_4 const &Up )
  202. {
  203.   // translate the viewpoint to the origin
  204.   this->ConcatenateXTranslation(-Viewpoint.GetX());
  205.   this->ConcatenateYTranslation(-Viewpoint.GetY());
  206.   this->ConcatenateZTranslation(-Viewpoint.GetZ());
  207.   // get view vectors set up
  208.   vector_4 Right = -CrossProduct(ViewDirection,Up);
  209.   vector_4 ReallyUp = CrossProduct(Right,ViewDirection);
  210.     
  211.   matrix_4x4 LookDownZ;
  212.   for(int Counter = 0;Counter < 3;Counter++)
  213.   {
  214.     LookDownZ.SetElement(0,Counter,Right.GetElement(Counter));
  215.   }
  216.   for(Counter = 0;Counter < 3;Counter++)
  217.   {
  218.     LookDownZ.SetElement(1,Counter,ReallyUp.GetElement(Counter));
  219.   }
  220.   for(Counter = 0;Counter < 3;Counter++)
  221.   {
  222.     LookDownZ.SetElement(2,Counter,ViewDirection.GetElement(Counter));
  223.   }
  224.   this->matrix_4x4::operator=(LookDownZ * *this);
  225. }