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程序第二 ...
随机推荐
- 51nod 1636 教育改革
题目链接 令f[i][j][k]为第i天选择的课程为j,设置作业为a[j]+k时的最大作业量. 那么f[i][j][k]可以由哪些状态转移而来?先把课程按复杂度排序,那么可以转移来的课程是f[i-1] ...
- 用JS制作《飞机大作战》游戏_第1讲(素材查找和界面框架搭建)-陈远波
一.查找素材: 二.分析游戏界面框架: 登录界面.游戏界面.暂停游戏界面.玩家死亡后弹出界面:并对应的界面包含什么元素: 三.分别搭建以上四个界面: 1.登录界面与游戏界面框架(隐藏游戏界面,四个界面 ...
- jstl格式化日期
<%@ page contentType="text/html" pageEncoding="GBK"%> <%@ page import=& ...
- css多行省略-webkit-box-orient打包编译后失效原因
原css代码: .dialog-for-plan .dialog-table .type>p { display: -webkit-box; -webkit-box-orient: vertic ...
- Postman-常用方法集合
postman常用方法集合: 1.设置环境变量 postman.setEnvironmentVariable("key", "value"); pm.envir ...
- MP实战系列(十六)之性能分析插件
性能分析拦截器,用于输出每条 SQL 语句及其执行时间. 虽然使用阿里的Druid连接池可以完成这个目的,但是,我们一般认为,目前的组件能够达到这个目的,尽量使用目前的组件,因为修改配置和引入第三方库 ...
- AOP实现拦截对象以及获取切入目标方法和注解
AOP实现拦截对象以及获取切入目标方法和注解 一.JoinPoint是什么? AspectJ使用org.aspectj.lang.JoinPoint接口表示目标类连接点对象,如果是环绕增强时,使用 o ...
- Python2.7-difflib
difflib主要用于比较两个序列的不同,常见于字符串的比较,可以对差异生成报告.SequenceMatcher 主要用于找两者相似部分,以及两者不同的转换方法,而 Differ 更注重于比较两者的区 ...
- python 连接操作mysql数据库
开发数据库程序流程: 1.创建connection对象,获取cursor 2.使用cursor执行SQL 3.使用cursor获取数据.判断执行状态 4.提交事务 或者 回滚事务 import: 数据 ...
- html样式表格
<html><body><table border="1"> <tr height="20px"> &l ...