这几篇Android 3D游戏开发的文章原文出自一位德国人Martin在droidnova.com写的文章,有lixinso翻译为中文。
系列的第五部分讲如果创建你的第一个完整的3D对象。这个case中是一个4面的金字塔。
为了让我们接下来的开发更容易,这里需要做一些准备。
为了更加的动态,我们必须改变一些变量以便我们接下来的工作。让我们来细看一下:
在第一行你可以看到,我们初始化_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.
为了确保你那里有了和这边相同的对象变量,我也将这些都贴到这个类的上边了。你可以看到我们现在有两个float变量,_xAngle和_yAngle(15-16行)还有他们的setter和getter方法(28-42行)
现在让我们实现根据触摸屏来计算角度的逻辑,为了做这个,需要先稍稍改变一下VortexView类。
在第3和4行我们有两个变量给我们的x和y值使用。当移动时,我们在ACTION_DOWN事件中设置他们的值,我们根据MotionEvent来计算当前值和旧的值的差。计算他们的差并加到已经应用的角度上。不要被ydiff添加到x-angle上或者xdiff添加到y-angle上而迷惑。你可以想象,如果你想x轴的值不变,而进行旋转,只有在y轴上旋转。对于y轴也一样。
如果我们向左或者向上移动手指,xdiff/ydiff的值就会变成负的,旋转就会向后旋转。所以在这两个轴上旋转都比较容易。
现在到了非常有意思的部分:金字塔。
像上面我们所引用的一样,winding需要一些设置。有的也许是默认的设置,但是我们还是定义一下,为了安全起见。
在第5行,我们enable了culling面,以保证只有一面。在第7行我们定义了那种顺序是前面。GL_CCW表示逆时针。在第9行,我们最终定义了那个面作为culling 面。沃恩设置其为GL_BACK以保证只显示正面。这或许有点迷糊偶,你可以看看如果用GL_FRONT_AND_BACK会发生什么……你将什么也看不到。
在第四行你可以看到背景色是黑色,因为我们已经删除了以前设置的动态颜色。在13和14行你可以看到在每个轴的旋转角度。其它的都和以前讲过的一样。
最后一件事情你需要做的是改变initTriangle()函数中的颜色数组,坐标和索引。我们的金子谈应该显示成这样子的。
正如你在图上看到的一样,我们的金字塔有4个角。每个角都有自己的坐标,所以我们有4个顶点需要定义。如2-7行。
每一个顶点有自己的颜色,在10-15行定义。
在中间部分给出了定义三角形所需要的索引。时刻记着winding,三角形0,1,3和0,3,1是不一样的。
每一个索引点指向coords数组中定义的顶点。
编译运行程序,看一下如果你改变了indices的顺序会发生什么,或者看一下如果你将GL_CCW改成GL_CW以后将会看到什么。
Eclipse工程的源代码下载: Vortex Part V