经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 软件/图像 » OpenGL » 查看文章
OpenGL:使用顶点数组法绘制正六面体
来源:cnblogs  作者:Sunrise_1018  时间:2018/11/27 10:05:21  对本文有异议

在今天的opengl的课程以及实验中,我们学习了如何使用顶点数组的方法来绘制图形,但相信还有很多同学对它的实际使用方法不太了解,我们就用我们今天实验课上的实例来简单讲解一下

题目及要求

绘制一个正六面体,正面以填充方式绘制,背面以轮廓线的形式绘制,坐标自拟

思路解析

首先,我们需要定义一个数组,用来存放所有的顶点,为了方便理解,我们可以画一个草图:

这样,我们就可以写出顶点坐标数组:

  1.  1 //存放所有顶点坐标的数组 2 float vertex_list[][3] = 3 { 4     {0,0,0}, 5     {1,0,0}, 6     {1,1,0}, 7     {0,1,0}, 8  9     {0,1,1},10     {1,1,1},11     {1,0,1},12     {0,0,1}13 };

接下来,我们需要一个顶点坐标的索引数组,索引数组用来表示的是顶点被绘制的顺序,每个点的编号代表的是顶点坐标数组中该点对应的下标。

例如,点(0,0,0)用数组表示为 vertex_list[0],则(0,0,0)为0号点,则上述数组中所有点的编号为:

 

 我们将顶点编号完毕之后,我们就可以来定义点的绘制顺序了。

我们用0123的顺序绘制第一个面,4567的顺序绘制第二个面,2761的顺序绘制第二个面,3450的顺序绘制第四个面。

写成数组形式如下:

  1. 1 //存放数组索引的数组,可以近似地理解为顶点被绘制的顺序2 int index_list[] =3 {4     0,1,2,3,5     4,5,6,7,6     2,7,6,1,7     3,4,5,08 };

 

这样一来,四个侧面都绘制完毕,由于上下两个面直接由四个侧面拼接而成了,所以没有必要非要绘制。

顶点数组和索引数组都被定义完毕,接下来我们可以进行正式的代码书写了。

完整代码及其结果

  1.  1 #include<gl/glut.h> 2 //存放所有顶点坐标的数组 3 float vertex_list[][3] = 4 { 5     {0,0,0}, 6     {1,0,0}, 7     {1,1,0}, 8     {0,1,0}, 9 10     {0,1,1},11     {1,1,1},12     {1,0,1},13     {0,0,1}14 };15 16 //存放数组索引的数组,可以近似地理解为顶点被绘制的顺序17 int index_list[] =18 {19     0,1,2,3,20     4,5,6,7,21     2,7,6,1,22     3,4,5,023 };24 25 void display(void)26 {27     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);28     glOrtho(-1, 2, -1, 2, -1, 2);    //设置屏幕的显示范围29     glPolygonMode(GL_FRONT, GL_FILL);    //设置正面为填充类型30     glPolygonMode(GL_BACK, GL_LINE);    //设置背面为轮廓线类型31     glFrontFace(GL_CCW);    //将逆时针设置为正面32     glRotatef(45, -1, 1, 0);    //将图形旋转一下以便看得更直观33 34     glEnableClientState(GL_VERTEX_ARRAY);    //启用顶点数组35     glVertexPointer(3, GL_FLOAT, 0, vertex_list);    //指定顶点数组36     //按照索引数组中指出的数组依次调用glVertex函数,16表示的是调用的次数37     glDrawElements(GL_QUADS, 16, GL_UNSIGNED_INT, index_list);38 39     glFlush();40 }41 int main(int argc, char**argv)42 {43     glutInit(&argc, argv);44     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);45     glutInitWindowPosition(200, 200);46     glutInitWindowSize(500, 500);47     glutCreateWindow("正六面体");48     glutDisplayFunc(display);49     glutMainLoop();50     return 0;51 }

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号