モデルに関しては、との関係に類似したアプローチが適切だと思いUIImage
ますUIImageView
。したがって、すべてのタイプのブリックには、単一の頂点バッファ、GLKBaseEffect
テクスチャなどがあります。UIImageViews
複数のブリックが同じを使用するのと同じように、各ブリックは複数回表示される場合がありますUIImage
。複数の参照フレームを保持するという点では、実際には、と本質的に同等の階層を構築することをお勧めしますUIView
。各階層には、親に対する変換が含まれ、1つのソートでモデルを表示できます。
GLKitのドキュメントから、必要な種類のカメラ(および実際にはオブジェクトの場所)を保持するための最良の方法は、GLKMatrix4
またはとして直接保存することGLKQuaternion
だと思います。したがって、マトリックスまたはクォータニオン(および場所)をから導出することはありません。カメラのその他の説明ではなく、マトリックスまたはクォータニオンが直接カメラのストレージです。
これらのクラスは両方とも、回転を適用するためのメソッドが組み込まれており、GLKMatrix4
平行移動を直接処理できます。したがって、関連するジェスチャをこれらの関数に直接マッピングできます。
そのようにカメラを扱うときに私が考えることができる唯一のわずかに自明ではないことは、それ自体ではなく、OpenGLに逆を送信したいということです。マトリックスを使用すると仮定すると、その場所にオブジェクトを描画する場合は、マトリックスを直接ロードしてからオブジェクトを描画するというのが理由です。カメラと同じ場所にオブジェクトを描画すると、最終的には原点に描画されます。したがって、カメラにロードする必要のあるマトリックスは、その場所に描画するためにロードするマトリックスの逆行列です。これは、2つを乗算して単位行列にするためです。
あなたのレンガのモデルがどれほど複雑かはわかりませんが、それらが単純ですべてが完全に独立して動いている場合、パフォーマンスのボトルネックにぶつかる可能性があります。OpenGLを扱う際の一般的なルールは、一度に送信できるジオメトリが多いほど、すべてが速くなるということです。したがって、たとえば、ほとんどのゲームのような完全に静的な世界は、すべてが独立して移動できる世界よりも効率的に描画する方がはるかに簡単です。6面体の立方体を描画し、それらをすべて個別に移動する場合、予想よりもパフォーマンスが低下する可能性があります。
協調して動くレンガがある場合は、それらを単一のジオメトリとして描画する方が効率的です。はっきりと見えないレンガがある場合は、それらを描画しようとさえしないでください。iOS 5の時点でGL_EXT_occlusion_query_boolean
利用可能です。これは、OpenGLにジオメトリを渡し、そのいずれかが表示されているかどうかを確認する方法です。これをリアルタイムシーンで使用するには、データを説明する階層構造を構築し(類推を直接実行した場合はすでに存在しますUIView
)、各ビューの境界ジオメトリを計算または保存し、オクルージョンクエリの場合にのみ描画を実行します。境界ジオメトリの少なくとも一部が表示されることを示唆しています。この種のロジックに従うことで、ジオメトリを送信するずっと前に、ジオメトリの大きな帯を破棄できることがよくあります。