织梦CMS - 轻松建站从此开始!

罗索

使用OpenGL绘制一颗围棋子

落鹤生 发布于 2013-12-02 20:55 点击:次 
用OpenGL来绘制一个围棋子的完整源码实现及示例调用。
TAG: OpenGL  围棋  

 

  1. /******************************************//** 
  2. * 函数名称:    DrawChess 
  3. * 功能描述:    绘制一个围棋子。 
  4. * 参 数:    a    >> 底部半径; 
  5. * 参 数:    b    >> 底部距离圆心距离; 
  6. * 参 数:    c    >> 侧面半径; 
  7. * 参 数:    n    >> 分割粒度; 
  8. * 返回值:     
  9. * 其它说明:     
  10. * 修改日期        修改人            修改内容 
  11. * ------------------------------------------ 
  12. * 2011-08-28    Cloud         创建 
  13. *****************************************/ 
  14. void DrawChess(double a, double b, double c, int n) 
  15.     const double PI = 3.14159265358979323846; 
  16.     double fRange1 = PI - atan(a / (b + c));            //侧面弧度区间 
  17.     double R = sqrt(a * a + (b + c) * (b + c)) + c;        //大圆顶半径 
  18.     double fRange2 = atan(a / (b + c));                    //顶部弧度区间 
  19.     double vPos[3], vNormal[3];                            //顶点位置和法线方向 
  20.   
  21.     for (int i=0; i<n; i++) 
  22.     { 
  23.         for (int j=0; j<n; j++) 
  24.         { 
  25.             ;//底面 
  26. #define FILL1(n1, n2) \ 
  27.             {\ 
  28.             vPos[0] = (-a * (n1) / n) * cos((n2) * (2.0 * PI) / n);\ 
  29.             vPos[1] = b;\ 
  30.             vPos[2] = (-a * (n1) / n) * sin((n2) * (2.0 * PI) / n);\ 
  31.             vNormal[0] = 0;\ 
  32.             vNormal[1] = -1.0;\ 
  33.             vNormal[2] = 0;    \ 
  34.             }\ 
  35.   
  36. #define DRAW_TRIANGLE(x) \ 
  37.             {\ 
  38.             glBegin(GL_TRIANGLE_STRIP);\ 
  39.             FILL##x(i, j);            glNormal3dv(vNormal); glVertex3dv(vPos);\ 
  40.             FILL##x(i + 1, j);        glNormal3dv(vNormal); glVertex3dv(vPos);\ 
  41.             FILL##x(i, j + 1);        glNormal3dv(vNormal); glVertex3dv(vPos);\ 
  42.             FILL##x(i + 1, j + 1);    glNormal3dv(vNormal); glVertex3dv(vPos);\ 
  43.             glEnd();\ 
  44.             }\ 
  45.   
  46.             DRAW_TRIANGLE(1); 
  47.   
  48.             //侧面 
  49. #define FILL2(n1, n2) \ 
  50.             {\ 
  51.             vPos[0] = (-a - c * sin((n1) * fRange1 / n)) * cos((n2) * (2.0 * PI) / n);\ 
  52.             vPos[1] = b + c - c * cos((n1) * fRange1 / n);\ 
  53.             vPos[2] = (-a - c * sin((n1) * fRange1 / n)) * sin((n2) * (2.0 * PI) / n);\ 
  54.             vNormal[0] = -sin((n1) * fRange1 / n) * cos((n2) * (2.0 * PI) / n);\ 
  55.             vNormal[1] = -cos((n1) * fRange1 / n);\ 
  56.             vNormal[2] = -sin((n1) * fRange1 / n) * sin((n2) * (2.0 * PI) / n);\ 
  57.             }\ 
  58.   
  59.             DRAW_TRIANGLE(2); 
  60.   
  61.             //顶部 
  62. #define FILL3(n1, n2) \ 
  63.             {\ 
  64. vPos[0] = (-R * sin(fRange2 - fRange2 * (n1) / n)) * cos((n2) * (2.0 * PI) / n);\ 
  65. vPos[1] = R * cos(fRange2 - fRange2 * (n1) / n);\ 
  66. vPos[2] = (-R * sin(fRange2 - fRange2 * (n1) / n)) * sin((n2) * (2.0 * PI) / n);\ 
  67. vNormal[0] = -sin(fRange2 - fRange2 * (n1) / n) * cos((n2) * (2.0 * PI) / n);\ 
  68. vNormal[1] = cos(fRange2 - fRange2 * (n1) / n);\ 
  69. vNormal[2] = -sin(fRange2 - fRange2 * (n1) / n) * sin((n2) * (2.0 * PI) / n);\ 
  70.             }\ 
  71.   
  72.             DRAW_TRIANGLE(3); 
  73.         } 
  74.     } 
  75. }  

DrawChess(2, 1, 0.8, 50)的绘制效果如下:

DrawChess(2, 1, 0.8, 20)的网格图图效果如下(我把镜头拉近了因此显得大一些):

(acloud)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201312/16830.html]
本文出处:博客园 作者:acloud
顶一下
(1)
100%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容