OpenGL ES2.0教程:你的第一个立方体(5)
来源:互联网 发布:友鼓谱软件免费下载 编辑:程序博客网 时间:2024/05/16 19:56
转自:http://4gamers.cn/archives/429
在上篇文章中,我们介绍了VBO索引的使用,使用VBO索引可以有效地减少顶点个数,优化内存,提高程序效率。
本教程将带领大家一起走进3D--绘制一个立方体。其实画立方体本质上和画三角形没什么区别,所有的模型最终都要转换为三角形。
同时,本文还会介绍如何通过修改MVP矩阵来让此立方体不停地旋转。另外,大家还可以动手去修改本教程的示例代码,借此我们可以更加深入地理解OpenGL的normalized device space。
准备立方体数据
在开始真正的绘制代码之前,我们先要准备好数据。首先,我们需要改进的是代表顶点属性的结构体:
这里,我们把Position从一个长度为2的数组变成了一个长度为3的数组,用于存储顶点的xyz的值。
接下来是顶点数据,因为一共有6个面。每个面由二个三角形组成,因此需要4个顶点,那么整个立方体就需要4*6=24个顶点。
接下来,当然是最重要的VBO索引啦:
最后,由于我们修改了顶点属性,所以我们要相应地修改vertex shader和glVertexAttribPointer的调用:
此时,编译运行,你会得到如下结果 :
别诧异,这就是一个立方体,只不过现在它离我们的“眼睛”(Cemera)很近,所以我们只能看到一个面。接下来,让我们修改一个modelView矩阵,让它离我们的camera远一点。
让立方体动起来
我们有很多方法可以让立方体转起来。比如直接修改modelView矩阵,也可以使用modelView配合projection矩阵。
首先,是最简单的方法,我们把整个立方体数据先缩小一半,然后再往-z轴方向移动0.5个单位,最后让它围绕着x轴不停地旋转。
注意,这里我们操纵顶点的取值范围只能是-1~+1,xyz每一个轴都是这样。超出这个区域(normalized device space)就会裁剪掉。但是我们实际操作一个物体的移动的时,肯定不可能局限于这么小的范围,我们可以通过modelView和projection矩阵来定义一个更好用的坐标系,然后基于这个坐标系去指定物体的坐标。
比如cocos2d-x里面,通过下列代码指定了自己的坐标系范围在(0~size.width)和(0~size.height)之间。
这里面,我们可以直接拿来用,也可以自己再写一个。下面是我用的代码:
这里我让camera的位置位于(0,0,1),然后看着(0,0,0)点,并且头朝上(0,1,0)。大家可以尝试去修改createLookAt的参数,看看每一个参数具体是什么意思。这里有一个非常不错的程序介绍View Frustum的,强烈推荐!
最终效果:(如果你看不到,请升级你的浏览器!!!)
结语
附上本教程源码,从下篇文章开始,我们将介绍纹理映射。
- OpenGL ES2.0教程:你的第一个立方体(5)
- Cocos2dx-OpenGL ES2.0教程:你的第一个立方体(5)
- QT+Opengl ES2.0显示立方体
- 基于Cocos2d-x学习OpenGL ES 2.0系列——你的第一个立方体(5)
- NeHe OpenGL教程第二课 你的第一个多边形
- OpenGL ES 2.0教程:你的第一个三角形(1)
- OpenGL ES 2.0教程:你的第一个三角形(1)
- 【Qt OpenGL教程】02:你的第一个多边形
- Android OpenGl ES2.0编程_第一个OpenGL小程序
- OpenGL ES2.0教程:编写自己的shader(2)
- OpenGL ES2.0教程:编写自己的shader(2)
- OpenGL ES2.0教程:编写自己的shader
- Cocos2dx-OpenGL ES2.0教程:编写自己的shader(2)
- OpenGL ES2.0教程:编写自己的shader(2)
- OpenGL es2.0 第一个例子
- iOS OpenGL ES2.0教程 Lesson03 旋转
- OpenGL ES2.0教程:初识MVP(3)
- OpenGL ES2.0教程:纹理贴图(6)
- OpenGL ES2.0教程:使用VBO索引(4)
- Hibernate(十六)数据库事务与隔离级别
- java基础<线程>总结(线程概念、线程创建方式、线程间通信、线程重要方法)
- cocos2d-x之场景
- [Codeforces] 460B - Little Dima and Equation
- OpenGL ES2.0教程:你的第一个立方体(5)
- Hibernate(十七)Hibernate实现分页和综合查询详解
- Expression
- Struts2设定系统上下文信息PROVIDER
- Java面向对象——继承
- 谈谈MVVM中DelegateCommand:ICommand的原理
- 如何修改CheckBoxPreference title字体
- 最好的PHP IDE和PHP文本编辑器合集
- 浏览器 http 200(from cache) 和 304