游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2902|回复: 0

Matrix 类示例

[复制链接]

2万

主题

2万

帖子

6万

积分

论坛元老

Rank: 8Rank: 8

积分
66484
QQ
发表于 2009-2-16 11:42:00 | 显示全部楼层 |阅读模式
http://picasaweb.google.com/lh/p ... sbQ?feat=directlink

  1. #include<hgl/win.h>
  2. #include<hgl/OpenGL.H>
  3. #include<hgl/FlowObject.H>
  4. #include<hgl/Matrix.H>
  5. #include<hgl/TileFont.H>
  6.        
  7. const float corners[]=      //立方体的8个点原始坐标
  8. {
  9.     -25.0f, 25.0f, 25.0f,
  10.      25.0f, 25.0f, 25.0f,
  11.      25.0f,-25.0f, 25.0f,
  12.     -25.0f,-25.0f, 25.0f,
  13.     -25.0f, 25.0f,-25.0f,
  14.      25.0f, 25.0f,-25.0f,
  15.      25.0f,-25.0f,-25.0f,
  16.     -25.0f,-25.0f,-25.0f
  17. };
  18.        
  19. enum WORK_MODE  //工作模式枚举
  20. {
  21.     wmMove=0,   //移动
  22.     wmScale,    //缩放
  23.     wmRotate    //旋转
  24. };
  25.        
  26. wchar_t *WORK_NAME[]=
  27. {
  28.     L"Move",
  29.     L"Scale",
  30.     L"Rotate"
  31. };
  32.        
  33. using namespace hgl;
  34. class TestObject:public FlowObject
  35. {
  36.     TileFont *fnt;
  37.        
  38.     Matrix m;                                   //定义一个变换矩阵
  39.     Vertex3f move,scale,rotate;
  40.        
  41.     Vertex3f coord[8];
  42.     int index[24];
  43.        
  44.     WORK_MODE mode;
  45.     wchar_t axis;
  46.        
  47.     bool use_hard;
  48.        
  49.     /*       4               5
  50.             *---------------*
  51.            /|              /|
  52.         0 / |           1 / |
  53.          *--+------------*  |
  54.          |  |            |  |
  55.          |  |            |  | 6
  56.          |  *------------+--*
  57.          | / 7           | /
  58.          |/              |/
  59.          *---------------*
  60.         3               2
  61.     */
  62.        
  63. private:
  64.        
  65.     void DrawBox()
  66.     {
  67.         int *p=index;
  68.        
  69.         for(int i=0;i<6;i++)
  70.         {
  71.             glBegin(GL_LINE_LOOP);
  72.             for(int j=0;j<4;j++)
  73.                 glVertex3fv(coord[*p++]);
  74.             glEnd();
  75.         }
  76.     }
  77.        
  78.     bool KeyDownProc(uint key)
  79.     {
  80.         switch(key)
  81.         {
  82.             case kbM:
  83.             case kbT: mode =wmMove;break;                   // T/M 进入移动模式
  84.             case kbS: mode =wmScale;break;                  // S 进入缩放模式
  85.             case kbR: mode =wmRotate;break;                 // R 进入旋转模式
  86.        
  87.             case kbX: axis ='X';break;                      // X 处理X轴
  88.             case kbY: axis ='Y';break;                      // Y 处理Y轴
  89.             case kbZ: axis ='Z';break;                      // Z 处理Z轴
  90.        
  91.             case kbSpace:
  92.             case kbEnter:   move.Zero();                    // 空格/回车 数据复位
  93.                             scale.One();
  94.                             rotate.Zero();
  95.                             break;
  96.        
  97.             case kbH:       use_hard=!use_hard;break;       // 是否使用硬件处理
  98.        
  99.             default:  return(false);
  100.         }
  101.        
  102.         return(true);
  103.     }
  104.        
  105.     bool KeyPressProc(uint key)
  106.     {
  107.         float value=0;
  108.        
  109.         if(key==kbMinus )value=-1;else                      // - 减少量
  110.         if(key==kbEquals)value= 1;else                      // + 增加量
  111.             return(false);
  112.        
  113.         float *p;
  114.        
  115.         if(mode==wmMove     )p=move;else
  116.         if(mode==wmScale    ){value/=10.0f;p=scale;}else
  117.         if(mode==wmRotate   )p=rotate;else
  118.             return(false);
  119.        
  120.         if(axis=='X')*(p+0)+=value;else
  121.         if(axis=='Y')*(p+1)+=value;else
  122.         if(axis=='Z')*(p+2)+=value;else
  123.             return(false);
  124.        
  125.         return(true);
  126.     }
  127.        
  128. public:
  129.        
  130.     TestObject()
  131.     {
  132.         const int indexes[]=
  133.         {
  134.             0,1,2,3,
  135.             4,5,1,0,
  136.             3,2,6,7,
  137.             5,4,7,6,
  138.             1,5,6,2,
  139.             4,0,3,7
  140.         };
  141.        
  142.         memcpy(index,indexes,sizeof(indexes));
  143.        
  144.         #ifdef __BORLANDC__
  145.             OnKeyDown =KeyDownProc;                                 //设置按键按下处理
  146.             OnKeyPress=KeyPressProc;                                //设置按键超时处理
  147.         #else
  148.             SetEventCall(OnKeyDown, this,TestObject::KeyDownProc);  //设置按键按下处理
  149.             SetEventCall(OnKeyPress,this,TestObject::KeyPressProc); //设置按键超时处理
  150.         #endif//
  151.        
  152.         fnt=GetFont();                                  //取得默认字体
  153.        
  154.         move.Zero();
  155.         scale.One();
  156.         rotate.Zero();
  157.        
  158.         mode=wmMove;
  159.         axis='X';
  160.        
  161.         OpenLineSmooth();                               //开启线条平滑
  162.     }
  163.        
  164.     void Draw()
  165.     {
  166.         ClearScreen();
  167.         To3DMode();
  168.         glTranslatef(0,0,-200);
  169.        
  170.         CloseTexture();
  171.         OpenBlend(GL_SRC_ALPHA,GL_ONE);
  172.         glColor(1,1,1,1);
  173.         {
  174.             memcpy(coord,corners,sizeof(corners));      //恢复立方体坐标原始数据
  175.        
  176.             m.LoadIdentity();                           //恢复缺省矩阵
  177.        
  178.             m.Translate(move.x,move.y,move.z);          //设置移动
  179.             m.Scale(scale.x,scale.y,scale.z);           //设置缩放
  180.        
  181.             m.Rotate(rotate.x,1,0,0);                   //设置绕X轴旋转
  182.             m.Rotate(rotate.y,0,1,0);                   //设置绕Y轴旋转
  183.             m.Rotate(rotate.z,0,0,1);                   //设置绕Z轴旋转
  184.        
  185.             if(use_hard)
  186.             {
  187.                 //使用硬件处理矩阵
  188.        
  189.                 glMultMatrixf(m);                           //改变当前OpenGL矩阵
  190.             }
  191.             else
  192.             {
  193.                 //软件处理矩阵
  194.        
  195.                 for(int i=0;i<8;i++)
  196.                     coord[i]*=m;                            //将所有坐标乘上变换矩阵
  197.             }
  198.        
  199.             DrawBox();                                      //绘制box
  200.         }
  201.        
  202.         //输出信息到屏幕
  203.        
  204.         To2DMode();
  205.         int row=0;
  206.         int gap=14;
  207.        
  208.         fnt->DrawFormat(0,row,L"Move  : %6.2f,%6.2f,%6.2f",move.x,  move.y,     move.z);    row+=gap;
  209.         fnt->DrawFormat(0,row,L"Scale : %6.2f,%6.2f,%6.2f",scale.x, scale.y,    scale.z);   row+=gap;
  210.         fnt->DrawFormat(0,row,L"Rotate: %6.2f,%6.2f,%6.2f",rotate.x,rotate.y,   rotate.z);  row+=gap;
  211.         row+=gap;
  212.        
  213.         fnt->DrawFormat(0,row,L"Matrix * Vertex : %s",use_hard?L"OpenGL Hardware":L"Software");row+=gap;
  214.         fnt->DrawFormat(0,row,L"Work Mode: %s",WORK_NAME[mode]);row+=gap;
  215.         fnt->DrawFormat(0,row,L"Work Asix: %c",axis);           row+=gap;
  216.         row+=gap;
  217.        
  218.         for(int i=0;i<4;i++)
  219.         {
  220.             float *p=m.m+i*4;
  221.        
  222.             fnt->DrawFormat(0,row,L"Matrix[%d]=%6.2f,%6.2f,%6.2f,%6.2f",i,p[0],p[1],p[2],p[3]);
  223.             row+=gap;
  224.         }
  225.         row+=gap;
  226.        
  227.         for(int i=0;i<8;i++)
  228.         {
  229.             fnt->DrawFormat(0,row,L"Coord[i]=%6.2f,%6.2f,%6.2f",coord[i].x,coord[i].y,coord[i].z);
  230.             row+=gap;
  231.         }
  232.     }
  233. };
  234.        
  235. void GameMain(int,wchar_t **)
  236. {
  237.     SystemInitInfo sii;
  238.        
  239.     sii.info.ProjectName=L"矩阵类测试";
  240.     sii.info.ProjectCode=L"Matrix Test";
  241.        
  242.     if(!Init(&sii))return;                              //初始化引擎
  243.        
  244.     SetStart(new TestObject);                           //设置起始对象
  245.        
  246.     RunApplication();                                   //开始运行程序
  247. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2024-5-6 21:34

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表