2

我想使用新的 GLKit 框架构建一个应用程序,我需要一些设计建议。我想创建一个应用程序,最多可以显示几千个“砖块”(具有非常简单几何形状的对象)。大多数将具有相同的纹理,但多达几百个将具有独特的纹理。我希望砖块每隔几秒钟出现一次,移动到位然后保持原位(在世界坐标中)。我想模拟一个位置和方向由用户手势控制的相机。

我需要的建议是关于如何组织代码。我希望我的模型是一个积木的集合,其中包含的不仅仅是与它们相关的图形数据:

  • 将类似视图的对象与每个手柄几何体、纹理等相关联是否有意义?
  • 每块砖都应该有自己的顶点缓冲区吗?
  • 每个人都应该有自己的 GLKBaseEffect 吗?
  • 我正在寻找帮助组织在设置过程中应该做什么对象,然后渲染。

我希望我可以保持接近典型的 MVC 模式,我的 GLKViewController 观察模型状态变化,根据手势控制眼睛坐标等等。

如果您能提供一些建议或引导我找到一个好例子,我将不胜感激。提前致谢!

4

1 回答 1

1

关于模型,我认为类似于 和 之间的关系的方法UIImageUIImageView合适的。因此,每种类型的砖块都有一个顶点缓冲区GLKBaseEffect、纹理和其他任何东西。然后,每个砖块可能会出现多次,就像多个砖块可能UIImageViews使用相同的一样UIImage。就保持多个参考框架而言,构建一个基本上等同于 的层次结构实际上是一个非常好的主意UIView,每个层次结构都包含一些相对于父级的变换,并且一种能够显示模型。

从 GLKit 文档中,我认为保留您想要的相机类型(实际上是对象位置)的最佳方法是将其直接存储为 aGLKMatrix4或 a GLKQuaternion- 这样您就不会从中派生矩阵或四元数(加上位置)相机的其他一些描述,而不是矩阵或四元数直接是相机的存储。

这两个类都有内置的方法来应用旋转,并且GLKMatrix4可以直接处理平移。因此,您可以直接将相关手势映射到这些功能。

以这种方式处理相机时,我能想到的唯一不太明显的事情是,您希望将逆向发送到 OpenGL 而不是事物本身。假设您使用矩阵,原因是如果您想在该位置绘制对象,您将直接加载矩阵然后绘制对象。当您在与相机相同的位置绘制对象时,您希望它最终被绘制在原点。因此,您必须为相机加载的矩阵是您要加载以在该位置绘制的矩阵的倒数,因为您希望将两者相乘成为单位矩阵。

我不确定你的积木模型有多复杂,但如果它们很简单并且完全独立移动,你可能会遇到性能瓶颈。处理 OpenGL 时的一般规则是一次提交的几何图形越多,一切进行得越快。因此,例如,在大多数游戏中,一个完全静态的世界比一个所有东西都可以独立移动的世界更容易有效地绘制。如果您正在绘制六面立方体并独立移动它们,那么您可能会看到比您预期的更差的性能。

如果您有任何一起移动的砖块,那么将它们绘制为单个几何图形会更有效。如果您有任何绝对不可见的砖块,那么甚至不要尝试绘制它们。从 iOS 5 开始,GL_EXT_occlusion_query_boolean它是可用的,这是一种将一些几何体传递给 OpenGL 并询问它是否可见的方法。您可以在实时场景中使用它,方法是构建描述数据的层次结构(如果您直接遵循UIView类比,您将已经拥有),为每个视图计算或存储一些边界几何,并且仅在遮挡查询时进行绘制表明至少有一些边界几何是可见的。通过遵循这种逻辑,您通常可以在提交之前很久就丢弃大量几何图形。

于 2011-10-31T14:50:39.617 回答