代码之家  ›  专栏  ›  技术社区  ›  microspino

Skybox OpenGL ES iPhone和iPad

  •  3
  • microspino  · 技术社区  · 14 年前

    我需要为 . 这是一个考古应用程序:当用户在一座历史建筑内或参观考古挖掘时,可以打开它。不需要像主观观点那样的厄运:只需要一个天空盒。应用程序将有一个兴趣点列表(poi)。每个POI都有自己的skybox。

    OpenGL环境 创建一种可以由触摸驱动/旋转的纹理天空盒。纹理是高分辨率PNG照片。

    这是一个受资助的项目,我有4个月的时间。

    我要去哪里学习如何开发它?我必须买一本书吗?哪一个?

    我只有中等的Objectve-C和Cocoa触摸技能,因为我只为iPad开发了一个应用程序。我对 OpenGL环境

    3 回复  |  直到 13 年前
        1
  •  10
  •   Tommy    14 年前

    因为我对OpenGL ES非常了解,所以我参加了一个演示项目,做了很多你描述的事情。其具体目的是,只要性能足够好,就可以用OpenGL ES提供的最简单的方法来完成所有工作。

    从苹果提供的OpenGL模板开始,我编写了一个新的类,其中包含一个注释很多的实现文件122行,将PNG图像作为纹理加载。我修改了示例视图控制器,根据需要绘制一个skybox,并使用普通版iPhone惯性滚动响应触摸,这意味着编写的代码少于200行(也有注释)。

    为了达到这个目的,我需要知道:

    • 从PNG获取像素数据的CoreGraphics方法
    • 如何操纵MaveVIEW堆栈,以确保根据成员变量的场景的双轴旋转(第一人称射击或谷歌街景视图样式),并确保所定义的立方体几何图形不明显地与近剪辑平面相交。
    • 如何为OpenGL指定顶点位置和纹理坐标
    • 如何指定OpenGL应该在顶点之间构造的三角形
    • 如何跟踪一个触摸来操纵指令旋转的成员变量,包括提供惯性旋转的一点机械装置

    当然,要遵守正常的视图控制器生命周期指令。例如,纹理在viewDidLoad上加载,在viewDidUnload上释放,以确保该视图控制器能够很好地处理潜在的内存警告。

    主要的观察结果是,除了了解Objective-C的信号机制外,大部分都是C的东西。您主要使用C数组和引用来调用C函数,包括OpenGL和CoreGraphics。所以你自己编写这个代码的一个先决条件是在C中感到快乐,而不仅仅是在Objective-C中。

    我假设磁盘上的纹理大小合适。出于实际目的,这意味着假设它们是沿每条边两个大小的幂。我的是512x512。

    OpenGL的纹理管理非常简单;它只是阅读手册来了解纹理名称、名称分配、纹理参数和上传图像数据。更多的日常事务,更多的是了解正确的功能,而不是管理一个直观的飞跃。

    为了向OpenGL提供几何图形,我刚刚完整地写出了数组。我想你需要一点空间思维来做这件事,但在纸上画出一个三维立方体,并给角落编号将是一个很大的帮助。有三个相关数组:

    • 顶点位置
    • 每个顶点位置的纹理坐标

    在我的代码中,我使用了24个顶点,将立方体的每个面都视为一个逻辑上离散的东西(所以,6个面,每个面都有4个顶点)。为了简单起见,我只使用三角形定义了几何图形。向OpenGL提供这些东西实际上是非常烦人的,当你开始时,犯一个错误通常意味着你的程序在OpenGL驱动程序的内部崩溃,而没有给你一个你做错了什么的提示。一次积累一点可能是最好的。

    就能够托管OpenGL内容的UIView而言,我或多或少使用了OpenGL模板中苹果直接提供的普通功能。我所做的一个更改是显式地禁用任何尝试使用OpenGL ES 2.x.1.x的操作,这对于这个任务来说已经足够了,因此我们首先通过不提供两个可选的渲染路径来获得简单性,其次因为es2.x路径会复杂得多。ES 2.x是带有像素和顶点着色器的完全可编程管道,但在ES-land中,固定管道被完全删除。因此,如果你想要一个,那么你必须提供你自己的正常矩阵堆栈的替代品,你必须编写顶点和片段着色器来做'一个有纹理的三角形',等等。

    触摸跟踪并不是特别复杂,或多或少只是需要我了解视锥是如何工作的,以及如何在Cocoa touch中传递触摸。一旦你做了其他的事情,这一点应该很容易。

    值得注意的是,我必须实现的数学非常简单。只是触摸跟踪,真的。假设您想要一个Google Maps类型视图,这意味着我可以完全依赖OpenGL的内置旋转功能。在任何时候,我都不会显式地处理矩阵。

    所以,你需要多长时间来写取决于你对C和CoreGraphics的自信,以及你有时在黑暗中编写代码的快乐程度。因为我知道我在做什么,整个过程花了两三个小时。

    我将视图控制器设置为只有一个视图,即OpenGL视图。但是,普通的iPhone合成规则适用,在您的项目中,您可以轻松地将普通控件放在顶部。你可以在 mediafire . StackOverflow post的长度限制使我无法在这里放置大量代码片段,但是如果您有任何特定的问题,请随时提问。

        2
  •  2
  •   alexr    14 年前

    如果你是从零开始学习OpenGL ES的话,那将会非常困难。我会用一个图形引擎来完成大部分繁重的工作。我现在正在玩《食人魔3》,从我目前看到的情况来看,我可以推荐它: http://www.ogre3d.org/ . 它有Skybox(和更多)的盒子外,应该是相当直接的做。

        3
  •  1
  •   Dr. McKay    14 年前

    我想你可以这样做,这里有一些帮助你开始的链接:

    http://sidvind.com/wiki/Skybox_tutorial

    常见问题:

    查看stackoverflow项目编号2859722和2297564。

    太空景观

    它们不是iphone特有的,但是它们很好地解释了opengl。我想有些人也把它们移植到了电话里,我现在就是找不到它们。