Skybox OpenGL ES iPhone和iPad

Skybox OpenGL ES iPhone和iPad,iphone,ipad,opengl-es,Iphone,Ipad,Opengl Es,我需要为iOS创建一个虚拟漫游工具。这是一个考古应用程序:用户可以在历史建筑内或参观考古挖掘时打开它。不需要像厄运一样的主观观点:只是一个天空盒子。应用程序将有一个兴趣点列表(POI)。每个POI都有自己的skybox 我想我可以使用OpenGL ES创建一种可以通过触摸驱动/旋转的纹理天空盒。纹理是高分辨率PNG照片 这是一个受资助的项目,我有4个月的时间 我必须去哪里学习如何开发它?我必须买一本书吗?哪一个 我只有中等程度的Objectve-C和Cocoa touch技能,因为我只为iPad

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

我想我可以使用OpenGL ES创建一种可以通过触摸驱动/旋转的纹理天空盒。纹理是高分辨率PNG照片

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

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


我只有中等程度的Objectve-C和Cocoa touch技能,因为我只为iPad构建了一个应用程序。我对OpenGL ES没有任何知识

如果你从头开始学习OpenGL ES,那将非常困难。我会用图形引擎来完成大部分的繁重工作。我目前正在玩Ogre3d,从目前为止我所看到的来看,我可以推荐它:。它有现成的Skybox(以及更多),应该非常简单。

我认为你可以做到这一点,以下是一些帮助你入门的链接:

常见问题:

(我会发布直接链接,但stackoverflow不允许我)

查看stackoverflow项目编号2859722和2297564

帮助制作纹理的一些程序和提示:

太空景观

这里有一些很棒的opengl教程:

nehe.gamedev.net


它们不是特定于iphone的,但它们很好地解释了opengl。我想有些人也把它们移植到了手机上,我现在找不到了。

因为我对OpenGL ES非常了解,所以我尝试了一个演示项目,做了很多你描述的事情。具体的意图是,只要性能足够好,就用OpenGL ES下可用的最简单的方式来做任何事情

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

要实现这一点,我需要知道:

  • CoreGraphics用于从PNG获取像素数据
  • 如何设置投影堆栈以获得具有正确纵横比的透视投影
  • 如何根据成员变量操纵MODELVIEW堆栈以确保场景的两轴旋转(第一人称射击或Google StreetView样式),并确保我定义的立方体几何体不会明显与近剪裁平面相交
  • 如何向OpenGL指定顶点位置和纹理坐标
  • 如何指定OpenGL应在顶点之间构建的三角形
  • 如何相应地设置OpenGL纹理参数以仅为纹理提供一个细节级别
  • 如何跟踪触摸以操纵指示旋转的构件变量,包括一点点提供惯性旋转的力学
当然,遵循常规的view controller生命周期说明。例如,纹理在viewDidLoad上加载,在viewDidUnload上释放,以确保此视图控制器能够很好地处理潜在的内存警告

主要的观察结果是,除了了解Objective-C信号机制外,大部分都是C物质。对于OpenGL和CoreGraphics,您主要使用C数组和引用来进行C函数调用。因此,自己编写代码的先决条件是在C语言中感到快乐,而不仅仅是Objective-C语言

CoreGraphics的东西有点乏味,但它只是阅读文档,找出每种类型的东西与下一种类型的东西之间的关系——没有一种东西是真正令人困惑的。你只要想一想,你需要一个PNG数据的数据提供者,你可以从该数据提供者创建一个图像,然后用你自己分配的内存创建一个位图上下文,将图像绘制到上下文中,然后释放除你分配给自己的内存以外的所有内容,以保留结果。该结果可以直接上传到OpenGL。这是相对较短的样板文件,但OpenGL没有PNG的概念,CoreGraphics也没有将内容推入OpenGL的方便方法

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

OpenGL纹理管理的东西很简单;阅读手册只是为了了解纹理名称、名称分配、纹理参数和上传图像数据。更多的日常工作更多的是了解正确的功能,而不是管理直观的飞跃

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

  • 顶点位置
  • 与每个顶点位置对应的纹理坐标
  • 引用定义几何体的顶点位置的索引列表
在我的代码中,我使用了24个顶点,将立方体的每个面视为逻辑上离散的东西(因此,六个面,每个面有四个顶点)。为了简单起见,我只使用三角形定义了几何体。当你刚开始的时候,把这些东西提供给OpenGL实际上是很烦人的;犯错误通常意味着您的程序在OpenGL驱动程序内部深处崩溃,而不会提示您做错了什么。最好是一次积累一点

就能够承载OpenGL内容的UIView而言,我或多或少有过u