VS2012下基于Glut OpenGL显示一些立体图形示例程序:

Glut下提供了一些现成的绘制立体的API,如glutWireSphere绘制球,glutWireCone绘制椎体,glutWireCube绘制立体,glutWireTorus绘制甜圈,glutWireTeapot绘制茶壶,glutWireOctahedron绘制八面体。

    Demo程序利用这些API绘制相应的立体,单击鼠标右键在弹出的菜单里可以选择需要绘制的立体以及是wire还是solid填充的,按键盘的UP、DOWN、LEFT、RIGHT按键可以旋转坐标系。由于Glut提供的多面体API默认半径是1.0f的,我使用glScalef对其进行了放大。示例效果如下:




源代码:

[cpp]  view plain copy
  1. // GlutDemo.cpp : 定义控制台应用程序的入口点。  
  2. //  
  3.   
  4.   
  5. #include "stdafx.h"  
  6. #include <gl/glut.h>  
  7. #include <math.h>  
  8. //圆周率宏  
  9. #define GL_PI 3.1415f  
  10. //获取屏幕的宽度  
  11. GLint SCREEN_WIDTH=0;  
  12. GLint SCREEN_HEIGHT=0;  
  13. //设置程序的窗口大小  
  14. GLint windowWidth=400;  
  15. GLint windowHeight=300;  
  16. //绕x轴旋转角度  
  17. GLfloat xRotAngle=0.0f;  
  18. //绕y轴旋转角度  
  19. GLfloat yRotAngle=0.0f;  
  20. //受支持的点大小范围  
  21. GLfloat sizes[2];  
  22. //受支持的点大小增量  
  23. GLfloat step;  
  24.   
  25. enum MODELS{  
  26.     SPHERE=0,  
  27.     CONE,  
  28.     CUBE,  
  29.     TORUS,  
  30.     DODECAHEDRON,  
  31.     TEAPOT,  
  32.     OCTAHEDRON,  
  33.     TETRAHEDRON,  
  34.     ICOSAHEDRON  
  35. };  
  36. GLint iModel=SPHERE;  
  37. GLboolean bWire=GL_TRUE;  
  38. //菜单回调函数  
  39. void processMenu(int value){  
  40.     switch(value){  
  41.         case 1:  
  42.             iModel=SPHERE;  
  43.             break;  
  44.         case 2:  
  45.             iModel=CONE;  
  46.             break;  
  47.         case 3:  
  48.             iModel=CUBE;  
  49.             break;  
  50.         case 4:  
  51.             iModel=TORUS;  
  52.             break;  
  53.         case 5:  
  54.             iModel=DODECAHEDRON;  
  55.             break;  
  56.         case 6:  
  57.             iModel=TEAPOT;  
  58.             break;  
  59.         case 7:  
  60.             iModel=OCTAHEDRON;  
  61.             break;  
  62.         case 8:  
  63.             iModel=TETRAHEDRON;  
  64.             break;  
  65.         case 9:  
  66.             iModel=ICOSAHEDRON;  
  67.             break;  
  68.         case 10:  
  69.             bWire=GL_TRUE;  
  70.             break;  
  71.         case 11:  
  72.             bWire=GL_FALSE;  
  73.             break;  
  74.         default:  
  75.             break;  
  76.     }  
  77.     //重新绘制  
  78.     glutPostRedisplay();  
  79. }  
  80. //显示回调函数  
  81. void renderScreen(void){  
  82.     //将窗口颜色清理为黑色  
  83.     glClearColor(0.0f, 0.0f, 0.0f, 0.0f);  
  84.     //将模板缓冲区值全部清理为1  
  85.     glClearStencil(1);  
  86.     //使能模板缓冲区  
  87.     glEnable(GL_STENCIL_TEST);  
  88.     //把整个窗口清理为当前清理颜色:黑色。清除深度缓冲区、模板缓冲区  
  89.     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);  
  90.     //将当前Matrix状态入栈  
  91.     glPushMatrix();  
  92.     //坐标系绕x轴旋转xRotAngle  
  93.     glRotatef(xRotAngle,1.0f,0.0f,0.0f);  
  94.     //坐标系绕y轴旋转yRotAngle  
  95.     glRotatef(yRotAngle,0.0f,1.0f,0.0f);  
  96.     //进行平滑处理   
  97.     glEnable(GL_POINT_SMOOTH);  
  98.     glHint(GL_POINT_SMOOTH,GL_NICEST);  
  99.     glEnable(GL_LINE_SMOOTH);  
  100.     glHint(GL_LINE_SMOOTH,GL_NICEST);  
  101.     glEnable(GL_POLYGON_SMOOTH);  
  102.     glHint(GL_POLYGON_SMOOTH,GL_NICEST);  
  103.       
  104.     //白色绘制坐标系  
  105.     glColor3f(1.0f,1.0f,1.0f);  
  106.     glBegin(GL_LINES);  
  107.         glVertex3f(-9.0f,0.0f,0.0f);  
  108.         glVertex3f(9.0f,0.0f,0.0f);  
  109.         glVertex3f(0.0f,-9.0f,0.0f);  
  110.         glVertex3f(0.0f,9.0f,0.0f);  
  111.         glVertex3f(0.0f,0.0f,-9.0f);  
  112.         glVertex3f(0.0f,0.0f,9.0f);  
  113.     glEnd();  
  114.   
  115.     glPushMatrix();  
  116.     glTranslatef(9.0f,0.0f,0.0f);  
  117.     glRotatef(90.0f,0.0f,1.0f,0.0f);  
  118.     glutSolidCone(0.3,0.6,10,10);  
  119.     glPopMatrix();  
  120.   
  121.     glPushMatrix();  
  122.     glTranslatef(0.0f,9.0f,0.0f);  
  123.     glRotatef(-90.0f,1.0f,0.0f,0.0f);  
  124.     glutSolidCone(0.3,0.6,10,10);  
  125.     glPopMatrix();  
  126.   
  127.     glPushMatrix();  
  128.     glTranslatef(0.0f,0.0f,9.0f);  
  129.     glRotatef(90.0f,0.0f,0.0f,1.0f);  
  130.     glutSolidCone(0.3,0.6,10,10);  
  131.     glPopMatrix();  
  132.   
  133.     //设置绘画颜色为金色  
  134.     glColor3f(0.0f,1.0f,0.0f);  
  135.     switch(iModel){  
  136.         //球  
  137.         case SPHERE:  
  138.             if(bWire){  
  139.                 glutWireSphere(8.0f,20,20);  
  140.             }  
  141.             else{  
  142.                 glutSolidSphere(8.0f,20,20);  
  143.             }  
  144.             break;  
  145.         //锥体  
  146.         case CONE:  
  147.             if(bWire){  
  148.                 glutWireCone(4.0f,8.0f,20,20);  
  149.             }  
  150.             else{  
  151.                 glutSolidCone(4.0f,8.0f,20,20);  
  152.             }  
  153.             break;  
  154.         //立体  
  155.         case CUBE:  
  156.             if(bWire){  
  157.                 glutWireCube(8.0f);  
  158.             }  
  159.             else{  
  160.                 glutSolidCube(8.0f);  
  161.             }  
  162.             break;  
  163.         //甜圈  
  164.         case TORUS:  
  165.             if(bWire){  
  166.                 glutWireTorus(3.0f,6.0f,20,20);  
  167.             }  
  168.             else{  
  169.                 glutSolidTorus(3.0f,6.0f,20,20);  
  170.             }  
  171.             break;  
  172.         //十六面体,默认半径1.0  
  173.         case DODECAHEDRON:  
  174.             glScalef(6.0f,6.0f,6.0f);//x,y,z轴均放大6倍  
  175.             if(bWire){  
  176.                 glutWireDodecahedron();  
  177.             }  
  178.             else{  
  179.                 glutSolidDodecahedron();  
  180.             }  
  181.             break;  
  182.         //茶壶  
  183.         case TEAPOT:  
  184.             if(bWire){  
  185.                 glutWireTeapot(8.0f);  
  186.             }  
  187.             else{  
  188.                 glutSolidTeapot(8.0f);  
  189.             }  
  190.             break;  
  191.         //八面体,默认半径1.0  
  192.         case OCTAHEDRON:  
  193.             glScalef(6.0f,6.0f,6.0f);//x,y,z轴均放大6倍  
  194.             if(bWire){  
  195.                 glutWireOctahedron();  
  196.             }  
  197.             else{  
  198.                 glutSolidOctahedron();  
  199.             }  
  200.             break;  
  201.         //四面体,默认半径1.0  
  202.         case TETRAHEDRON:  
  203.             glScalef(6.0f,6.0f,6.0f);//x,y,z轴均放大6倍  
  204.             if(bWire){  
  205.                 glutWireTetrahedron();  
  206.             }  
  207.             else{  
  208.                 glutSolidTetrahedron();  
  209.             }  
  210.             break;  
  211.         //二十面体,默认半径1.0  
  212.         case ICOSAHEDRON:  
  213.             glScalef(6.0f,6.0f,6.0f);//x,y,z轴均放大6倍  
  214.             if(bWire){  
  215.                 glutWireIcosahedron();  
  216.             }  
  217.             else{  
  218.                 glutSolidIcosahedron();  
  219.             }  
  220.             break;  
  221.         default:  
  222.             break;  
  223.     }  
  224.   
  225.     //恢复压入栈的Matrix  
  226.     glPopMatrix();  
  227.     //交换两个缓冲区的指针  
  228.     glutSwapBuffers();  
  229. }  
  230. //设置Redering State   
  231. void setupRederingState(void){  
  232.     //设置清理颜色为黑色  
  233.     glClearColor(0.0f,0.0,0.0,1.0f);  
  234.     //设置绘画颜色为绿色  
  235.     glColor3f(1.0f,1.0f,0.0f);  
  236.     //使能深度测试  
  237.     glEnable(GL_DEPTH_TEST);  
  238.     //获取受支持的点大小范围  
  239.     glGetFloatv(GL_POINT_SIZE_RANGE,sizes);  
  240.     //获取受支持的点大小增量  
  241.     glGetFloatv(GL_POINT_SIZE_GRANULARITY,&step);  
  242.     printf("point size range:%f-%f\n",sizes[0],sizes[1]);  
  243.     printf("point step:%f\n",step);  
  244. }  
  245. //窗口大小变化回调函数  
  246. void changSize(GLint w,GLint h){  
  247.     //横宽比率  
  248.     GLfloat ratio;  
  249.     //设置坐标系为x(-100.0f,100.0f)、y(-100.0f,100.0f)、z(-100.0f,100.0f)  
  250.     GLfloat coordinatesize=10.0f;  
  251.     //窗口宽高为零直接返回  
  252.     if((w==0)||(h==0))  
  253.         return;  
  254.     //设置视口和窗口大小一致  
  255.     glViewport(0,0,w,h);  
  256.     //对投影矩阵应用随后的矩阵操作  
  257.     glMatrixMode(GL_PROJECTION);  
  258.     //重置当前指定的矩阵为单位矩阵   
  259.     glLoadIdentity();  
  260.     ratio=(GLfloat)w/(GLfloat)h;  
  261.     //正交投影  
  262.     if(w<h)  
  263.         glOrtho(-coordinatesize,coordinatesize,-coordinatesize/ratio,coordinatesize/ratio,-coordinatesize,coordinatesize);  
  264.     else  
  265.         glOrtho(-coordinatesize*ratio,coordinatesize*ratio,-coordinatesize,coordinatesize,-coordinatesize,coordinatesize);  
  266.     //对模型视图矩阵堆栈应用随后的矩阵操作  
  267.     glMatrixMode(GL_MODELVIEW);  
  268.     //重置当前指定的矩阵为单位矩阵   
  269.     glLoadIdentity();  
  270. }  
  271.   
  272. //按键输入处理回调函数  
  273. void specialKey(int key,int x,int y){  
  274.   
  275.     if(key==GLUT_KEY_UP){  
  276.         xRotAngle-=5.0f;  
  277.     }  
  278.     else if(key==GLUT_KEY_DOWN){  
  279.         xRotAngle+=5.0f;  
  280.     }  
  281.     else if(key==GLUT_KEY_LEFT){  
  282.         yRotAngle-=5.0f;  
  283.     }  
  284.     else if(key==GLUT_KEY_RIGHT){  
  285.         yRotAngle+=5.0f;  
  286.     }  
  287.     //重新绘制  
  288.     glutPostRedisplay();  
  289. }  
  290.   
  291. int main(int argc, char* argv[])  
  292. {  
  293.     int nModelMenu;  
  294.     int nWireMenu;  
  295.     int nMainMenu;  
  296.     //初始化glut   
  297.     glutInit(&argc,argv);  
  298.     //使用双缓冲区、深度缓冲区、模板缓冲区  
  299.     glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH|GLUT_STENCIL);  
  300.     //获取系统的宽像素  
  301.     SCREEN_WIDTH=glutGet(GLUT_SCREEN_WIDTH);  
  302.     //获取系统的高像素  
  303.     SCREEN_HEIGHT=glutGet(GLUT_SCREEN_HEIGHT);  
  304.     //创建窗口,窗口名字为OpenGL Glut Demo  
  305.     glutCreateWindow("OpenGL Glut Demo");  
  306.     //设置窗口大小  
  307.     glutReshapeWindow(windowWidth,windowHeight);  
  308.     //窗口居中显示  
  309.     glutPositionWindow((SCREEN_WIDTH-windowWidth)/2,(SCREEN_HEIGHT-windowHeight)/2);  
  310.     //创建二级菜单  
  311.     nModelMenu=glutCreateMenu(processMenu);  
  312.     glutAddMenuEntry("Sphere",1);  
  313.     glutAddMenuEntry("Cone",2);  
  314.     glutAddMenuEntry("Cube",3);  
  315.     glutAddMenuEntry("Torus",4);  
  316.     glutAddMenuEntry("Dodecahedron",5);  
  317.     glutAddMenuEntry("Teapot",6);  
  318.     glutAddMenuEntry("Octahedron",7);  
  319.     glutAddMenuEntry("Tetrahedron",8);  
  320.     glutAddMenuEntry("Icosahedron",9);  
  321.     nWireMenu=glutCreateMenu(processMenu);  
  322.     glutAddMenuEntry("Wire",10);  
  323.     glutAddMenuEntry("Solid",11);  
  324.     nMainMenu=glutCreateMenu(processMenu);  
  325.     glutAddSubMenu("Model",nModelMenu);  
  326.     glutAddSubMenu("WireOrSolid",nWireMenu);  
  327.     //将菜单榜定到鼠标右键上  
  328.     glutAttachMenu(GLUT_RIGHT_BUTTON);  
  329.     //窗口大小变化时的处理函数  
  330.     glutReshapeFunc(changSize);  
  331.     //设置显示回调函数   
  332.     glutDisplayFunc(renderScreen);  
  333.     //设置按键输入处理回调函数  
  334.     glutSpecialFunc(specialKey);  
  335.     //设置全局渲染参数  
  336.     setupRederingState();  
  337.     glutMainLoop();  
  338.     return 0;  
  339. }  
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值