「OpenGL 1 」关于基本图形绘制
来源:互联网 发布:网络教育专科学费多少 编辑:程序博客网 时间:2024/06/05 20:16
一、一个简单的OpenGL程序如下:(注意,如果需要编译并运行,需要正确安装GLUT,安装方法如上所述)
<pre name="code" class="cpp">#include<GL/glut.h> //GLUT的头文件,OpenGL程序一般还要包含和,但GLUT的头文件中已经自动将这两个文件包含了cvoid myDisplay(void){ glClear(GL_COLOR_BUFFER_BIT); glRectf(-0.5f, -0.5f, 0.5f, 0.5f); //画一个矩形,四个参数分别表示了位于对角线上的两个点的横、纵坐标。 glFlush(); //保证前面的OpenGL命令立即执行(而不是让它们在缓冲区中等待)。其作用跟fflush(stdout)类似。}int main(int argc, char *argv[]){ glutInit(&argc, argv); //对GLUT进行初始化,一般照抄这句glutInit(&argc, argv)就可以了。 glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); //设置显示方式,其中GLUT_RGB表示使用RGB颜色,与之对应的还有GLUT_INDEX(表示使用索引颜色)。GLUT_SINGLE表示使用单缓冲,与之对应的还有GLUT_DOUBLE(使用双缓冲)。 glutInitWindowPosition(100, 100); glutInitWindowSize(400, 400); glutCreateWindow("第一个OpenGL程序"); //注意:窗口被创建后,并不立即显示到屏幕上。需要调用glutMainLoop才能看到窗口。 glutDisplayFunc(&myDisplay); //设置一个函数,当需要进行画图时,这个函数就会被调用。 glutMainLoop(); //进行一个消息循环 return 0;}
二、绘制直线
程序代码:
void myDisplay(void){ glClear(GL_COLOR_BUFFER_BIT); glBegin( GL_LINES ); //在这里填上你所希望的模式 glVertex2f(0.0f, 0.0f); glVertex2f(0.5f, 0.0f); //在这里使用glVertex*系列函数 指定你所希望的顶点位置 glEnd(); glFlush();}
把这段代码改成你喜欢的样子,然后用它替换第一课中的myDisplay函数,编译后即可运行。
结果如图:
正五边形:
#include <math.h>const int n = 5;const GLfloat R = 0.5f;const GLfloat Pi = 3.1415926536f;void myDisplay(void){ int i; glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_POLYGON); for(i=1;i<=n; i++) glVertex2f(R*cos(2*Pi/n*i), R*sin(2*Pi/n*i)); glEnd(); glFlush();}
(以正多边形中心为原点,将一个点先固定在y轴上。角度总为360,2Pi,除以n得到每条边对应角的角度,再乘以i得到n个顶点的位置)
以n=5为例。
结果:
n越大越接近圆,以n=50为例子:
四、绘制正五角星
#include <math.h>const GLfloat Pi = 3.1415926536f;void myDisplay(void){ GLfloat a = 1 / (2-2*cos(72*Pi/180)); GLfloat bx = a * cos(18 * Pi/180); GLfloat by = a * sin(18 * Pi/180); GLfloat cy = -a * cos(18 * Pi/180); GLfloat PointA[2] = { 0, a }, PointB[2] = { bx, by }, PointC[2] = { 0.5, cy }, PointD[2] = { -0.5, cy }, PointE[2] = { -bx, by }; glClear(GL_COLOR_BUFFER_BIT); // 按照A->C->E->B->D->A的顺序,可以一笔将五角星画出 glBegin(GL_LINE_LOOP); glVertex2fv(PointA); glVertex2fv(PointC); glVertex2fv(PointE); glVertex2fv(PointB); glVertex2fv(PointD); glEnd(); glFlush();}
(长度a的算法,个人更偏向于1 / (2*sin(36*Pi/180)),搞不懂为何与1 / (2-2*cos(72*Pi/180))等价???)
将五角星结果如图:
五、绘制正弦函数图形
#include <math.h>const GLfloat factor = 0.1f;void myDisplay(void){ GLfloat x; glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_LINES); glVertex2f(-1.0f, 0.0f); glVertex2f(1.0f, 0.0f); // 以上两个点可以画x轴 glVertex2f(0.0f, -1.0f); glVertex2f(0.0f, 1.0f); // 以上两个点可以画y轴 glEnd(); glBegin(GL_LINE_STRIP); for(x=-1.0f/factor; x<1.0f/factor; x+=0.01f) { glVertex2f(x*factor, sin(x)*factor); } glEnd(); glFlush();}
(默认坐标-1到1是怎么回事???)
结果如图:
0 0
- 「OpenGL 1 」关于基本图形绘制
- OPENGL基本图形绘制
- OpenGL绘制基本图形单元的方法
- OpenGL学习(2)基本图形绘制
- android opengl 原理及开发(2)绘制基本图形
- 【OpenGL】学习笔记之一 绘制基本图形单元的方法
- OpenGL基本图形绘制方式比较(glBegin,glCallList,glVertexPointer,VBO)
- opengl 绘制简单图形
- OpenGL绘制简单图形
- OpenGL简单图形绘制
- OpenGL---绘制简单图形
- OpenGL 绘制二维图形
- OpenGL--绘制基础图形
- 基本图形绘制
- 绘制基本图形
- Ogre 绘制基本图形
- 基本图形绘制
- QT 基本图形绘制
- POJ 3984 迷宫问题
- how to reveal in finder or show in explorer with qt
- 【android学习笔记】关于相对布局RelativeLayout的各种属性介绍
- UVa 455 周期串
- Http协议详解
- 「OpenGL 1 」关于基本图形绘制
- C语言大世界————02剑指指针
- Spring整合Struts2注意事项
- c++中冒号(:)和双冒号(::)的用法
- Reflected File Download - A New Web Attack Vector
- UVa 10340 子序列
- 蛋疼的Android输入法
- HTTP 状态代码
- 解释为什么imgView要打开点击事件【事件响应链】