あなたは木について学びたいと思っているようですね!
そして、私が真剣に取り組んでいるのは、現在すべてのキューブの配列をループしている場合、さまざまな空間データ構造を実際に調べる必要があるからです。この場合、キューブの世界を再想像する最良の方法はツリーとしてです。
理由を説明する前に、問題について考えてみましょう。できるだけ少ないコストで、プレーヤーが衝突する可能性のある近くのキューブのリストを取得できるソリューションを探しています。このリストはできるだけ小さく、できるだけ正確にすべきです。
このゾーンを決定するには、プレイヤーの座標空間をキューブマップの座標空間にマッピングする必要があります。つまり、プレーヤーの浮動小数点位置をキューブの多次元配列の個別のインデックスにマッピングする必要があります(表記例は、たとえばworld[31][31][31]
64 * 64 * 64多次元配列の正確な中央)。
この同じ離散インデックスを使用して周囲のブロックを単純に計算できます。おそらく、近くのキューブのみをサンプリングしますが、これは常に再計算を必要とし、配置が離散していないオブジェクトを許可しません地図)。
理想的な状況は、キューブマップの特定のセクションのキューブのセットを含むバケットのセットを均等に分割し、周囲の領域を再計算する代わりに、これらのゾーンに出入りするだけです。自明ではない計算の場合、このようなデータを保持することで、すべてのキューブの反復と、近くにあるこれらの個々のセットの反復を排除できます。
問題は、これをどのように実装するかです。
64 * 64 * 64の世界では、8 * 8 * 8 ゾーンに分割されると想像してください。つまり、あなたの世界では、軸ごとに8つのゾーン(X、Y、Z)があります。これらの各ゾーンには8つのキューブが含まれ、この新しい単純化されたインデックスによって簡単に取得できます。
ワールド内のすべてのキューブを反復するのではなく、近くのキューブのセットで操作を実行する必要がある場合は、これらのゾーンを単純に反復して、元の64 * 64 * 64(262144)からわずか520(8 * 8 * 8 + 8)。
このゾーンの世界からズームアウトし、ゾーンをより大きなスーパーゾーンに配置します。各スーパーゾーンには2 * 2 * 2のレギュラーゾーンが含まれます。あなたの世界は現在、512(8 * 8 * 8)が含まれていたようゾーンを、私たちは、8×8×8つの破ることができるゾーンを 64(4 * 4 * 4)にスーパーゾーン 8つの分割することによってゾーンを 2つのでゾーンごとのスーパーゾーン。上記と同じロジックを適用すると、最大反復を512から8に分割してスーパーゾーンを見つけます。次に、最大64で進行中のゾーンを見つけます(合計最大72)!これにより、すでに多くの反復を節約できていることがわかります(262144:72)。
これで、ツリーの有用性がおわかりいただけると思います。各ゾーンはツリー上のブランチであり、各スーパーゾーンは先行するブランチです。あなたは単にあなたが必要なものを見つけるためにツリーを横断しています。より小さなデータセットを使用して、全体的なコストを最小限に抑えます。
次の図は、概念を視覚化するのに役立ちます。(Wikipedia:Octreesからの画像):
免責事項:
ボクセル世界が既に固定サイズの多次元配列でレイアウトされている上記の理想的な設定では、プレーヤーの位置を照会し、O(1)コストで周囲のブロックにインデックスを付けることができます!(Olhovskysの説明を参照)しかし、ボクセルゲームでは世界のサイズがめったに固定されないことを考えると、これはより難しくなります。また、HDDからメモリにスーパーゾーン全体をロードできるようにするために、データ構造が必要になる場合があります。固定サイズの多次元配列とは異なり、ツリーは組み合わせアルゴリズムにあまり時間を費やすことなく、これを容易に許可します。