Chinaunix首页 | 论坛 | 博客
  • 博客访问: 550799
  • 博文数量: 179
  • 博客积分: 3845
  • 博客等级: 中校
  • 技术积分: 2003
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-16 21:25
文章分类
文章存档

2012年(74)

2011年(105)

分类: 嵌入式

2011-12-18 13:37:03

这几篇Android 3D游戏开发的文章原文出自一位德国人Martin在droidnova.com写的文章,有lixinso翻译为中文。

系列的第五部分讲如果创建你的第一个完整的3D对象。这个case中是一个4面的金字塔。

为了让我们接下来的开发更容易,这里需要做一些准备。

我们必须将计算buffer以及创建数组时的大变得更加动态。
09`)UL]3IIZ{Y]F42PW]})X

为了更加的动态,我们必须改变一些变量以便我们接下来的工作。让我们来细看一下:

在第一行你可以看到,我们初始化_nrOfVertices为0,因为我们可以在第七行那里通过坐标的大小来确定它。

我们同时也将_indecesArray改为局部变量indices,并在13行进行了初始化。

这个buffer创建过程被放在了坐标、颜色以及顶点数组的下边,因为buffer大小取决于数组。所以请看17-18行,22-23行,27-28行。在注释里面我解释了计算方法。

主要的好处是,我们可以创建更多的vertices,而不用手动重新计算有多少个vertices,以及数组和buffer的大小。

下一步:你需要明白OpenGL如何绘制并决定我们看到的东西。

相对于OpenGL来说OpenGL ES一个很大的缺点就是除了三角形以外没有别的图元类型。我们没有其它多边形,所以我们想要创建的所有的对象都必须由三角形构成。我引用一个blog的帖子来说明这个问题: IPhone developer ,同时也推荐他的这些文章 OpenGL ES series.

这 里有更多的关于三角形的东西你需要知道。在OpenGL中,有一个概念叫做弯曲(winding),意思是vertices绘制时的顺序。与现实世界中的 对象不同,OpenGL中的多边形一般没有两个面。他们只有一个面,一般是正面,一个三角形只有当其正面面对观察者的时候才可以被看到。可以配置 OpenGL将一个多边形作为两面的,但是默认情况下三角形只有一个可见的面。知道了那边是多边形的正面以后,OpenGL就可以少做一半的计算量。如果 设置两面都可视,则需要多的计算。

虽然有时候一个多边形会独立地显示,但是你或许不是非常需要它的背面显示,经常一个三角形是一个 更大的对象的一部分,多边形的一面将在这个物体的内部,所以永远也不会被看到。这个没有被显示的一面被称作背面,OpenGl通过绘制的顺序来确定那个面 是正面哪个是背面。顶点按照逆时针绘制的是正面(默认是这样,但是可以被改变)。因为OpenGL能很容易地确定哪些三角形对用户是可视的,它就可以通过 使用Backface Culling来避免为那些不显示在前面的多边形做无用功。我们将在下一篇文章里讨论视角的问题,但是你现在可以想象它为一个虚拟摄像机,或者通过一个虚 拟的窗口来观察OpenGL的世界。

winding

在上面的示意图中,左边青绿色的的三角形是背面,将不会被绘制,因为它相对于观察者来说是顺时针的。而在右边的这个三角形是正面,将会被绘制,因为绘制顶点的顺序相对于观察者来说是逆时针的。

因为我们想做的是创建一个漂亮的金字塔,我们首先disable这个glClearColor()。我们可以删除掉变量_red, _green, _blue,还有方法setColor(). 我们也想改变视角,所以我们将旋转分的x和y轴上。

5JPHV7Z}@LI_J@~T{7G5EHL

为了确保你那里有了和这边相同的对象变量,我也将这些都贴到这个类的上边了。你可以看到我们现在有两个float变量,_xAngle和_yAngle(15-16行)还有他们的setter和getter方法(28-42行)

现在让我们实现根据触摸屏来计算角度的逻辑,为了做这个,需要先稍稍改变一下VortexView类。

RJ`%`1SP06QI`3$SX`FCPI4

在 第3和4行我们有两个变量给我们的x和y值使用。当移动时,我们在ACTION_DOWN事件中设置他们的值,我们根据MotionEvent来计算当前 值和旧的值的差。计算他们的差并加到已经应用的角度上。不要被ydiff 添加到x-angle上或者xdiff添加到y-angle上而迷惑。你可以想象,如果你想x轴的值不变,而进行旋转,只有在y轴上旋转。对于y轴也一 样。

如果我们向左或者向上移动手指,xdiff/ydiff的值就会变成负的,旋转就会向后旋转。所以在这两个轴上旋转都比较容易。

现在到了非常有意思的部分:金字塔。

像上面我们所引用的一样,winding需要一些设置。有的也许是默认的设置,但是我们还是定义一下,为了安全起见。

}UT``P1`9W17TL91CU(QY14

在 第5行,我们enable了culling面,以保证只有一面。在第7行我们定义了那种顺序是前面。GL_CCW表示逆时针。在第9行,我们最终定义了那 个面作为culling 面。 沃恩设置其为GL_BACK以保证只显示正面。这或许有点迷糊偶,你可以看看如果用GL_FRONT_AND_BACK会发生什么……你将什么也看不到。

WLIPJE49P$HQ(H9S525H081

在第四行你可以看到背景色是黑色,因为我们已经删除了以前设置的动态颜色。在13和14行你可以看到在每个轴的旋转角度。其它的都和以前讲过的一样。

最后一件事情你需要做的是改变initTriangle()函数中的颜色数组,坐标和索引。我们的金子谈应该显示成这样子的。

pyramid

]0~K%V86A[C~L944UKVMB@C

正如你在图上看到的一样,我们的金字塔有4个角。每个角都有自己的坐标,所以我们有4个顶点需要定义。如2-7行。

每一个顶点有自己的颜色,在10-15行定义。

在中间部分给出了定义三角形所需要的索引。时刻记着winding,三角形0,1,3和0,3,1是不一样的。

每一个索引点指向coords数组中定义的顶点。

编译运行程序,看一下如果你改变了indices的顺序会发生什么,或者看一下如果你将GL_CCW改成GL_CW以后将会看到什么。

Eclipse工程的源代码下载: Vortex Part V

3d-part-five-pyramid

3d-part-five-pyramid1

3d-part-five-pyramid2

阅读(685) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~