OpenGL:使用顶点数组法绘制正六面体
在今天的opengl的课程以及实验中,我们学习了如何使用顶点数组的方法来绘制图形,但相信还有很多同学对它的实际使用方法不太了解,我们就用我们今天实验课上的实例来简单讲解一下
题目及要求
绘制一个正六面体,正面以填充方式绘制,背面以轮廓线的形式绘制,坐标自拟
思路解析
首先,我们需要定义一个数组,用来存放所有的顶点,为了方便理解,我们可以画一个草图:

这样,我们就可以写出顶点坐标数组:
//存放所有顶点坐标的数组
float vertex_list[][] =
{
{,,},
{,,},
{,,},
{,,}, {,,},
{,,},
{,,},
{,,}
};
接下来,我们需要一个顶点坐标的索引数组,索引数组用来表示的是顶点被绘制的顺序,每个点的编号代表的是顶点坐标数组中该点对应的下标。
例如,点(0,0,0)用数组表示为 vertex_list[0],则(0,0,0)为0号点,则上述数组中所有点的编号为:

我们将顶点编号完毕之后,我们就可以来定义点的绘制顺序了。
我们用0123的顺序绘制第一个面,4567的顺序绘制第二个面,2761的顺序绘制第二个面,3450的顺序绘制第四个面。
写成数组形式如下:
//存放数组索引的数组,可以近似地理解为顶点被绘制的顺序
int index_list[] =
{
,,,,
,,,,
,,,,
,,,
};
这样一来,四个侧面都绘制完毕,由于上下两个面直接由四个侧面拼接而成了,所以没有必要非要绘制。
顶点数组和索引数组都被定义完毕,接下来我们可以进行正式的代码书写了。
完整代码及其结果
#include<gl/glut.h>
//存放所有顶点坐标的数组
float vertex_list[][] =
{
{,,},
{,,},
{,,},
{,,}, {,,},
{,,},
{,,},
{,,}
}; //存放数组索引的数组,可以近似地理解为顶点被绘制的顺序
int index_list[] =
{
,,,,
,,,,
,,,,
,,,
}; void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glOrtho(-, , -, , -, ); //设置屏幕的显示范围
glPolygonMode(GL_FRONT, GL_FILL); //设置正面为填充类型
glPolygonMode(GL_BACK, GL_LINE); //设置背面为轮廓线类型
glFrontFace(GL_CCW); //将逆时针设置为正面
glRotatef(, -, , ); //将图形旋转一下以便看得更直观 glEnableClientState(GL_VERTEX_ARRAY); //启用顶点数组
glVertexPointer(, GL_FLOAT, , vertex_list); //指定顶点数组
//按照索引数组中指出的数组依次调用glVertex函数,16表示的是调用的次数
glDrawElements(GL_QUADS, , GL_UNSIGNED_INT, index_list); glFlush();
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(, );
glutInitWindowSize(, );
glutCreateWindow("正六面体");
glutDisplayFunc(display);
glutMainLoop();
return ;
}

OpenGL:使用顶点数组法绘制正六面体的更多相关文章
- OpenGL顶点数组
概述 作为在立即模式(glBegin()与glEnd()之间)下指定单个顶点数据的替代,你可以保存顶点数据在一组列表中,包括顶点位置.法线.纹理坐标与颜色信息.并且你可以通过索引数组解引用数组元素绘制 ...
- WebGL2系列之顶点数组对象
使用了顶点缓冲技术后,绘制效率有了较大的提升.但是还有一点不尽如人意,那就是顶点的位置坐标.法向量.纹理坐标等不同方面的数据每次使用时需要单独指定,重复了一些不必要的工作.WebGL2提供了一种专门用 ...
- [转]OpenGL通过VBO实现顶点数组绘制顶点
#include "stdlib.h" #include <OpenGL/glext.h> #include <GLUT/GLUT.h> #define B ...
- OpenGL中glVertex、显示列表(glCallList)、顶点数组(Vertex array)、VBO及VAO区别
OpenGL中glVertex.显示列表(glCallList).顶点数组(Vertex array).VBO及VAO区别 1.glVertex 最原始的设置顶点方法,在glBegin和glEnd之间 ...
- openGL 提升渲染性能 之 顶点数组 VBO IBO VAO
使用openGL图形库绘制,都需要通过openGL接口向图像显卡提交顶点数据,显卡根据提交的数据绘制出相应的图形. openGL绘制方式有:直接模式,显示列表,顶点数组,顶点索引. 直接模式:最简单, ...
- OpenGL(十八) 顶点数组和抗锯齿(反走样)设置
顶点数组函数可以在一个数组里包含大量的与顶点相关的数据,并且可以减少函数的调用.使用顶点数组需要先启用顶点数组功能,使用glEnableClientState函数启用顶点数组,参数可以是GL_VERT ...
- 3D Computer Grapihcs Using OpenGL - 19 Vertex Array Object(顶点数组对象)
大部分OpenGL教程都会在一开始就讲解VAO,但是该教程的作者认为这是很不合理的,因为要理解它的作用需要建立在我们此前学过的知识基础上.因此直到教程已经进行了一大半,作者才引入VAO这个概念.在我看 ...
- opengl es中不同的绘制方式
opengl es中不同的绘制方式 转载请保留出处:http://xiaxveliang.blog.163.com/blog/static/297080342013467344263/ 1. GL_P ...
- OpenGL入门学习 课程 (三) 绘制几何图形的一些细节问题
http://oulehui.blog.163.com/blog/static/79614698201191832753312/ 先回顾一下我们都学习了些什么: 第一课,编写第一个OpenGL程序第二 ...
随机推荐
- python基础学习19----socket网络编程
网络通信三要素 ip地址:InetAddress 网络中设备的标识,不易记忆,可用主机名(计算机的标识号) 端口号:用于标识进程的逻辑地址,不同进程的标识(正在运行的软件的标识号) 传输协议:通讯的规 ...
- python字典的基本操作
字典的基本方法 什么是字典: 字典是一种 key - value的数据类型,听alex说就像我们上学用的字典,通过笔划,字母来查找对饮页面的详细内容. 语法: id_dict = { 'stu1101 ...
- EF5.0中的跨数据库操作
以前在用MVC + EF 的项目中,都是一个数据库,一个DbContext,因此一直没有考虑过在MVC+EF的环境下对于多个数据库的操作问题.等到要使用时,才发现这个问题也不小(关键是有个坑).直接说 ...
- 深入浅出MS SQL——编辑table 出错
- SQL一字段内的字符串按照特定字符串转化为多行显示
有如下数据表 需求就是将Col1,Col2按照特定的字符串分割成多行 一.利用XML解析方式 先将该字段值统一替换为逗号分割,再将逗号分割替换转为XML数据类型,再利用xml转为多个行 declare ...
- Hive 整合Hbase
摘要 Hive提供了与HBase的集成,使得能够在HBase表上使用HQL语句进行查询 插入操作以及进行Join和Union等复杂查询.同时也可以将hive表中的数据映射到Hbase中. 应用 ...
- C借函数指针构造映射
这是候老师的<深入浅出 MFC>中C借函数指针构造映射截图,可以看到MFC们的映射思想:
- 【转】 android获取设备唯一标识完美解决方案
<p style="margin: 10px auto; padding-top: 0px; padding-bottom: 0px; color: rgb(51, 51, 51); ...
- 解决Win7(x64)Anaconda3报错:AttributeError: '_NamespacePath' object has no attribute 'sort'
最近论文需要用到python做数据分析,python语法简单,但是Windows下安装第三方包恶心的要命,statsmodels用pip死活安装不上,网上查了说包相互依赖windows下的pip不能下 ...
- Velocity.js初步
Js越来越强大了,超乎我的想象,以前JS仅仅只能通过ajax与后台交互,后来又有了Node.js,JS可以用于服务端,然后今天我又发现了JS的动态语言.明天呢?也许不少前端的小伙伴会说,慢些吧,慢些吧 ...