TLDR:まず、コンポーネントを複数のメッシュで構成します。
Asakeron / Byte56 / Laurentには、メッシュ/マテリアルのペアとエンティティ自体の間に別のレベルの間接参照が必要であることに同意します。GraphicsComponentを頂点とマテリアルとして見る代わりに、それを最終的なラスターのピクセルの塊として考えてください-どのようにしてそこに到達するのかは、実装の詳細だけで、それ以上はありません。
私のプロジェクトではこれについて多くのことを考えましたが、最適な解決策はGraphicsComponentをはるかに高いレベルのコンポーネントにして、従来の「モデル」オブジェクトの機能の多くを網羅することです-この機能はオプションではないためです!これらのポリゴンをレンダリングするには、バッファーデータとシェーダーだけでなく、次のようなものが必要です。
- あなたが言及したポジション
- スキニング/アニメーションデータ
- 現在のパス(2パスアルファを使用している場合など)
- シャドウキャスティング情報(実行している場合)
- 資料を更新する方法と時期に関する情報
- カリング機能
これは、パーティクルシステムやビルボードなどを考慮せずに、3Dアセットのみを対象としています。しかし、すべてはグラフィックス/レンダリングコードにのみ関連します。物理、サウンド、スクリプトには影響しないため、座っている必要があります。 Graphics / Renderingコンポーネント。
私は次のようになりました:
Model : Entity, IHasGraphicsComponent, IHasSkeleton, IHasAnimationStore //This is the 'game object' - it is passed to the GraphicsController
ModelComponent : GraphicsComponent //This is the actual graphics component, used by the GraphicsController in the context of the game object.
ModelComponentPart : GraphicsComponent //This is also a graphics component
Mesh //These are implementation details
Material
ModelComponentPart : GraphicsComponent
Mesh
Material
Skeleton
Animations
これで:
モデルは、グラフィックスコンポーネントを持つゲームアセットです。
ModelComponentは従来のモデルに類似しており、実際には3Dアセット用です。GraphicsComponentコントローラー(Model-View-Controllerパターンを使用する場合)は、それがどのタイプのグラフィックアセットであるかを把握し、正しく描画します(ModelComponentはGraphicsComponentのサブクラスであることに注意してください)。
各GraphicsComponentもEntityであり、Entityは位置データを直接格納するため、1つの場所でのみ計算されるが、考え方は同じです。GraphicsComponentは、アイテムを描画するために必要です-モデラーからのものだけでなく、必要なものすべて。