关于模型,我认为类似于 和 之间的关系的方法UIImage
是UIImageView
合适的。因此,每种类型的砖块都有一个顶点缓冲区GLKBaseEffect
、纹理和其他任何东西。然后,每个砖块可能会出现多次,就像多个砖块可能UIImageViews
使用相同的一样UIImage
。就保持多个参考框架而言,构建一个基本上等同于 的层次结构实际上是一个非常好的主意UIView
,每个层次结构都包含一些相对于父级的变换,并且一种能够显示模型。
从 GLKit 文档中,我认为保留您想要的相机类型(实际上是对象位置)的最佳方法是将其直接存储为 aGLKMatrix4
或 a GLKQuaternion
- 这样您就不会从中派生矩阵或四元数(加上位置)相机的其他一些描述,而不是矩阵或四元数直接是相机的存储。
这两个类都有内置的方法来应用旋转,并且GLKMatrix4
可以直接处理平移。因此,您可以直接将相关手势映射到这些功能。
以这种方式处理相机时,我能想到的唯一不太明显的事情是,您希望将逆向发送到 OpenGL 而不是事物本身。假设您使用矩阵,原因是如果您想在该位置绘制对象,您将直接加载矩阵然后绘制对象。当您在与相机相同的位置绘制对象时,您希望它最终被绘制在原点。因此,您必须为相机加载的矩阵是您要加载以在该位置绘制的矩阵的倒数,因为您希望将两者相乘成为单位矩阵。
我不确定你的积木模型有多复杂,但如果它们很简单并且完全独立移动,你可能会遇到性能瓶颈。处理 OpenGL 时的一般规则是一次提交的几何图形越多,一切进行得越快。因此,例如,在大多数游戏中,一个完全静态的世界比一个所有东西都可以独立移动的世界更容易有效地绘制。如果您正在绘制六面立方体并独立移动它们,那么您可能会看到比您预期的更差的性能。
如果您有任何一起移动的砖块,那么将它们绘制为单个几何图形会更有效。如果您有任何绝对不可见的砖块,那么甚至不要尝试绘制它们。从 iOS 5 开始,GL_EXT_occlusion_query_boolean
它是可用的,这是一种将一些几何体传递给 OpenGL 并询问它是否可见的方法。您可以在实时场景中使用它,方法是构建描述数据的层次结构(如果您直接遵循UIView
类比,您将已经拥有),为每个视图计算或存储一些边界几何,并且仅在遮挡查询时进行绘制表明至少有一些边界几何是可见的。通过遵循这种逻辑,您通常可以在提交之前很久就丢弃大量几何图形。