Android开发学习教程—Android 3D游戏教程第六部分.docVIP

Android开发学习教程—Android 3D游戏教程第六部分.doc

  1. 1、本文档共19页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Android开发学习教程—Android 3D游戏教程第六部分

程序更新与Android2.0.1兼容。 如果你是初次接触这个系列的文章,请先阅读HYPERLINK /index.php/2010/11/android-3d-game-tutorial-part-i312-html/第一部分。 这个系列的第六部分将讲述如何构造正确的透视,透视是3D的基础。 在我们开始之前要讨论两个可能的观察方式:正交视图和透视。 投影视图(没有终点的投影) 投影视图是一种无法分辨物体距离我们远近的视图,因为无论远近它们都一样大小。因此如果你以某个特定大小画一个物品,另一个同样大小的物品离第一个很远但是跟第一个有稍微的错开,那么你是无法分辨那个物品是第一个的。因为两个有同样的大小,它们没有随着距离远近而发生放缩。 透视(有终点的投影) 透视视图是跟我们眼睛所看到的类似的视图。一个在你面前的高个子当然很高。如果这个人距离你有100米远,那么他就还不如你的拇指大。在我们的视图中他会随着距离的远近而放缩。这就是透视。如果是前面那个两个物体的例子,我们就可以根据大小来判断它们的距离远近了。 如果我的解释使你迷惑,我建议阅读HYPERLINK /2009/04/opengl-es-from-ground-up-part-3.htmliPhone development上的 OpenGL ES From the Ground Up, Part 3: Viewports in Perspective该篇博客,里面使用铁路作为例子来讲解透视。 我们打算创建的第一个视图是使用投影视图的例子。这个视图的建立我们只需要做一次,当然如果我们更改了旋转属性的话,每一次画布创建的时候都需要重新建立这个视图。因此我们需要把onDrawFrame()中的部分代码放入onSurfaceCreated()中去。在那里如果程序刚刚开始运行或者旋转被修改过了的话,与这个视图建立相关的代码会被执行。 @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { // preparation // 定义背景颜色 gl.glClearColor(0f, 0f, 0f, 1.0f); // 保证只有一面是可以被观察到的 gl.glEnable(GL10.GL_CULL_FACE); // 逆时针的顺序绘制的一面可以被观察到 gl.glFrontFace(GL10.GL_CCW); // 哪个不用被绘制 gl.glCullFace(GL10.GL_BACK); gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glEnableClientState(GL10.GL_COLOR_ARRAY); initTriangle(); } // code snipped @Override public void onDrawFrame(GL10 gl) { gl.glLoadIdentity(); // 清楚颜色和深度缓冲区 // we called above... gl.glClear(GL10.GL_COLOR_BUFFER_BIT); // 设置旋转 gl.glRotatef(_xAngle, 1f, 0f, 0f); gl.glRotatef(_yAngle, 0f, 1f, 0f); //gl.glColor4f(0.5f, 0f, 0f, 0.5f); gl.glVertexPointer(3, GL10.GL_FLOAT, 0, _vertexBuffer); gl.glColorPointer(4, GL10.GL_FLOAT, 0, _colorBuffer); gl.glDrawElements(GL10.GL_TRIANGLES, _nrOfVertices, GL10.GL_UNSIGNED_SHORT, _indexBuffer); } 你可以看到我们没有将glClear()和glLoadIdentity()函数从onDrawFrame()移到onSurfaceCreated()中去。原因很简单,他们只需要在绘制每一帧时调用。 因为我们需要屏幕的大小来计算屏幕的比率,所以引入变量_width和_height。我们需要把他们置于onSurfaceChanged()函数中,因为这个函数在旋转发生变化时会被调用。 private float _width = 320f; private float _h

文档评论(0)

l215322 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档