文档章节

VS2012下基于Glut OpenGL绘制直线(添加设置直线宽度)示例程序

小青_1989
 小青_1989
发布于 2014/06/05 14:32
字数 782
阅读 66
收藏 0

在VS2012下使用glut绘制一系列直线的示例程序,绘制的是平行的几条直线,每条直线的宽度都不一样,效果如下图所示,按PC的UP,DOWN,LEFT,RIGHT按键可以从不同的角度查看该图形:


[cpp] view plaincopy

  1. // GlutLineswDemo.cpp : 定义控制台应用程序的入口点。  

  2. //  

  3. #include "stdafx.h"  

  4. #include <gl/glut.h>  

  5. #include <math.h>  

  6. //圆周率宏  

  7. #define GL_PI 3.1415f  

  8. //获取屏幕的宽度与高度  

  9. GLint SCREEN_WIDTH=0;  

  10. GLint SCREEN_HEIGHT=0;  

  11. //设置程序的窗口大小  

  12. GLint windowWidth=400;  

  13. GLint windowHeight=300;  

  14. //绕x轴旋转角度  

  15. GLfloat xRotAngle=0.0f;  

  16. //绕y轴旋转角度  

  17. GLfloat yRotAngle=0.0f;  

  18. //受支持的线宽大小范围  

  19. GLfloat width[2];  

  20. //受支持的线宽增量  

  21. GLfloat widthStep;  

  22. //显示回调函数  

  23. void renderScreen(void){  

  24.     GLfloat x,y,z,angle;  

  25.     //当前线的宽度  

  26.     GLfloat curWidth=0.0f;  

  27.     //把整个窗口清理为当前清理颜色:黑色  

  28.     glClear(GL_COLOR_BUFFER_BIT);  

  29.     //将当前Matrix状态入栈  

  30.     glPushMatrix();  

  31.     //坐标系绕x轴旋转xRotAngle  

  32.     glRotatef(xRotAngle,1.0f,0.0f,0.0f);  

  33.     //坐标系绕y轴旋转yRotAngle  

  34.     glRotatef(yRotAngle,0.0f,1.0f,0.0f);  

  35.     z=0.0f;  

  36.     curWidth=width[0];  

  37.     //进行平滑处理   

  38.     glEnable(GL_LINE_SMOOTH);  

  39.     glHint(GL_LINE_SMOOTH,GL_NICEST);  

  40.     //glEnable(GL_DEPTH_TEST);  

  41.     //绘制平行的直线  

  42.     for(x=-80.0f;x<=80.0f;x+=20.0f){  

  43.         glLineWidth(curWidth);  

  44.         //开始绘直线  

  45.         glBegin(GL_LINES);  

  46.         glVertex3f(x,80.0f,z);  

  47.         glVertex3f(x,-80.0f,z);  

  48.         //结束绘直线  

  49.         glEnd();  

  50.         curWidth+=1.0f;//widthStep;  

  51.     }  

  52.     //恢复压入栈的Matrix  

  53.     glPopMatrix();  

  54.     //交换两个缓冲区的指针  

  55.     glutSwapBuffers();  

  56. }  

  57. //设置Redering State   

  58. void setupRederingState(void){  

  59.     //设置清理颜色为黑色  

  60.     glClearColor(0.0f,0.0,0.0,1.0f);  

  61.     //设置绘画颜色为绿色  

  62.     glColor3f(0.0f,1.0f,0.0f);  

  63.     //获取受支持的线宽大小范围  

  64.     glGetFloatv(GL_LINE_WIDTH_RANGE,width);  

  65.     //获取受支持的线宽大小增量  

  66.     glGetFloatv(GL_LINE_WIDTH_GRANULARITY,&widthStep);  

  67.     printf("Line width range:%f-%f\n",width[0],width[1]);  

  68.     printf("Line width step:%f\n",widthStep);  

  69. }  

  70. //窗口大小变化回调函数  

  71. void changSize(GLint w,GLint h){  

  72.     //横宽比率  

  73.     GLfloat ratio;  

  74.     //设置坐标系为x(-100.0f,100.0f)、y(-100.0f,100.0f)、z(-100.0f,100.0f)  

  75.     GLfloat coordinatesize=100.0f;  

  76.     //窗口宽高为零直接返回  

  77.     if((w==0)||(h==0))  

  78.         return;  

  79.     //设置视口和窗口大小一致  

  80.     glViewport(0,0,w,h);  

  81.     //对投影矩阵应用随后的矩阵操作  

  82.     glMatrixMode(GL_PROJECTION);  

  83.     //重置当前指定的矩阵为单位矩阵   

  84.     glLoadIdentity();  

  85.     ratio=(GLfloat)w/(GLfloat)h;  

  86.     //正交投影  

  87.     if(w<h)  

  88.         glOrtho(-coordinatesize,coordinatesize,-coordinatesize/ratio,coordinatesize/ratio,-coordinatesize,coordinatesize);  

  89.     else  

  90.         glOrtho(-coordinatesize*ratio,coordinatesize*ratio,-coordinatesize,coordinatesize,-coordinatesize,coordinatesize);  

  91.     //对模型视图矩阵堆栈应用随后的矩阵操作  

  92.     glMatrixMode(GL_MODELVIEW);  

  93.     //重置当前指定的矩阵为单位矩阵   

  94.     glLoadIdentity();  

  95. }  

  96. //按键输入处理回调函数   

  97. void specialKey(int key,int x,int y){  

  98.   

  99.     if(key==GLUT_KEY_UP){  

  100.         xRotAngle-=5.0f;  

  101.     }  

  102.     else if(key==GLUT_KEY_DOWN){  

  103.         xRotAngle+=5.0f;  

  104.     }  

  105.     else if(key==GLUT_KEY_LEFT){  

  106.         yRotAngle-=5.0f;  

  107.     }  

  108.     else if(key==GLUT_KEY_RIGHT){  

  109.         yRotAngle+=5.0f;  

  110.     }  

  111.     //重新绘制  

  112.     glutPostRedisplay();  

  113. }  

  114.   

  115. int main(int argc, char* argv[])  

  116. {  

  117.     //初始化glut  

  118.     glutInit(&argc,argv);  

  119.     //使用双缓冲区模式  

  120.     glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH);  

  121.     //获取系统的宽像素  

  122.     SCREEN_WIDTH=glutGet(GLUT_SCREEN_WIDTH);  

  123.     //获取系统的高像素  

  124.     SCREEN_HEIGHT=glutGet(GLUT_SCREEN_HEIGHT);  

  125.     //创建窗口,窗口名字为OpenlGL Lines width Demo  

  126.     glutCreateWindow("OpenlGL Lines width Demo");  

  127.     //设置窗口大小  

  128.     glutReshapeWindow(windowWidth,windowHeight);  

  129.     //窗口居中显示  

  130.     glutPositionWindow((SCREEN_WIDTH-windowWidth)/2,(SCREEN_HEIGHT-windowHeight)/2);  

  131.     //设置窗口大小变化时的回调函数  

  132.     glutReshapeFunc(changSize);  

  133.     //设置显示回调函数  

  134.     glutDisplayFunc(renderScreen);  

  135.     //设置按键输入处理回调函数  

  136.     glutSpecialFunc(specialKey);  

  137.     //设置全局渲染参数  

  138.     setupRederingState();  

  139.     glutMainLoop();  

  140.     return 0;  

  141. }  



本文转载自:http://blog.csdn.net/yearafteryear/article/details/9052879

共有 人打赏支持
小青_1989
粉丝 3
博文 75
码字总数 12913
作品 0
大连
程序员
私信 提问
[翻译]PyCairo指南--基本绘图

PyCairo中的基本绘图 在PyCairo指南中的这个部分,我们将会绘制一些基本的元素。我们将绘制简单的直线,应用填充和stroke操作,我们将会讨论虚线,线帽和线的交合。 直线 直线是非常基本的向...

WolfCS
2013/05/20
0
0
直线方程在几何画板中的演示

从课本上的知识我们获知:具有某种共同性质(过某点、共斜率等)的直线的集合,叫做直线系。它的方程叫做直线系方程,直线系方程的特征是含参数的二元一次方程。那么几何画板作为初高中专用的...

学术研究软件
2016/06/14
21
0
iPhone之Quartz 2D系列--路径(3)Paths

以下几遍关于Quartz 2D博文都是转载自:http://www.cocoachina.com/bbs/u.php?action=topic&uid=38018 有关本章博客的代码实现,大家可以参考我的这遍博客:IOS用CGContextRef画各种图形(文字...

长平狐
2013/12/25
115
0
使用 PHP 快速生成 Flash 动画

Rich Internet Application 是 Web 2.0 中的新时髦词,并且就 Web 2.0 的实质而言,一个关键组件就是 Adobe Flash。了解如何将 Flash 动画集成到应用程序中,并使用 Ming 库动态生成 Flash ...

红薯
2009/12/18
2.4K
4
Quartz2D IOS绘图 线 椭圆 矩形 贝塞尔曲线 弧

// // ViewController.m // Quartz2D // // Created by dc008 on 15/12/7. // Copyright © 2015年 CXY. All rights reserved. // #import "ViewController.h" #import "CuiXiaoYu.h" @inter......

温暖c
2015/12/07
37
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周二乱弹 —— 其实我在地板也睡不着

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @witt-z :分享歌词: 阴天 在不开灯的房间,当所有思绪都一点一点沉淀。 分享莫文蔚的单曲《阴天》: 《阴天》- 莫文蔚 手机党少年们想听歌,...

小小编辑
30分钟前
28
5
微服务分布式事务实现

https://www.processon.com/view/link/5b2144d7e4b001a14d3d2d30

WALK_MAN
今天
3
0
《大漠烟尘》读书笔记及读后感文章3700字

《大漠烟尘》读书笔记及读后感文章3700字: 在这个浮躁的社会里,你有多久没有好好读完一本书了? 我们总觉得自己和别人不一样,所以当看到别人身上的问题时,很少有“反求诸己”,反思自己。...

原创小博客
今天
4
0
大数据教程(9.5)用MR实现sql中的jion逻辑

上一篇博客讲解了使用jar -jar的方式来运行提交MR程序,以及通过修改YarnRunner的源码来实现MR的windows开发环境提交到集群的方式。本篇博主将分享sql中常见的join操作。 一、需求 订单数据表...

em_aaron
今天
3
0
十万个为什么之什么是resultful规范

起源 越来越多的人开始意识到,网站即软件,而且是一种新型的软件。这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency)、高并发等特点...

尾生
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部