エンティティごとに1つのタイプの1つのコンポーネントを壊すことなく、エンティティごとに複数のメッシュを使用するにはどうすればよいですか?


11

階層ベースのゲームエンジンからコンポーネントベースのゲームエンジンに切り替えるだけです。私の問題は、メッシュの階層を持つモデルをロードすると、コンポーネントベースのシステムのエンティティは同じタイプの複数のコンポーネントを持つことができないが、それぞれに「meshComponent」が必要になるということです。モデルのメッシュ。だから私はこの問題をどのように解決できますか?

このサイトでは、コンポーネントベースのゲームエンジンを実装しました:http : //cowboyprogramming.com/2007/01/05/evolve-your-heirachy/


これはローカライズされすぎていると思います。
jcora

4
それは一般的な質問だと思います。ゲームオブジェクトは同じコンポーネントの複数のインスタンスを持つことができますか?
MathiasHölzl12年

うん、それはいたかもしれない、それはそのように頼まれた場合には、なって。私には、彼が非常に具体的な問題の答えを探しているように見えます。
jcora

4
「...コンポーネントベースのシステムのエンティティは、同じタイプの複数のコンポーネントを持つことはできません...」-なぜそうしないのですか?
2012年

あまりにもローカライズされているとは思いません。たとえばUE3では、SkeletalMeshActor1つしかありませんSkeletalMeshComponent。これは、さまざまな方法で対処できる一般的な問題です。
sam hocevar

回答:


13

Positionコンポーネントには「親/子」ロジックを含めることができます。この場合、Positionを持つエンティティには親があり、それらの位置は親を基準にしています。同じエンティティに複数のメッシュを配置する代わりに、複数のエンティティを作成し、それぞれに独自のメッシュを設定して、それらをリンクすることができます。子エンティティに親イベント(またはエンティティ間の通信に使用するシステム)をリッスンさせ、それに応じて対応させることもできます。


したがって、エンティティの階層があり、これらのエンティティにはコンポーネントがあり、リンクされています。それでもコンポーネントベースのゲームエンジン=)
MathiasHölzl、

@MathiasHölzlはその質問ですか?この種の階層は、OOPの問題のある階層と同じではありません。これは単なるグラフィカルな階層であり、子エンティティは親から機能を継承せず、問題を引き起こしません。通常、これはとにかく行われます(レンダリングするもののツリーがあります)。メッシュのリストがあれば、あなたの問題に対するAsakeronの回答を使用することもできます。多分私はあなたの質問を理解していませんか?
ルークB.

-1それが本当に進むべき道かどうかわからない。必要なのがメッシュの階層を処理するコンポーネントである場合、メッシュの階層を含むコンポーネントがないのはなぜModelComponentですか?そのためだけにエンティティを分割することは、問題に対する間違った解決策のように聞こえます。AsakeronとByte56の回答を参照してください。
Laurent Couvidou 2012年

@LaurentCouvidou複数のエンティティを使用することが間違っている理由はわかりませんが、私にとっては良い解決策のようです。私はメッシュのリストを作成する別の方法を提供したかっただけですが、メッシュのリストも良い解決策になることに同意します。
ルークB.

@LukeB。このメッシュのグループは、これに依存するコンポーネント(AI、サウンド、物理など)を使用して、全体として1つのエンティティに対応できるため、これを行うと、シーングラフとそのすべての癖ができます。
Laurent Couvidou 2012年

8

meshComponentには、メッシュのリストを含めることができます。エンジンの実装方法はわかりませんが、システムはすべてのメッシュを簡単に反復して、単純にそれらを描画できます。


1
メッシュは、コンポーネント変換好きもあり下剤、グラフィック...
マティアスHölzl

1
それで、メッシュは実体ですか?それともすべてがコンポーネントですか?私がそれを見る方法、変換、物理的およびグラフィックは、メッシュ内ではなくエンティティ内のコンポーネントである必要があります。メッシュは頂点の単なる説明です。
ルークB.

1
ええ、それはコンポーネントであるべきですが、コンポーネントはコンポーネントを持つことができないので、モデルの階層を実装するのは難しいです。
MathiasHölzl2012年

1
より良い答えを得るには、エンジンをどのように構築するかについて、もっと情報を提供する必要があると思います。エンティティコンポーネントシステムはさまざまな方法で実装できます。詳細については、Kylotanによるこの回答を確認してください。
Asakeron 2012年

4

メッシュオブジェクトのリストを使用してメッシュコンポーネントを作成します。各メッシュオブジェクトには、オフセットとともにメッシュデータがあります。描画する場合、描画システムは位置コンポーネントから位置を取得し、メッシュコンポーネントの各メッシュを位置+オフセットで描画します。

エンティティごとに1つのメッシュコンポーネントを使用して、メッシュコンポーネント内に複数のメッシュを含めることができます。


1

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は、アイテムを描画するために必要です-モデラーからのものだけでなく、必要なものすべて。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.