ポリゴンを順番に並べ替えます-機能しませんか?


7

私は3Dの世界でプログラミングをするのはかなり新しいです。

すべてのオブジェクトが最も遠いものから最も近いものへ、下から上へと描画されるキャンバスを作成しようとしています。そのため、オブジェクトは互いに重なりませんが、問題があります。

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

ご覧のとおり、一部のオブジェクトは互いに重なり合っています。画面内のどのオブジェクトも移動しないので、疑問に思っていました。オブジェクトを正しい順序でソートするために使用できるアルゴリズムはありますか?現時点では、Z軸で昇順に並べ替え、次にXで降順、Yで降順に並べ替えています。


2
あなたが3Dプログラミングに不慣れだと言ったので、私は恣意的に質問しますが、使用しているエンジンは深度テストをサポートしていませんか?深さの並べ替えは、これまでのところあなたを得るだけです。たとえば、LまたはT字型ブロックなど、この1つの問題を解決しても、アーティファクトが発生します
dreta

+1。これは3d全般に広く関心のあるトピックであり、あなたのイラストは素晴らしいからです。
Patrick Hughes

回答:


3

コメントで@dretaが言及したように、3Dエンジンがこれを解決する一般的な方法は、深度バッファーとハードウェアの深度テストを使用することです。これにより、任意の形状のオブジェクトを任意の順序で描画し、各ピクセルで最も近い表面を追跡できます。 。オブジェクトを手動でソートすることも可能ですが、必ずしも非凸オブジェクトまたは重なり合うオブジェクトを正しく処理するわけではありません。

ただし、オブジェクトを並べ替える場合は、各オブジェクトの深度値を計算してから、深度の降順で並べ替える必要があります。奥行きを取得するには、一般的な3Dエンジンセットアップを使用している場合、ビューマトリックス(ワールドスペースからビュースペースに移動する)を介して各オブジェクトの中心点を変換し、次にZ座標の負の値を取る必要があります。結果。(XとYが画面と揃っている右手座標ではZは画面の外を向いているため、負です。)

それが常にこのような等角図である場合、おそらく深さ=±X±Y-Zを計算することで逃げることができます。ここで、±は、カメラから離れるにつれて深さが増加する記号を選択することを意味します。これは、X軸とY軸の方向によって異なります。


アイソメビューを使用していても、深度値を使用して形状をソートすることはできません。形状とシーン構成が複雑すぎない(そして通常はそうである)場合に実行できる唯一のことは、部分的な順序を作成することです(つまり、2つの形状が与えられたら、どちらを先に描画するかを指示します)。それから、(たとえば、トポロジカルソートを使用して)形状をソートする必要があります。幸運なことに、それだけでは通常O(n²)操作ですが、代わりにO(n²logn)に賭けています。
sam hocevar

@SamHocevarはい、私の回答で述べたように、深度によるオブジェクトの並べ替えは、すべてのケースを正しく処理するわけではありません。せいぜい概算です。ところで、私はトポロジー的にグラフをソートすることは常にO(V + E)で実行できると信じています(これは、ほとんどDFSです)。エッジカウントはO(V ^ 2)になる可能性がありますが、通常はそれほど悪くはないと思います。
ネイサンリード、

@SamHocevar等角投影ビューでは、すべてのオブジェクトが交差しない軸に整列された四角形ですが、これは例で示されているように、おそらく形状ソートできるようです。これらの制約の下でソートできない図の構造(たとえば、循環的なオーバーラップがあるもの)を知っていますか?
Steven Stadnicki

2
@StevenStadnickiこれは、深さによる単純なソートが機能しないケースです。この図の正しい描画順序は赤、緑、青ですが、各長方形の中心(黒のドット)に基づいて深さを並べ替えると、青、緑、赤になります。(点線はビューに垂直に走るので、中心の深さの間の関係を明確に見ることができます。)サム間のトポロジーソートは、長方形間の「背後」関係を決定する方法が与えられれば、ここで機能します。
ネイサンリード

2
以下は、並べ替えできない軸に揃えられたオブジェクトの例です。i.stack.imgur.com
sam hocevar


0

一般に、任意の3D設定で質問(「オブジェクトを正しい順序で並べ替えるアルゴリズムはありますか?」)に対する答えは「いいえ」です。オブジェクトが三角形のように単純な場合でも、そのようなアルゴリズムは存在できません。周期的に重なり合う3つの三角形を作成するのは簡単です。たとえば、3つの細長い三角形でZ軸を見下ろすことを想像してください。

  • A:(2.1、1.9、1)、(1.9、2.1、1)、(-1、-1、0)
  • B:(-2.1、1.9、0)、(-1.9、2.1、0)、(1、-1、1)
  • C:(2.1、1、0)、(1.9、1、0)、(-2、1、1)

次に、画面上でAとBが重なり合う場所(XYポイント(0,0)の近く)で、Bが一番上になります(Z値が高くなります)。そのZ値は約0.66ですが、Aは約0.33です。同様に、AとCが重なっている場合(XYポイント(1、1)の近く)、Aが上になります。また、BとCが重なっている場合(XYポイント(1、-1)の近く)、Cが上になります。これらの3つの三角形を指定した順序で画面に描画すると正しい結果が得られるように順序を付ける方法はありません。

Nathan Reedが示唆しているように、アイソメトリックビューを使用しているという事実は、おそらくこの特定の問題を回避できることを意味します。問題は、それを回避する価値があるかどうかであり、それは環境と利用可能な特定の機能により依存します。あなたが開発しているほとんどのプラットフォームは、少なくとも何らかの形の3Dレンダリングをすぐに利用できますが、私の最初の傾向は、目的のためにその上に便乗することです。

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