Skybox OpenGL ES iPhone 和 iPad

2023-11-30

我需要创建一个虚拟旅游工具iOS。这是一个考古应用程序:用户可以在历史建筑内或参观考古发掘时打开它。不需要末日般的主观观点:只是一个天空盒。该应用程序将包含一个兴趣点 (POI) 列表。每个 POI 都有自己的天空盒。

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

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

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

我只具备中等的 Objective-C 和 Cocoa touch 技能,因为我只为 iPad 构建了一款应用程序。我的知识为零OpenGL ES.


由于我非常了解 OpenGL ES,因此我尝试了一个演示项目,做了您所描述的大部分内容。具体目的是在 OpenGL ES 下以最简单的方式完成所有事情,只要性能足够好。

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

为了实现这一目标,我需要知道:

  • CoreGraphics 用于从 PNG 中获取像素数据
  • 如何设置 PROJECTION 堆栈以获得具有正确纵横比的透视投影
  • 如何操作 MODELVIEW 堆栈以确保根据成员变量进行场景的两轴旋转(第一人称射击游戏或 Google StreetView 风格),并确保我定义的立方体几何体不会与近剪辑平面明显相交
  • 如何向 OpenGL 指定顶点位置和纹理坐标
  • 如何指定 OpenGL 应在顶点之间构建的三角形
  • 如何相应地设置 OpenGL 纹理参数以仅提供纹理的一层细节
  • 如何跟踪触摸来操纵指示旋转的成员变量,包括一些提供惯性旋转的机制

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

主要观察结果是,除了了解 Objective-C 信号机制之外,大部分都是 C 语言的东西。您主要使用 C 数组和引用来为 OpenGL 和 CoreGraphics 进行 C 函数调用。因此,自己编写代码的先决条件是喜欢使用 C,而不仅仅是 Objective-C。

CoreGraphics 的东西有点乏味,但它只是阅读文档来弄清楚每种类型的事物如何与下一种类型相关 - 没有一个是真正令人困惑的。只要想到您需要一个用于 PNG 数据的数据提供程序,您可以从该数据提供程序创建一个图像,然后使用您自己分配的内存创建一个位图上下文,将图像绘制到上下文中,然后释放所有内容除了您自己分配给结果的内存之外。该结果可以直接上传到OpenGL。它是相对较短的样板内容,但 OpenGL 没有 PNG 的概念,并且 CoreGraphics 没有将内容推送到 OpenGL 的便捷方法。

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

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

为了向 OpenGL 提供几何图形,我刚刚完整地写出了数组。我想你需要一点空间思维才能做到这一点,但在纸上画出 3D 立方体草图并对角进行编号将会有很大帮助。共有三个相关数组:

  • 顶点位置
  • 与每个顶点位置相关的纹理坐标
  • 引用定义几何图形的顶点位置的索引列表

在我的代码中,我使用了 24 个顶点,将立方体的每个面视为逻辑上离散的事物(因此,六个面,每个面有四个顶点)。为了简单起见,我仅使用三角形定义了几何形状。当你开始时,向 OpenGL 提供这些东西实际上是相当烦人的;犯错误通常意味着您的程序在 OpenGL 驱动程序深处崩溃,并且没有提示您做错了什么。最好一次积累一点。

就能够托管 OpenGL 内容的 UIView 而言,我或多或少使用了 Apple 在 OpenGL 模板中直接提供的普通内容。我所做的一项更改是明确禁止任何使用 OpenGL ES 2.x 的尝试。 1.x 足以完成此任务,因此我们首先通过不提供两个替代渲染路径来获得简单性,其次是因为 ES 2.x 路径会复杂得多。 ES 2.x 是带有像素和顶点着色器的完全可编程管道,但在 ES 领域,固定管道被完全删除。因此,如果您想要一个,那么您必须提供自己的普通矩阵堆栈的替代品,您必须编写顶点和片段着色器来执行“带有纹理的三角形”等。

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

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

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

我会尝试找到一个地方上传该项目,以便您可以查看。我认为翻阅一下它并看看它看起来有多陌生会很有帮助。这可能会让您很好地了解是否可以在项目的时间范围内实施满足您所有需求的东西。

我将视图控制器保留为只有一个视图,即 OpenGL 视图。但是,普通的 iPhone 合成规则适用,并且在您的项目中,您可以轻松地将普通控件放在顶部。你可以在以下位置获取我的小实现媒体之火。 StackOverflow 帖子长度限制使我无法在此处放置大段代码,但如果您有任何具体问题,请随时询问。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Skybox OpenGL ES iPhone 和 iPad 的相关文章

  • 加载新控制器时,iPhone 横向模式切换到纵向模式

    我的应用程序在横向模式下正确启动并且运行良好 BOOL shouldAutorotateToInterfaceOrientation UIInterfaceOrientation interfaceOrientation if interf
  • 在发生更改事件时将货币格式重新应用到 UITextField

    我正在使用一个包含本地化货币值的 UITextField 我看过很多关于如何使用此功能的帖子 但我的问题是 如何在每次按键后将货币格式重新应用到 UITextField 我知道我可以通过以下方式设置和使用货币格式化程序 NSNumberFo
  • 有没有类似于 iOS 的 canOpenURL 来检查移动浏览器的 URL 方案? [复制]

    这个问题在这里已经有答案了 可能的重复 iPhone Safari 检查 JavaScript 是否支持 URL 方案 https stackoverflow com questions 627916 iphone safari check
  • 在 WKWebView 中禁用缩放?

    有谁知道在 WKWebView 中禁用双击和捏缩放的简单方法 我尝试过的任何方法都不起作用 Webview scrollView allowsMagnification false Error value of type WKWebView
  • iphone sqlite 静态链接?

    有人静态链接 sqlite 而不是使用动态链接 吗 我遇到的问题是 越狱手机的用户没有与普通 iPhone 所采用的 sqlite 版本相同的版本 因此导致崩溃 我假设在我的应用程序中静态链接已知版本的 sqlite 就是答案 我需要全文支
  • Glib 在 iPhone 应用程序中的使用

    我想基于现有的开源 Objective C 框架开发一个 iPhone 应用程序 但是该框架广泛使用了 glib 库 我找不到一种方法来构建和包含 iPhone 应用程序的 glib 库 非越狱 有什么办法可以做到这一点 或者有没有推荐的方
  • 如何在iOS中查找文本段范围

    如何在 iOS 中找到文本段 又名代码段 范围 意思是 文本段的起始地址和结束地址是多少 I found 这个有趣的帖子 http www pschweitzer fr p 12但它适用于 Android 但不适用于 iOS 经过一些挖掘和
  • 在后台轮询服务器的正确方法

    假设这是可能的 我希望我的 iOS 应用程序在后台时轮询服务器 即基本上每 30 分钟检索一次 URL 的内容 并通知用户是否包含 有趣 的内容 基本上以类似的方式如果您不使用推送通知 则内置邮件客户端假定的工作方式 现在 从我到目前为止的
  • iPhone - 如何通过基于度数的位置获取方向

    首先 我在班级中实现了位置管理器功能 并且运行良好 并为我提供了当前位置 从那个位置我得到了如何获得位置度here http www switchonthecode com tutorials getting your location i
  • iphone sdk - 调用视图的超级视图的视图控制器的方法

    你好 我如何在当前视图中调用当前视图的超级视图的视图控制器中实现的方法 你能帮我吗 谢谢 通常这是通过代表完成的 让您的视图接口定义一个协议和对某个委托的引用 然后让你的父视图控制器实现这个协议 然后父母会这样做 someView fooD
  • UILocalNotification 播放自定义声音

    我在我的应用程序中实现了本地通知 但我只是想知道是否有一种方法可以播放不属于 iPhone 应用程序主包的一部分的声音 基本上在我的应用程序中 我希望用户录制生成本地通知时播放的声音 而不是播放预先录制的或默认的声音 据我所知 这是可以实现
  • 如何在OpenGL ES中显示yuv格式的数据而不转换rgb?

    我一直在研究 iOS 的 OpenGL ES 我想知道YUV格式的数据是否可以在不转换RGB的情况下显示 大多数情况下 yuv 数据必须转换为 RGB 才能显示 但是 转换过程非常慢 然后 显示不流畅 所以 我想尝试在不转换为RGB的情况下
  • 创建自定义 MCBrowserViewController

    有没有办法创建一个UITableView包含在中找到的相同信息MCBrowserViewController 我当前的代码只允许推送与我的应用程序设计不同的标准视图 self browserVC MCBrowserViewControlle
  • iPad 2 检测

    由于我没有 iPad 2 因此我需要知道调用 UIDevice currentDevice model 时它返回什么 我以为它只返回 iPad 但看来我错了 有人可以告诉我吗 Thanks 检查是否有带摄像头的 iPad BOOL isIP
  • 方向改变时重新定位控件

    我知道自动布局可用于在方向改变时使尺寸和位置保持一致 当方向改变时 是否可以完全改变布局 例如 请查看下面的纵向模式下简单登录屏幕的线框 现在 如果我旋转设备 我想完全重新定位控件 这种事情可以用自动布局来完成吗 如果没有 我该怎么办 谢谢
  • 如何在 UIAlertView (iOS) 中的其他两个按钮(堆叠)之间添加取消按钮

    我正在尝试创建一个带有三个按钮 将堆叠 的 UIAlertView 我希望 取消 按钮位于其他两个按钮之间的中间 我尝试将 cancelButtonIndex 设置为 1 但如果还有其他两个按钮 它只会将它们放置在索引 0 和 1 处 我知
  • 使用 AVMutableVideoCompositionLayerInstruction 旋转视频

    我正在 iPhone 4 上使用前置摄像头拍摄视频 并将视频与其他一些媒体资源结合起来 我希望该视频为纵向 所有视频的默认方向都是横向 在某些情况下 您必须手动管理 我正在使用 AVFoundation 特别是 AVAssetExportS
  • 如何使用 iOS 可达性

    我正在开发一个使用网络的 iPhone 应用程序 iPhone 通过 HTTP 请求与我的服务器通信 并且应该可以在 WiFi 和 3G 上运行 我目前使用NSURLConnection initWithRequest向我的服务器发送异步请
  • 如何将图像放入此 UIPickerView 中?

    我不知道如何创建一个在文本一侧带有图像的自定义 UIPickerView 我一直在寻找一种方法 我刚刚发现了这个 UIView pickerView UIPickerView pickerView viewForRow NSInteger
  • 将静态库合并为单个

    如何将静态库合并为一个 我确实有三个静态库 libSignatureLibary armv6 a libSignatureLibary armv7 a 和 libSignatureLibary i368 a 现在我想将这三个文件合并到一个库

随机推荐

  • 从另一个线程填充列表视图

    我试图从另一个类填充列表视图 但出现此错误 跨线程操作无效 控制 listView1 是从创建它的线程以外的线程访问的 在我的课堂上 我像这样声明我的列表视图 class CheckBlankPages public String pdfF
  • 使用#pragma warning push/pop 是暂时改变警告级别的正确方法吗?

    有时很难编写完全不发出警告的 C 代码 然而 启用警告是一个好主意 因此 通常有必要禁用某些特定构造的警告 并在所有其他代码片段中启用它们 到目前为止我已经看到了两种方法 第一个是使用 pragma warning push and pra
  • “main”函数的返回值去了哪里?

    在C语言中 一个函数always将其值返回给调用函数 而不是返回给其自身 如果返回类型不为 void Like int main 但是由于 main 函数是由操作系统调用 即不是一个函数 那么 main 函数返回值给谁呢 当使用表达式返回值
  • 在给定字符串中搜索字符集的最快算法

    这是我和我的一位朋友进行的一场辩论 制作一种验证方法来检查给定字符串是否具有不允许的字符之一的最快方法是什么 方法一 简单 char invalidChars toCharArray for int i 0 i lt myString le
  • 在 pandas 中按组填充缺失的日期

    我需要按组填写缺失的日期 这是创建数据框的代码 我只想将填充列的日期向下添加到填充列的日期更改时 并且仅直到组 名称 更改为止 data tdate 20080815 20080915 20081226 20090110 20090131
  • PHP无法通过python连接mysql

    我正在编写一个 PHP 来执行一个像这样连接到 mysql 的 python 脚本 在Python脚本中 coding utf 8 import mysql connector 并得到这个错误 回溯 最近一次调用最后一次 导入中的文件 do
  • 显示单元格的公式,但显示值而不是引用

    我正在使用公式在另一个单元格中显示单元格公式 我想显示这个公式中每个参考的值 而不是参考 Ex R 16 R19 T 15 R 16 想要它成为 3 2 4 2 我现在使用的函数来显示公式 Function GetFormula Cell
  • 聚合物select2元件

    我正在尝试包装很棒的 select2 jquery 小部件 https github com ivaynberg select2 在聚合物元素中以便于重复使用 我能够正确初始化选择 但在初始化后遇到问题 具体来说 当单击选择将其打开时 在定
  • 使用 gmaps4rails 显示多边形

    红宝石新手在这里 尝试使用 gmaps4rails gem 顺便说一句 很棒的 gem 在谷歌地图上将点列表显示为多边形 任何基于下面的代码示例的建议将不胜感激 我可以看到地图的轮廓 但看不到地图 也没有多边形 更新 此代码已更新 问题已解
  • 如何阻止 VS Code 在按 Enter 键时自动选择第一个建议?

    每当我在 flutter 代码中输入 Widget 函数并按 Enter 键时 VS Code 都会自动选择第一个参数建议 当我实际上想要在下一行输入该参数时 该参数会在同一行上输入 有没有办法在顶部添加一个空建议 以便我必须先按向下箭头才
  • 我需要 ($("#flip").click slipToggle ) 在同一页面上使用相同的

    我有一个使用 XSl 代码从 XML 读取的常见问题解答页面 问题和答案的 div 将重复与 XML 中的记录数一样多 这是 XSL 代码
  • android - 内存不足问题

    在我的应用程序中 我正在从网络下载图像 为此 我第一次从网络下载图像 这些图像存储在 SD 卡中 下次 我会检查这些图像是否在 SD 卡中 如果是 则从 SD 卡获取 否则我将从网络下载 这些图像像列表一样显示 我反复 意味着连续向上 向下
  • 设备和模拟器上的 Android LinkedIn 集成错误

    我正在尝试使用此问题答案集成 linkedIn从 Android 应用程序发布 LinkedIn 消息但这个给定的示例 LITest 无法在设备上工作 它向我显示了一些错误 如下所示 12 19 19 36 30 489 ERROR And
  • ES6 Yield:第一次调用 next() 的参数会发生什么?

    考虑这段代码 function foo a console log Mul a return a 2 function process start next 1 var result start console log Pre proces
  • 如何从包含像素的数组创建 BufferedImage?

    我从以下位置获取像素BufferedImage使用该方法getRGB 像素存储在名为的数组中data 对数据数组进行一些操作后 我需要创建一个BufferedImage再次这样我就可以将它传递给一个模块 该模块将显示来自该数据数组的修改后的
  • 将向量传递给函数 C++

    我有一个 main cpp test h 和 test cpp gt 我试图传递我的向量 以便我可以在 test cpp 中使用它 但我不断收到错误 file main cpp int main vector
  • Mod 将规则重写为 Zeus 服务器规则 (Codeigniter)

    我即将上线由 Codeigniter 提供支持的网站 我想从网址中删除index php 而不是这样 http www mysite com index php controller 我得到这样的东西 http www mysite com
  • 创建多个(15+)HTTP 响应过滤器,继承与组合与注入

    首先是关于我想要实现的目标的一些背景故事 我正在创建一个自定义 HTTP 模块 其目的是拦截发送到多个 15 不同 ArcGIS REST Web 服务的消息 拦截的请求和 或响应将被剥离基于当前用户的任何受限信息 例如 返回多个层的调用可
  • 这在 JavaScript 中叫什么? ({名称,值}) => [重复]

    这个问题在这里已经有答案了 在 JavaScript 中 在这种情况下 const component name value gt span span 其中箭头函数的第一个参数与其成员分开 props gt name value 这个叫什么
  • Skybox OpenGL ES iPhone 和 iPad

    我需要创建一个虚拟旅游工具iOS 这是一个考古应用程序 用户可以在历史建筑内或参观考古发掘时打开它 不需要末日般的主观观点 只是一个天空盒 该应用程序将包含一个兴趣点 POI 列表 每个 POI 都有自己的天空盒 我想我可以使用OpenGL