vs2012下基于Glut OpenGL GL_TRIANGLES示例程序:

在VS2012下使用glut GL_TRIANGLES绘制三角形示例程序,绘制的是两个三角形,效果如下图所示,按PC的UP,DOWN,LEFT,RIGHT按键可以从不同的角度查看该图形。GL_TRIANGLES连续点生成三角形的规则如下图所示:



源代码如下:

[cpp]  view plain  copy
  1. // GlutTriangleDemo.cpp : 定义控制台应用程序的入口点。  
  2. //  
  3.   
  4. #include "stdafx.h"  
  5. #include <gl/glut.h>  
  6. #include <math.h>  
  7. //圆周率宏  
  8. #define GL_PI 3.1415f  
  9. //获取屏幕的宽度  
  10. GLint SCREEN_WIDTH=0;  
  11. GLint SCREEN_HEIGHT=0;  
  12. //设置程序的窗口大小  
  13. GLint windowWidth=400;  
  14. GLint windowHeight=300;  
  15. //绕x轴旋转角度  
  16. GLfloat xRotAngle=0.0f;  
  17. //绕y轴旋转角度  
  18. GLfloat yRotAngle=0.0f;  
  19. //显示回调函数  
  20. void renderScreen(void){  
  21.     GLfloat x,y,z,angle;  
  22.     //把整个窗口清理为当前清理颜色:黑色  
  23.     glClear(GL_COLOR_BUFFER_BIT);  
  24.     //将当前Matrix状态入栈  
  25.     glPushMatrix();  
  26.     //坐标系绕x轴旋转xRotAngle  
  27.     glRotatef(xRotAngle,1.0f,0.0f,0.0f);  
  28.     //坐标系绕y轴旋转yRotAngle  
  29.     glRotatef(yRotAngle,0.0f,1.0f,0.0f);  
  30.   
  31.     //进行平滑处理   
  32.     glEnable(GL_LINE_SMOOTH);  
  33.     glHint(GL_LINE_SMOOTH,GL_NICEST);  
  34.   
  35.     //设置绘画颜色为白色  
  36.     glColor3f(1.0f,1.0f,1.0f);  
  37.     //绘制坐标系  
  38.     glBegin(GL_LINES);  
  39.         glVertex3f(-80.0f,0.0f,0.0f);  
  40.         glVertex3f(80.0f,0.0f,0.0f);  
  41.         glVertex3f(0.0f,-80.0f,0.0f);  
  42.         glVertex3f(0.0f,80.0f,0.0f);  
  43.         glVertex3f(0.0f,0.0f,-80.0f);  
  44.         glVertex3f(0.0f,0.0f,80.0f);  
  45.     glEnd();  
  46.   
  47.     glPushMatrix();  
  48.     glTranslatef(80.0f,0.0f,0.0f);  
  49.     glRotatef(90.0f,0.0f,1.0f,0.0f);  
  50.     glutWireCone(3,6,10,10);  
  51.     glPopMatrix();  
  52.   
  53.     glPushMatrix();  
  54.     glTranslatef(0.0f,80.0f,0.0f);  
  55.     glRotatef(-90.0f,1.0f,0.0f,0.0f);  
  56.     glutWireCone(3,6,10,10);  
  57.     glPopMatrix();  
  58.   
  59.     glPushMatrix();  
  60.     glTranslatef(0.0f,0.0f,80.0f);  
  61.     glRotatef(90.0f,0.0f,0.0f,1.0f);  
  62.     glutWireCone(3,6,10,10);  
  63.     glPopMatrix();  
  64.   
  65.     //设置绘画颜色为绿色  
  66.     glColor3f(0.0f,1.0f,0.0f);  
  67.     //开始绘制两个三角形  
  68.     glBegin(GL_TRIANGLES);  
  69.         glVertex3f(0.0f,0.0f,0.0f);  
  70.         glVertex3f(50.0f,0.0f,0.0f);  
  71.         glVertex3f(25.0f,25.0f,0.0f);  
  72.   
  73.         glVertex3f(-25.0f,0.0f,0.0f);  
  74.         glVertex3f(-75.0f,0.0f,0.0f);  
  75.         glVertex3f(-50.0f,25.0f,0.0f);  
  76.     //结束绘三角形  
  77.     glEnd();  
  78.       
  79.     //恢复压入栈的Matrix  
  80.     glPopMatrix();  
  81.     //交换两个缓冲区的指针  
  82.     glutSwapBuffers();  
  83. }  
  84. //设置Redering State   
  85. void setupRederingState(void){  
  86.     //设置清理颜色为黑色  
  87.     glClearColor(0.0f,0.0,0.0,1.0f);  
  88.     //设置绘画颜色为绿色  
  89.     glColor3f(0.0f,1.0f,0.0f);  
  90. }  
  91. //窗口大小变化回调函数  
  92. void changSize(GLint w,GLint h){  
  93.     //横宽比率  
  94.     GLfloat ratio;  
  95.     //设置坐标系为x(-100.0f,100.0f)、y(-100.0f,100.0f)、z(-100.0f,100.0f)  
  96.     GLfloat coordinatesize=100.0f;  
  97.     //窗口宽高为零直接返回  
  98.     if((w==0)||(h==0))  
  99.         return;  
  100.     //设置视口和窗口大小一致  
  101.     glViewport(0,0,w,h);  
  102.     //对投影矩阵应用随后的矩阵操作  
  103.     glMatrixMode(GL_PROJECTION);  
  104.     //重置当前指定的矩阵为单位矩阵   
  105.     glLoadIdentity();  
  106.     ratio=(GLfloat)w/(GLfloat)h;  
  107.     //正交投影  
  108.     if(w<h)  
  109.         glOrtho(-coordinatesize,coordinatesize,-coordinatesize/ratio,coordinatesize/ratio,-coordinatesize,coordinatesize);  
  110.     else  
  111.         glOrtho(-coordinatesize*ratio,coordinatesize*ratio,-coordinatesize,coordinatesize,-coordinatesize,coordinatesize);  
  112.     //对模型视图矩阵堆栈应用随后的矩阵操作  
  113.     glMatrixMode(GL_MODELVIEW);  
  114.     //重置当前指定的矩阵为单位矩阵   
  115.     glLoadIdentity();  
  116. }  
  117.   
  118. //按键输入处理回调函数  
  119. void specialKey(int key,int x,int y){  
  120.   
  121.     if(key==GLUT_KEY_UP){  
  122.         xRotAngle-=5.0f;  
  123.     }  
  124.     else if(key==GLUT_KEY_DOWN){  
  125.         xRotAngle+=5.0f;  
  126.     }  
  127.     else if(key==GLUT_KEY_LEFT){  
  128.         yRotAngle-=5.0f;  
  129.     }  
  130.     else if(key==GLUT_KEY_RIGHT){  
  131.         yRotAngle+=5.0f;  
  132.     }  
  133.     //重新绘制  
  134.     glutPostRedisplay();  
  135. }  
  136.   
  137. int main(int argc, char* argv[])  
  138. {  
  139.     //初始化glut   
  140.     glutInit(&argc,argv);  
  141.     //使用双缓冲区模式  
  142.     glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH);  
  143.     //获取系统的宽像素  
  144.     SCREEN_WIDTH=glutGet(GLUT_SCREEN_WIDTH);  
  145.     //获取系统的高像素  
  146.     SCREEN_HEIGHT=glutGet(GLUT_SCREEN_HEIGHT);  
  147.     //创建窗口,窗口名字为OpenGL TriAngle Demo  
  148.     glutCreateWindow("OpenGL TriAngle Demo");  
  149.     //设置窗口大小  
  150.     glutReshapeWindow(windowWidth,windowHeight);  
  151.     //窗口居中显示  
  152.     glutPositionWindow((SCREEN_WIDTH-windowWidth)/2,(SCREEN_HEIGHT-windowHeight)/2);  
  153.     //窗口大小变化时的处理函数  
  154.     glutReshapeFunc(changSize);  
  155.     //设置显示回调函数   
  156.     glutDisplayFunc(renderScreen);  
  157.     //设置按键输入处理回调函数  
  158.     glutSpecialFunc(specialKey);  
  159.     //设置全局渲染参数  
  160.     setupRederingState();  
  161.     glutMainLoop();  
  162.     return 0;  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值