Android开发学习教程—Android3D游戏教程第五部分.doc

Android开发学习教程—Android3D游戏教程第五部分.doc

  1. 1、本文档共21页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Android开发学习教程—Android3D游戏教程第五部分.doc

程序更新与Android2.0.1兼容。 如果你是初次接触这个系列文章,请先阅读第一部分。 这个系列的第五部分将讲述如何创建一个3D的物体。本实例中是一个具有四个面的三角锥。 为了使我们今后的开发更简单,需要做一些准备。我们需要能够动态地计算缓冲区大小和创建数组。 private int _nrOfVertices = 0; private void initTriangle() { float[] coords = { // 坐标 }; _nrOfVertices = coords.length; float[] colors = { // 颜色 }; short[] indices = new short[] { // 索引 }; // float has 4 bytes, coordinate * 4 bytes ByteBuffer vbb = ByteBuffer.allocateDirect(coords.length * 4); vbb.order(ByteOrder.nativeOrder()); _vertexBuffer = vbb.asFloatBuffer(); // short has 2 bytes, indices * 2 bytes ByteBuffer ibb = ByteBuffer.allocateDirect(indices.length * 2); ibb.order(ByteOrder.nativeOrder()); _indexBuffer = ibb.asShortBuffer(); // float has 4 bytes, colors (RGBA) * 4 bytes ByteBuffer cbb = ByteBuffer.allocateDirect(colors.length * 4); cbb.order(ByteOrder.nativeOrder()); _colorBuffer = cbb.asFloatBuffer(); _vertexBuffer.put(coords); _indexBuffer.put(indices); _colorBuffer.put(colors); _vertexBuffer.position(0); _indexBuffer.position(0); _colorBuffer.position(0); } 为了更动态一些,我们需要改变一些变量: 在第一行可以看到我们给_nrOfVertices的初值为0因为它的值取决于第七行坐标数组的大小。另外我们将成员变量_indiceArray改为局部变量,该局部变量叫做indices,在第十三行初始化。 缓冲区的创建移到了坐标数组,颜色数组和索引数组下面,因为缓冲区的大小依赖于这些数组的大小。请阅读相关的第17~18行,第22~23行,第27~28行,在注释中我解释清楚了其中的数学表示含义。 这样修改的好处是,我们可以创建更多的顶点而不必手动来修改关于顶点数量,数组和缓冲区大小等值。 下一步,你必须理解OpenGL是如何绘制我们所看到的图形的。OpenGL ES相比OpenGL的一个缺陷就是它只支持三角形。因此为了创建多边形我们必须由三角形来搭建。 下面我将引用来自IPhone developer的一篇博客,同时也要推荐他的OpenGL ES series相关文章。 有一些关于绘制三角形的事情我们必须了解。在OpenGL中,有一个围绕(winding)的概念,即点被绘制的顺序是重要的。不像真实世界中的物体,OpenGL中的多边形没有两个面。他们只有一个面,即前面,如果一个三角形可以被看到的话,那么它的前面应该面对着观察者。虽然使得OpenGL能够将多边形看作是双面的是可能的,但是默认情况下,三角形只有一个可以被观察到的面。通过了解多边形的哪一面是可以被观察到的,OpenGL就可以只做一半的计算量就将多边形绘制出来。 虽然许多情况下多边形是独立的,你可能希望能够绘制它的背面。通常情况下三角形是一个物体的一部分,三角形的一面将面对这物体的内部并且这一面不会被观察到。这个不需要绘制的面就可以称之为背面,OpenGL通过绘制这个图形的点的顺序来判断哪一面是前面哪一面是背面。如果绘制图形的点的顺序是逆时针的,那么这个面就是朝外的面(可以修改)。既然OpenGL可以容易的决定哪个三角形是可以被观察到的,

文档评论(0)

juhui05 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档