4

レイ トレースされた Minecraft スタイルのボクセル エンジンを作成しています。現時点では、各値がボクセルのタイプ (0 = 空気、1 = 石など) を表す単一の 3D 配列にレベルを格納しています。後で、ボクセルに特定のプロパティが必要になります。また、配置時に特定のアクションを実行する必要がある場合があります。

私が考えた最初の最も明白な解決策は、他のタイプから派生する OnPlace などのメソッドを持つベース ボクセル クラスを持つことでした。しかし、これをマップにリンクする方法がわかりません。非常に高速 (レイ トレーシングは非常に遅い) で柔軟な方法が必要ですが、わかりません。何かアドバイス?

4

5 に答える 5

3

明白なアプローチは、オブジェクト (の) の 3 次元配列をclass Voxel持ち、 を参照することlocation = {int x, int y, int z};です。

セルごとに一意のオブジェクトを使用する必要がないように、参照を「ボクセル」から場所に完全に戻すことをお勧めします。マップへの逆参照を維持する必要がある場合でも、フライウェイト パターンを使用して、類似の「ボクセル」オブジェクトのほとんどの日付を共有することを検討できます。

于 2013-05-29T18:56:14.950 に答える
3

Dictionaryを使用する必要があると思います。各クラスに ID を付与しても問題ありません。この ID は、パブリックの読み取り専用プロパティに簡単に入れることができます。次に、キーが ID で値がクラス タイプであるディクショナリを作成します。こうすることで、レベルを効率的に保存し、ディクショナリを使用して (高速ですが、メモリがやや高価になります)、各ブロックのレンダリング方法を調べることができます。

プログラムがディクショナリを作成するために起動するときに、リフレクションを使用して、ボクセル基本クラスのすべてのサブクラスを反復処理する必要があります。

mods/plugins をサポートする予定がある場合は、独自のアセンブリ以外にも検索できるようにする必要があります (最も難しい部分は、アセンブリへの参照を取得することです。その後は、コードを再利用するだけです)。

于 2013-05-29T18:53:31.917 に答える
0

わかりました、パフォーマンスのボトルネックは「ボクセル タイプの選択」ではありません。これは、60fps でトレースする必要がある、文字通り何百万もの光線 (ピクセルあたり少なくとも1 つですが、ピクセルあたり 1 つの光線だけでは適切なレンダリングが得られない) の交差と衝突の検出です。

最近、そのような狂気を実現する唯一の方法は、GPU レイ トレーシングを使用することです

したがって、主な関心事は、ボクセル タイプを決定するために「どのデータ構造を使用するか」ではありません。これは、GPU での効率的な光線交差コードです。

NVIDIA には、現時点でOptixと呼ばれるレイ トレーシング エンジンがあります。

于 2013-05-29T18:59:56.023 に答える
0

「クラスを列挙する」と言うと、リフレクションを使用してオブジェクトのプロパティを反復処理することを考えさせられるため、私はあなたが求めているものとは完全には異なります。明らかにそれはあなたがしたいことではありません。

私には、3D 配列が整数ではなくオブジェクトを保持する必要があるように思えます。すべてのボクセルが継承する基本クラスがある場合Voxelは、型指定子が不要になります。代わりに、基本クラスに抽象メソッドを配置し、派生クラスでそれらをオーバーライドします。すべての設定が完了すると、配列を扱うコードは、派生クラスの型を知らなくても操作できるようになります。

アプリケーション コードは、それを type の配列として表示する必要がありますVoxel。任意のメソッドを呼び出すVoxelと、そのタイプのボクセルに固有の動作が実行されます。それが継承とポリモーフィズムの基本的な考え方です。

于 2013-05-29T18:57:27.290 に答える