2

新しいGLKitフレームワークを使用してアプリを作成したいのですが、設計に関するアドバイスが必要です。最大数千の「ブリック」(非常に単純なジオメトリのオブジェクト)を表示するアプリを作成したいと思います。ほとんどが同じテクスチャを持ちますが、最大数百は独特のテクスチャを持ちます。レンガが数秒ごとに表示され、所定の位置に移動してから、(世界の座標で)配置されたままになります。ユーザーのジェスチャーによって位置と向きが制御されるカメラをシミュレートしたいと思います。

私が必要とするアドバイスは、コードを整理する方法についてです。モデルを、グラフィックデータよりもはるかに多くのブリックに関連付けられたブリックのコレクションにしたいと思います。

  • ビューのようなオブジェクトを各ハンドルのジオメトリ、テクスチャなどに関連付けることは意味がありますか?
  • すべてのブリックに独自の頂点バッファーが必要ですか?
  • それぞれに独自のGLKBaseEffectが必要ですか?
  • セットアップ中にどのオブジェクトが何を実行するかを整理してからレンダリングするためのヘルプを探しています。

GLKViewControllerがモデルの状態の変化を観察したり、ジェスチャーに基づいて目の座標を制御したりすることで、典型的なMVCパターンに近づき続けることができれば幸いです。

あなたがいくつかのアドバイスを与えるか、良い例に向かって私を導くことができれば、多くの義務があります。前もって感謝します!

4

1 に答える 1

1

モデルに関しては、との関係に類似したアプローチが適切だと思いUIImageますUIImageView。したがって、すべてのタイプのブリックには、単一の頂点バッファ、GLKBaseEffectテクスチャなどがあります。UIImageViews複数のブリックが同じを使用するのと同じように、各ブリックは複数回表示される場合がありますUIImage。複数の参照フレームを保持するという点では、実際には、と本質的に同等の階層を構築することをお勧めしますUIView。各階層には、親に対する変換が含まれ、1つのソートでモデルを表示できます。

GLKitのドキュメントから、必要な種類のカメラ(および実際にはオブジェクトの場所)を保持するための最良の方法は、GLKMatrix4またはとして直接保存することGLKQuaternionだと思います。したがって、マトリックスまたはクォータニオン(および場所)をから導出することはありません。カメラのその他の説明ではなく、マトリックスまたはクォータニオンが直接カメラのストレージです。

これらのクラスは両方とも、回転を適用するためのメソッドが組み込まれており、GLKMatrix4平行移動を直接処理できます。したがって、関連するジェスチャをこれらの関数に直接マッピングできます。

そのようにカメラを扱うときに私が考えることができる唯一のわずかに自明ではないことは、それ自体ではなく、OpenGLにを送信したいということです。マトリックスを使用すると仮定すると、その場所にオブジェクトを描画する場合は、マトリックスを直接ロードしてからオブジェクトを描画するというのが理由です。カメラと同じ場所にオブジェクトを描画すると、最終的には原点に描画されます。したがって、カメラにロードする必要のあるマトリックスは、その場所に描画するためにロードするマトリックスの逆行列です。これは、2つを乗算して単位行列にするためです。

あなたのレンガのモデルがどれほど複雑かはわかりませんが、それらが単純ですべてが完全に独立して動いている場合、パフォーマンスのボトルネックにぶつかる可能性があります。OpenGLを扱う際の一般的なルールは、一度に送信できるジオメトリが多いほど、すべてが速くなるということです。したがって、たとえば、ほとんどのゲームのような完全に静的な世界は、すべてが独立して移動できる世界よりも効率的に描画する方がはるかに簡単です。6面体の立方体を描画し、それらをすべて個別に移動する場合、予想よりもパフォーマンスが低下する可能性があります。

協調して動くレンガがある場合は、それらを単一のジオメトリとして描画する方が効率的です。はっきりと見えないレンガがある場合は、それらを描画しようとさえしないでください。iOS 5の時点でGL_EXT_occlusion_query_boolean利用可能です。これは、OpenGLにジオメトリを渡し、そのいずれかが表示されているかどうかを確認する方法です。これをリアルタイムシーンで使用するには、データを説明する階層構造を構築し(類推を直接実行した場合はすでに存在しますUIView)、各ビューの境界ジオメトリを計算または保存し、オクルージョンクエリの場合にのみ描画を実行します。境界ジオメトリの少なくとも一部が表示されることを示唆しています。この種のロジックに従うことで、ジオメトリを送信するずっと前に、ジオメトリの大きな帯を破棄できることがよくあります。

于 2011-10-31T14:50:39.617 に答える