アイソメビューフラッシュゲームで描画順序を決定するにはどうすればよいですか?


12

これは、等角投影ビューのフラッシュゲーム用です。オブジェクトを並べ替える方法を知る必要があるので、描画時にzバッファをチェックする必要はありません。これは簡単に思えるかもしれませんが、別の制限があります。シーンには10,000個以上のオブジェクトを含めることができるため、アルゴリズムはO(n ^ 2)未満で実行する必要があります。すべてのオブジェクトは長方形のボックスであり、シーン内で3〜4個のオブジェクトが移動しています。これを行う最良の方法は何ですか?

更新

各タイルにはオブジェクトのみがあります(つまり、オブジェクトを互いに重ねることはできません)。オブジェクトのマップとオブジェクトの両方にアクセスし、それぞれの位置を持っています。

更新2

これらの図を参照してください。

ここに画像の説明を入力してください ここに画像の説明を入力してください

最初に最初に青いオブジェクトを描画し、次に緑、次に赤を描画します。一方、2番目では逆の順序で描画する必要があります。最初に赤、次に緑、最​​後に青のオブジェクトを描画する必要があります。ご覧のとおり、青と赤のオブジェクトの位置に違いはありません。両方ともカメラからの距離が異なります。しかし、緑色のボックスに対する相対的な位置のため、2つの画像間で描画順序を変更する必要があります。それがこの問題を混乱させるものです。

補足:すべてのオブジェクトは直角プリズムであるため、問題のニーズを満たすために少なくとも1つの描画順序があることを数学的に証明できます。


2
詳細情報を投稿する必要があります。オブジェクトはスタックできますか(3d)?オブジェクトに位置があるか、マップにオブジェクトがありますか?など
kaoD


@Tetradええ、しかし、シーンに配置するオブジェクトについては少し違いがあります。
Ali1S232

@Gajet(更新後)オブジェクトは、1 * XとX * 1のみ、またはX * Yにしかできませんか?オブジェクトをいくつかのサブオブジェクトに分割する余裕はありますか?(緑が4つのサブグリーンオブジェクトであるように)オブジェクトの向きは固定されていますか?
kaoD

また、オブジェクトの高さは何個の隣接するタイルでわかりにくいでしょうか?
kaoD

回答:


8

オブジェクトが等尺性タイルと一致する場合、これは実際には非常に簡単です。この画像を見てください:

等尺性の描画順序

最初にオブジェクトを赤い位置に、次にオブジェクトを青、次に緑、次に黄色、次にマゼンタなどで描画する必要があります。ボードにオブジェクトの代わりにオブジェクトがある場合、これを実装する方法はかなり明白です。属性として位置を持ちます。そうでない場合は、別のデータ構造を保持し、オブジェクトが移動するたびに更新する必要があります(これも非常に簡単です)。

これには新たな問題があります。その複雑さがO(N)であることが簡単にわかります(Nはボードサイズ(N=W*H。)です。この問題を克服するには、構造内の各インデックスが特定の深さに一致する新しい線形データ構造を作成し、オブジェクトの深さが変わるたびに更新します。

オブジェクトが単一のタイルと一致しない場合は少し難しいので、質問を更新したらすぐに必要に応じて投稿します。


そのアルゴリズムは私の頭に浮かんだ最初のものでもありますが、私の更新を参照してください、それはあなたが変更せずにそれを使用できない理由です。
Ali1S232

1
@Gajet、それはあなたが最初にあなたの質問に投稿しなければならない種類のものです:P
kaoD

3
これは、「タイル」+1で大きなパーツ分割進むべき道である
Valmond

2

このテーマに関する特別な知識はありませんが、ここに考えがあります。

各セルを「未描画」としてマークすることから始めます。(または、同等に、配列を使用して、セルの各「遠い線」またはセットなどに最も近い「描画された」ものの位置を表します。)次に、各セルに対して(おそらく、説明した順序kaoD):そのセルが描画されているかどうかを確認します。描画されておらず、オブジェクトが含まれている場合は、そのオブジェクトによって隠される各セルが描画されているかどうかを確認し、そうでない場合は再帰的に描画します。必要に応じて、そのセルに含まれるオブジェクトを描画します。そのセルと、そのオブジェクトが占めるセルを「描画済み」としてマークします。

私は、もしあれば、その中のオブジェクトにセルを素早くマップできると仮定しています。これはO(n)の時間だと思いますが、最終的には大きなスタックを構築する可能性があります(スタックスペースが不足することを心配している場合は、リンクリストに変更することができます)。

リストが本当に必要な場合は、描画する代わりにリストに追加できます。ほとんどソートされたリストから始めるのは役に立たないと思います。


このアルゴリズムは、問題に適合したトポロジカルソートの一種と見なすことができます。私はちょうどその方向を漠然と自分で指していました。トポロジカルソートは、ほとんどの順序付け/依存関係の問題の解決策です。
ケビンリード

1

画家のアルゴリズムを使用して、カメラから最も遠いセルからタクシーの距離を離し、最初にカメラに最も近いセルを描画してから、外側に移動します。

編集:これは、各セルの内容を個別に描画できない限り機能しません。


これはうまくいくかもしれませんが、byte56やkaoDが提案したアルゴリズムとどう違うのかわかりません。私には、2回目の編集で説明したのと同じ問題があるようです。
Ali1S232

1

「問題のニーズを満たすために、少なくとも1つの描画順序があることを数学的に証明できる」と信じる理由は何ですか?以下は、zソートオブジェクトに依存できない些細な反例です。

ここに画像の説明を入力してください


好奇心から...反例を詳しく説明していただけますか?それはグリッドではありません。
kaoD

各タイルにはオブジェクトが1つしかなく、オブジェクトは1つまたは複数のタイルを占有する場合がありますが、それらは常に平面上に長方形の投影を持つことに注意してください。これらの2つの条件は、そのステートメントを証明するのに十分です。
Ali1S232

さて、これらの制限とグリッドが平坦であるという事実には解決策があります。後で投稿します。
サムホセバー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.