home *** CD-ROM | disk | FTP | other *** search
/ PC World 2006 July & August / PCWorld_2006-07-08_cd.bin / temacd / planearcade / planearcade.exe / Tank3.bmp / camera.cpp < prev    next >
C/C++ Source or Header  |  2004-11-21  |  5KB  |  224 lines

  1.  
  2.  
  3.  
  4. #include "main.h"
  5.  
  6. //ENGINE
  7. CAMERA Camera;
  8.  
  9. //MATICA
  10. D3DXMATRIXA16 matView;   //pohladu
  11.  
  12.  
  13. //------------------------------------------------------------------
  14. // Name: CAMERA()
  15. // Desc: konstruktor
  16. //------------------------------------------------------------------
  17. CAMERA::CAMERA()
  18. {
  19.     ActPos = Get3D(0.0f,0.0f,0.0f);
  20.     Pos    = Get3D(0.0f,0.0f,0.0f);
  21.     Rot    = Get3D(0.0f,0.0f,0.0f);
  22.  
  23.     Angle1 =  D3DX_PI/5.7f;
  24.     Angle2 =  D3DX_PI/5.7f;
  25.     MaxDis =  3000.0f;
  26.  
  27. }
  28.  
  29. //------------------------------------------------------------------
  30. // Name: Refresh()
  31. // Desc: Obnovi maticu pohladu
  32. //------------------------------------------------------------------
  33. void CAMERA::RefreshYawPitchRoll()
  34. {
  35.     //vypocita maticu
  36.     matView = GetMatrix(Pos,
  37.                         Get3D(-Rot.X,Rot.Y,Rot.Z),
  38.                         Get3D(1.0f,1.0f,1.0f));
  39.     D3DXMatrixInverse(&matView,NULL,&matView);
  40.     g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );
  41.  
  42.     //vypocita frustrum roviny
  43.     CalcFrustrumPlanes();
  44. }
  45.  
  46. //------------------------------------------------------------------
  47. // Name: CalcFrustrumPlanes()
  48. // Desc: Vypocita frustrum roviny
  49. //------------------------------------------------------------------
  50. void CAMERA::CalcFrustrumPlanes()
  51. {
  52.  
  53.     VECTOR3D Pom;
  54.     VECTOR3D Lom;
  55.  
  56.     //Back
  57.     Pom.Y =Pos.Y +(1.0f * sinf(Rot.X)) ;
  58.     Pom.Z =Pos.Z +((cosf(Rot.X) *1.0f) * cosf(Rot.Y));
  59.     Pom.X =Pos.X +((cosf(Rot.X) *1.0f) * sinf(Rot.Y));
  60.  
  61.     Back = CreatePlanePoint(Pos,Pom);
  62.  
  63.     //Front
  64.     Pom.Z =Pos.Z +((cosf(Rot.X) *MaxDis) * cosf(Rot.Y));
  65.     Pom.X =Pos.X +((cosf(Rot.X) *MaxDis) * sinf(Rot.Y));
  66.     Pom.Y =Pos.Y +(MaxDis * sinf(Rot.X)) ;
  67.  
  68.     Lom.Y =Pos.Y +((MaxDis-1.0f) * sinf(Rot.X)) ;
  69.     Lom.Z =Pos.Z +((cosf(Rot.X) *(MaxDis-1.0f)) * cosf(Rot.Y));
  70.     Lom.X =Pos.X +((cosf(Rot.X) *(MaxDis-1.0f)) * sinf(Rot.Y));
  71.  
  72.     Front = CreatePlanePoint(Pom,Lom);
  73.  
  74.     //Left
  75.     Pom.Y =Pos.Y +(1.0f * sinf(Rot.X)) ;
  76.     Pom.Z =Pos.Z +((cosf(Rot.X) *1.0f) * cosf(Rot.Y+Angle1));
  77.     Pom.X =Pos.X +((cosf(Rot.X) *1.0f) * sinf(Rot.Y+Angle1));
  78.  
  79.     Left = CreatePlanePoint(Pos,Pom);
  80.  
  81.     //Right
  82.     Pom.Y =Pos.Y +(1.0f * sinf(Rot.X)) ;
  83.     Pom.Z =Pos.Z +((cosf(Rot.X) *1.0f) * cosf(Rot.Y-Angle1));
  84.     Pom.X =Pos.X +((cosf(Rot.X) *1.0f) * sinf(Rot.Y-Angle1));
  85.  
  86.     Right = CreatePlanePoint(Pos,Pom);
  87.  
  88.     //Up
  89.     Pom.Y =Pos.Y +(1.0f * sinf(Rot.X-Angle2)) ;
  90.     Pom.Z =Pos.Z +((cosf(Rot.X-Angle2) *1.0f) * cosf(Rot.Y));
  91.     Pom.X =Pos.X +((cosf(Rot.X-Angle2) *1.0f) * sinf(Rot.Y));
  92.  
  93.     Up = CreatePlanePoint(Pos,Pom);
  94.  
  95.     //Down
  96.     Pom.Y =Pos.Y +(1.0f * sinf(Rot.X+Angle2)) ;
  97.     Pom.Z =Pos.Z +((cosf(Rot.X+Angle2) *1.0f) * cosf(Rot.Y));
  98.     Pom.X =Pos.X +((cosf(Rot.X+Angle2) *1.0f) * sinf(Rot.Y));
  99.  
  100.     Down = CreatePlanePoint(Pos,Pom);
  101.  
  102. }
  103.  
  104.  
  105. //------------------------------------------------------------------
  106. // Name: LookAt()
  107. // Desc: Vypocita orezavacie roviny
  108. //------------------------------------------------------------------
  109. void CAMERA::RefreshLookAt()
  110. {
  111.     
  112.     //oneskorenie
  113.     Pos.X += (ActPos.X-Pos.X)*Power(0.11f);
  114.     Pos.Y += (ActPos.Y-Pos.Y)*Power(0.11f);
  115.     Pos.Z += (ActPos.Z-Pos.Z)*Power(0.11f);
  116.  
  117.     //vypocita maticu pohladu
  118.     D3DXVECTOR3 vEyePt( Pos.X, Pos.Y, Pos.Z );
  119.     D3DXVECTOR3 vLookatPt( Lok.X, Lok.Y,Lok.Z );
  120.     D3DXVECTOR3 vUpVec(0.0f, 1.0f, 0.0f );
  121.     
  122.     D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec );
  123.     
  124.     //obnovi matico pohladu
  125.     g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView);
  126.  
  127.     //vypocita rotaciu
  128.     VECTOR3D Sme;
  129.     Sub(&Sme,Lok,Pos);
  130.     Normalize(&Sme);
  131.     Rot.X = asinf(Sme.Y);
  132.     Rot.Y = asinf(Sme.X);
  133.     if (Sme.Z <= 0.0f)
  134.     {
  135.         Rot.Y = 3.1418f - Rot.Y;
  136.     }
  137.  
  138.     //vypocita frustrum roviny
  139.     CalcFrustrumPlanes();
  140.  
  141. }
  142.  
  143. //------------------------------------------------------------------
  144. // Name: FrustrumSphere()
  145. // Desc: frustrum culling pre gulu v 3D, funkcia vracia true 
  146. //       ak sa gula nachadza v polhlade kamery
  147. //------------------------------------------------------------------
  148. bool CAMERA::FrustrumSphere(VECTOR3D S,float P)
  149. {
  150.  
  151.     bool VLeft = false;
  152.     bool VRight = false;
  153.     bool VUp = false;
  154.     bool VDown = false;
  155.     bool VBack = false;
  156.     bool VFront = false;
  157.  
  158.     //BACK
  159.     if (PointPlane(Back,S) > -P)
  160.         VBack = true;
  161.  
  162.     //FRONT
  163.     if (VBack == true)
  164.     {
  165.         if (PointPlane(Front,S) > -P)
  166.             VFront = true;
  167.     }
  168.  
  169.     //LEFT
  170.     if (VFront == true)
  171.     {
  172.         if (PointPlane(Left,S) > -P)
  173.             VLeft = true;
  174.     }
  175.  
  176.     //RIGHT
  177.     if (VLeft == true)
  178.     {
  179.         if (PointPlane(Right,S) > -P)
  180.             VRight = true;
  181.     }
  182.  
  183.     //UP
  184.     if (VRight == true)
  185.     {
  186.         if (PointPlane(Up,S) > -P)
  187.             VUp = true;
  188.     }
  189.  
  190.     //DOWN
  191.     if (VUp == true)
  192.     {
  193.         if (PointPlane(Down,S) > -P)
  194.             VDown = true;
  195.     }
  196.  
  197.     return VDown;
  198.  
  199. }
  200.  
  201. //------------------------------------------------------------------
  202. // Name: FrustrumBox()
  203. // Desc: frustrum culling kvader, funkcia vracia true ak sa kvader
  204. //       nachadza v poh╛ade kamery
  205. //------------------------------------------------------------------
  206. bool CAMERA::FrustrumBox(VECTOR3D Min,VECTOR3D Max)
  207. {
  208.  
  209.     VECTOR3D Centre;
  210.     float Polomer;
  211.  
  212.     Centre.X = (Min.X + Max.X)/2.0f;
  213.     Centre.Y = (Min.Y + Max.Y)/2.0f;
  214.     Centre.Z = (Min.Z + Max.Z)/2.0f;
  215.  
  216.     Polomer = CalcDistance(Centre,Min);
  217.  
  218.     bool Vys = FrustrumSphere(Centre,Polomer);
  219.  
  220.     return Vys;
  221.  
  222. }
  223.  
  224.