在上篇文章中,我们介绍了VBO索引的使用,使用VBO索引可以有效地减少顶点个数,优化内存,提高程序效率。

本教程将带领大家一起走进3D--绘制一个立方体。其实画立方体本质上和画三角形没什么区别,所有的模型最终都要转换为三角形。

同时,本文还会介绍如何通过修改MVP矩阵来让此立方体不停地旋转。另外,大家还可以动手去修改本教程的示例代码,借此我们可以更加深入地理解OpenGL的normalized device space。

准备立方体数据

在开始真正的绘制代码之前,我们先要准备好数据。首先,我们需要改进的是代表顶点属性的结构体:

typedef struct {
float Position[];
float Color[];
} Vertex;

这里,我们把Position从一个长度为2的数组变成了一个长度为3的数组,用于存储顶点的xyz的值。

接下来是顶点数据,因为一共有6个面。每个面由二个三角形组成,因此需要4个顶点,那么整个立方体就需要4*6=24个顶点。

Vertex data[] =
{
// Front
{{, -, }, {, , , }},
{{, , }, {, , , }},
{{-, , }, {, , , }},
{{-, -, }, {, , , }},
// Back
{{, , -}, {, , , }},
{{-, -, -}, {, , , }},
{{, -, -}, {, , , }},
{{-, , -}, {, , , }},
// Left
{{-, -, }, {, , , }},
{{-, , }, {, , , }},
{{-, , -}, {, , , }},
{{-, -, -}, {, , , }},
// Right
{{, -, -}, {, , , }},
{{, , -}, {, , , }},
{{, , }, {, , , }},
{{, -, }, {, , , }},
// Top
{{, , }, {, , , }},
{{, , -}, {, , , }},
{{-, , -}, {, , , }},
{{-, , }, {, , , }},
// Bottom
{{, -, -}, {, , , }},
{{, -, }, {, , , }},
{{-, -, }, {, , , }},
{{-, -, -}, {, , , }}
};

接下来,当然是最重要的VBO索引啦:

GLubyte indices[] = {
// Front
, , ,
, , ,
// Back
, , ,
, , ,
// Left
, , ,
, , ,
// Right
, , ,
, , ,
// Top
, , ,
, , ,
// Bottom
, , ,
, ,
};

最后,由于我们修改了顶点属性,所以我们要相应地修改vertex shader和glVertexAttribPointer的调用:

glVertexAttribPointer(positionLocation,
,
GL_FLOAT,
GL_FALSE,
sizeof(Vertex),
(GLvoid*)offsetof(Vertex,Position)); //下面是vertex shader
attribute vec3 a_position; //注意之前我们使用的是vec2
attribute vec4 a_color; varying vec4 v_fragmentColor; void main()
{
gl_Position = CC_MVPMatrix * vec4(a_position.xyz,); //这里用swizzle的时候是xyz
v_fragmentColor = a_color;
}

此时,编译运行,你会得到如下结果 :

别诧异,这就是一个立方体,只不过现在它离我们的“眼睛”(Cemera)很近,所以我们只能看到一个面。接下来,让我们修改一个modelView矩阵,让它离我们的camera远一点。

让立方体动起来

我们有很多方法可以让立方体转起来。比如直接修改modelView矩阵,也可以使用modelView配合projection矩阵

首先,是最简单的方法,我们把整个立方体数据先缩小一半,然后再往-z轴方向移动0.5个单位,最后让它围绕着x轴不停地旋转。

modelViewMatrix.scale(0.5);
modelViewMatrix.translate(0.0,, -0.5); static float rotation = ;
modelViewMatrix.rotate(Vec3(,,),CC_DEGREES_TO_RADIANS(rotation));
rotation++;
if (rotation < ) {
rotation = ;
}
Director::getInstance()->multiplyMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW, modelViewMatrix);

注意:这里我们操纵顶点的取值范围只能是-1~+1,xyz每一个轴都是这样。超出这个区域(normalized device space)就会裁剪掉。但是我们实际操作一个物体的移动的时,肯定不可能局限于这么小的范围,我们可以通过modelView和projection矩阵来定义一个更好用的坐标系,然后基于这个坐标系去指定物体的坐标。

比如Cocos2d-x里面,通过下列代码指定了自己的坐标系范围在(0~size.width)和(0~size.height)之间。

case Projection::_3D:
{
float zeye = this->getZEye();
Mat4 matrixPerspective, matrixLookup;
loadIdentityMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION);
// issue #1334
Mat4::createPerspective(, (GLfloat)size.width/size.height, , zeye+size.height/, &matrixPerspective);
multiplyMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION, matrixPerspective);
Vec3 eye(size.width/, size.height/, zeye), center(size.width/, size.height/, 0.0f), up(0.0f, 1.0f, 0.0f);
Mat4::createLookAt(eye, center, up, &matrixLookup);
multiplyMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION, matrixLookup);
loadIdentityMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
break;
}

这里面,我们可以直接拿来用,也可以自己再写一个。下面是我用的代码:

Mat4 projectionMatrix;
Mat4::createPerspective(, /, 1.0, , &projectionMatrix);
Director::getInstance()->multiplyMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION, projectionMatrix); Mat4 modelViewMatrix;
Mat4::createLookAt(Vec3(,,), Vec3(,,), Vec3(,,), &modelViewMatrix);
modelViewMatrix.translate(, , -); static float rotation = ;
modelViewMatrix.rotate(Vec3(,,),CC_DEGREES_TO_RADIANS(rotation));
rotation++;
if (rotation < ) {
rotation = ;
}
Director::getInstance()->multiplyMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW, modelViewMatrix);

这里我让camera的位置位于(0,0,1),然后看着(0,0,0)点,并且头朝上(0,1,0)。大家可以尝试去修改createLookAt的参数,看看每一个参数具体是什么意思。这里有一个非常不错的程序介绍View Frustum的,强烈推荐!

最终效果:(如果你看不到,请升级你的浏览器!!!)

aaarticlea/png;base64,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" alt="" />

附上本教程源码,从下篇文章开始,我们将介绍纹理映射。

来源网址:http://4gamers.cn/archives/429

基于Cocos2d-x学习OpenGL ES 2.0系列——你的第一个立方体(5)的更多相关文章

  1. 基于Cocos2d-x学习OpenGL ES 2.0系列——你的第一个三角形(1)

    前言 在本系列教程中,我会以当下最流行的2D引擎Cocos2d-x为基础,介绍OpenGL ES 2.0的一些基本用法.本系列教程的宗旨是OpenGL扫盲,让大家在使用Cocos2d-x过程中,知其然 ...

  2. 基于Cocos2d-x学习OpenGL ES 2.0系列——纹理贴图(6)

    在上一篇文章中,我们介绍了如何绘制一个立方体,里面涉及的知识点有VBO(Vertex Buffer Object).IBO(Index Buffer Object)和MVP(Modile-View-P ...

  3. 基于Cocos2d-x学习OpenGL ES 2.0系列——使用VBO索引(4)

    在上一篇文章中,我们介绍了uniform和模型-视图-投影变换,相信大家对于OpenGL ES 2.0应该有一点感觉了.在这篇文章中,我们不再画三角形了,改为画四边形.下篇教程,我们就可以画立方体了, ...

  4. 基于Cocos2d-x学习OpenGL ES 2.0系列——OpenGL ES渲染之Shader准备(7)

    Cocos2d-x底层图形绘制是使用OpenGL ES协议的.OpenGL ES是什么呢? OpenGL ES(OpenGl for Embedded System)是OpenGL三维图形API的子集 ...

  5. 基于Cocos2d-x学习OpenGL ES 2.0系列——编写自己的shader(2)

    在上篇文章中,我给大家介绍了如何在Cocos2d-x里面绘制一个三角形,当时我们使用的是Cocos2d-x引擎自带的shader和一些辅助函数.在本文中,我将演示一下如何编写自己的shader,同时, ...

  6. 基于Cocos2d-x学习OpenGL ES 2.0系列——OpenGL ES渲染之LayerColor(8)

    在前面文章中讲述了Cocos2d-x引擎OpenGL渲染准备Shader方面,本文主要讲解使用LayerColor来讲述OpenGL的渲染过程. 1.LayerColor对象创建 添加LayerCol ...

  7. 基于Cocos2d-x学习OpenGL ES 2.0系列——初识MVP(3)

    在上一篇文章中,我在介绍vertex shader的时候挖了一个坑:CC_MVPMatrix.它其实是一个uniform,每一个Cocos2d-x预定义的shader都包含有这个uniform,但是如 ...

  8. 基于Cocos2d-x学习OpenGL ES 2.0之多纹理

    没想到原文出了那么多错别字,实在对不起观众了.介绍opengl es 2.0的不多.相信介绍基于Cocos2d-x学习OpenGL ES 2.0之多纹理的,我是独此一家吧.~~ 子龙山人出了一个系列: ...

  9. OpenGL ES 2.0 渲染管线 学习笔记

    图中展示整个OpenGL ES 2.0可编程管线 图中Vertex Shader和Fragment Shader 是可编程管线: Vertex Array/Buffer objects 顶点数据来源, ...

随机推荐

  1. iOS键盘类型以及样式展示

    UIKeyboardTypeDefault: UIKeyboardTypeASCIICapable: UIKeyboardTypeNumbersAndPunctuation: UIKeyboardTy ...

  2. spring session实现集群中session共享

    本文转自:http://dorole.com/1422/ 使用框架的会话管理工具,也就是本文要说的spring-session,可以理解是替换了Servlet那一套会话管理,既不依赖容器,又不需要改动 ...

  3. git学习(四):理解git暂存区(stage)

    与一般的版本管理不同的是,git在提交之前要将更改通过git add 添加到暂存区才能提交(git commit).即使是已经交给了git来管理的文件也是如此.这里继续学习git的暂存区. 通过git ...

  4. Maven_POM配置结构

    本文转载,转载地址:http://blog.csdn.net/ithomer/article/details/9332071 <project>    <parent>     ...

  5. C语言实现商品销售系统

    商品销售系统 #include<stdio.h> //头文件 #include<string.h> //头文件 #include<stdlib.h> //头文件 # ...

  6. CMake使用入门

    一.开胃菜 hello目录下的文件结构: ├── CMakeLists.txt ├── hello.c ├── hello.h └── main.c C代码见下节. 最简单的cmake配置文件: pr ...

  7. github搭建个人博客----------绑定域名访问

    首先你得有一个Github账号,没有的话去github.com注册一个账号,然后到达仓库信息填写界面: 创建仓库,如下图:(仓库名要以自己的github名作为前缀,后面的夹 .github.io) 后 ...

  8. 【Mac双系统设置系统默认启动系统】解决方式

    解决方式1: 开机时长按option键,进入系统选择界面: 用左右方向键选择到你要设置为默认启动的盘, 然后同一时候按下ctrl+enter键.就可以将其设置为默认启动的系统. 解决方式2: 选择ma ...

  9. Fork of LGPL version of JPedal

    https://github.com/on-site/JPedal —————————————————————————————————————————————————————————————————— ...

  10. 可能是目前最完整的前端框架 Vue.js 全面介绍

    Vue.js 是一个JavaScriptMVVM库,是一套构建用户界面的渐进式框架. 摘要 2016年最火的前端框架当属Vue.js了,很多使用过vue的程序员这样评价它,“vue.js兼具angul ...