ボクセル地形エンジンはどのように作られていますか?


53

数日前、ボクセル地形と呼ばれるものを見つけましたが、それらはかなりクールだと思います。しかし、それらを生成するものは知りません。モデリングソフトウェアでモデリングしますか、それともハイトマップのようなものを使用しますか?私はウィキペディアで、ボクセルは3Dピクセルまたは体積ピクセルのようなものだと読みました。

ボクセルテレインを作成した後、これらのボクセルを取得して破壊可能/掘削可能にするにはどうすれば よいですか?


以下に基づいてベストアンサーを選択します。

  1. コードとアルゴリズム。できればC#に基づく
  2. 説明。私はアルゴリズムの初心者ですが、オブジェクト指向プログラミングには非常に精通しています
  3. 段階的なデモ。コンセプトだけでなく、方向性。
  4. ダイアグラム/イラスト。いいえ、他のエンジンのスクリーンショットではありません。


これは複雑な問題であることを知っています。しかし、助けてくれてありがとう!

いいえ、Minecraftのクローンを作成しようとはしていません。


編集

あなたの多大な助け(特にニック・ウィギル)に感謝します!これが私がなんとかしてやったことです(進行中の作業)。


[統一]とC?それは...ほとんど意味がありません。
マーティンソイカ

私はC.理解
ダニエルPendergast

8
このような大胆なリクエストで、コミュニティに多くの信頼を寄せています。つまり、優れたFPSを備えた今日のハードウェア向けの完全に動的なボクセルテレインに関する完全な論文です。簡単なはずです。さて、このトピックは非常に広範で難しいので、一般的なソリューションが表示されるとは思わないでしょう。しかし、誰が知っているか、それはあなたのロールモデルに応じて実行可能かもしれません。あなたがしたいですかCrysisの2ボクセル地形やデルタフォースの一つ?たぶん、Minecraftのクローンを作成しているのでしょうか、それとも掘削ゲームの砂シミュレーションが必要なのでしょうか?スコープを定義してください。
EnoughTea

2
このミドルウェアを確認してください:forum.unity3d.com/threads/…。特にデモ
テトラッド

1
GPU Gems 3には、ボクセル地形に関する章があります:http.developer.nvidia.com/GPUGems3/gpugems3_ch01.html
Tamschi

回答:


58

ボクセルテレインを生成するには

(a)一般的な方法は、Perlinノイズを使用してハイトマップを生成することです。ハイトマップは基本的に、ピクセルの暗さまたは明るさによって異なる高さを表すモノクロ画像です。

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

このハイトマップの個々のピクセルを見て、ハイトマップ画像のそのピクセルの明るさに応じて、異なる(x、y)位置で異なる高さ(z軸)までのボクセルの「スタック」を作成します。パーリンノイズイメージは滑らかであるため(暗闇に対して鋭い光のエッジがない)、結果として滑らかにローリングする地形になります。

(b)異なる多面体からランドスケープを作成することにより、インクリメンタルに構築できます。必要なボクセル形状に近似する多面体ベクトル形状を作成します。多面体の3D点法(ほとんどの場合、凸包の点)を使用して、ワールドグリッドのどの点が多面体ボリューム内にあるかを確認します。たとえば、空間にピラミッドを定義します。ワールド空間のローカル領域のすべてのポイントをそのピラミッドボリュームに対してチェックした後、どのポイントがそのピラミッドボリュームに該当するかがわかり、それらのセルを「存在」として設定できます。これで、空間にボクセルピラミッドができました。このようにして、地形を形成するまで、あらゆる種類の形状を一緒に追加し続けることができます。

(c)(実際にはbと同じ)モデリングツールを記述します。Voxatronは、これがどのように見えるかを示します。これは、代替世界(エディター)でボクセルフォームを作成し、それを実際のランタイムゲームワールドにインポートするだけです。Voxlapにはボクセル用の最初のオープンソースエディターがあったと思います。個々のボクセルを配置することも、ボクセルをさまざまな形/ボリュームで使用してボクセルをワールドに描画することもできます。


独自のボクセルベースのゲームを構築するために必要なもの

ボクセル道路は、少なくとも現時点では簡単ではないため、このセクションを含めます。最近、レンダリングと物理学のアプリケーションに向けて、多くの研究が大企業によってボクセルエンジンに再び投入されています。

生のボクセルから世界を動的に構築することは、世界構築への手続き型アプローチであり、これは本質的に単純ではないため、単純さが問題になる場合があります。申し訳ありませんが、ここにはいくつかの専門用語があります。ボクセルエンジンの作成は非常に深刻な作業であり、ゲームエンジン開発の複数の領域、特に空間の概念に関する知識が必要です。これは、3Dベクトル計算、行列、および基本的な計算をある程度合理的に理解することを意味します。

そうは言っても、ボクセルエンジンは正確には普及していないため、「ボクセルテレインの生成」には動作するコンテキストが必要です。ボクセルエンジンの動作方法の基本的な説明に進みましょう。

ボクセルは、世界の基本的な構成要素です。それらの位置は、(ベクトルベースの3Dゲームで使用されるような)連続的な浮動小数点スペースではなく、整数インデックス付きの3Dグリッド(配列)によって定義されます。これらはあなたの世界の「原子」になります。Minecraftのようなゲームのように高さが3フィートになることもありますが、大量にクラスター化されない限り、仮想キャラクターの目が実際に見るよりも小さいこともあります-分子のようです。次の2種類があります。

  • キュービックメッシュベースのボクセル()-これらは新しい種類であり、簡単にするために使用され、最新のグラフィックス技術と組み合わせて簡単に使用できます。MineCratやDungeon Keeperなどのゲームで使用されます。
  • ポイントボクセル()-元のボクセル。それぞれが空間内の個々の衝突可能な点ですが、球形の境界ボリュームに囲まれている場合があります。それらはよりシンプルなので、あなたの世界にもっとたくさん置くことができます。したがって、一般的にはより小さくすることができます。これらを使用した2つのゲームは、Comancheと1990年代のLords of Midnightのリメイクです。

いずれにしても、あなたの世界でボクセルを操作するアプローチは、次のようにほとんど同じです。

ワールド内でオブジェクトを構築および移動するには、上記の数学ツールが必要です。たとえば、壁を作成するには:ベクトルを使用して、3D空間に適切な寸法のボックスを作成します。行列演算を使用して、ボックスを3Dワールド(連続ベクトル空間)で希望する回転と位置に変換します。ボクセルエンジンの場合、追加のステップは、3D多面体ポイントアルゴリズムを使用して、どのボクセルがその回転スペース内にあるかを判断することです。

本質的に、これは世界のほとんどのオブジェクトを構築する方法です。さらに、Mayaや3DS Maxなどの方法でキャラクターを「モデリング」するための独自のツールを作成することもできます。ただし、ポイント、エッジ、面ではなくボクセルからキャラクターをモデリングしているため、方法は大幅に異なります。その後、ワールド内でこれらのオブジェクトを回転させることにした場合、同様にマトリックス変換を使用する必要があります。

破壊可能な地形は、選択した何らかの方法に従って一度に1つのボクセルを削除するか、事前定義されたボリュームに従って大量のボクセルに対してCSG(Constructive Solid Geometry)操作を使用して削除するのと同じくらい簡単です。たとえば、岩にレーザービームを照射する場合、円筒形のボリュームを使用して、ビームが岩を透過しているボクセルを差し引くことができます。CSGは、ボクセルの世界を形成する3D空間グリッドを使用する比較的単純なプロセスであり、ベースグリッド(この場合は岩)のセクション内のすべてのセルを別のグリッド(この場合はレーザービーム)と照合します

物質の「流れ」を得るために(Vigilが砂に関するコメントで示唆したように)、流体力学とセルオートマトンを調べる必要があります。これらは、本質的にボクセル世界でもあるドワーフ要塞の作者、タルンアダムスによって使用されました(この場合、ボクセルはダンジョンキーパーに匹敵するほど大きくなりますが、原理は同じです)。これらは最先端のトピックであり、定義されたボクセルエンジンの必要性ではないため、これをあなた自身の研究の「スタブ」として残しておきます。

最後に、CSGと流体力学は最適化をもたらします。現在開発中のボクセルエンジンは、ほぼ独占的に証明されたように、さまざまな解像度にボクセル空間を分割する方法であるスパースボクセルオクトリ(SVOs)を利用して、このビデオでは、今後のAtomontageエンジンを披露します。octree / SVOを使用することは、1つの大規模で均一なグリッドの処理に伴う処理オーバーヘッドのため、最適化の選択よりも必要です。octreeは、本質的には、ツリー(有向非循環グラフ)であり、それが表すスペースに物理ボリュームが含まれているかどうかに応じて、すべてのノードに8個またはゼロ個の子ノードがあります。octreeが空間を細分してボクセルを形成する方法を示す図はこちらです。

私が知っている最高のオープンソースボクセル実装は、Kox SilvermanのVoxlap Engineで、これはVoxelstein3Dに使用されました。C ++で記述されており、地形変形のためのCSG操作を実装しています。


コミュニティWikiの変更は永続的であり、元に戻す方法はありません。答えを削除して再作成する必要があります(もちろん、既存の票を犠牲にします)
ジェシードーシー

meta.stackexchange.com/questions/2974/…モデレーターが削除できると主張しています。ただし、状況が変わったかどうかはわかりません。どちらにせよ調べてくれてありがとう。
エンジニア

1
図を見て、次回は注意してください。
ジェシードーシー

2
前者は、エンティティがセル上に直接横たわることができる離散空間です。チェス盤に完全に配置されたピースのように、セル間や境界線の重なりはありません。一方、連続空間はほとんどの物理エンジンで見られるものです。つまり、浮動小数点数に基づいているため、量子化ではなく連続です。エンティティは、実際の生活と同じように、選択した空間内の任意の位置に配置できます。
エンジニア

1
テクスチャリングは暗黙的です。実際のボクセルは、メッシュベースかどうかに関係なく、それぞれ純粋な色を持っています。前述のアプローチは、より現実的な詳細を作成し、複合メッシュアプ​​ローチ(google Unity VoxelForm)を有効にします。ボクセルが細かいほど、テクスチャのディテールが細かくなります。例:河床を岩(灰色)としてモデル化します。これらのボクセルをmaterial = "sand"に設定することにより、表面のx距離内のすべてのピクセルを砂に変換します。その後、砂色でレンダリングできます。さらに、これは物理的な相互作用にも影響を与える可能性があるため、砂が水によって移動したり、掘り出されたりする可能性があります。
エンジニア

33

興味深いボクセルテレインを生成する最良の方法は、Perlinノイズ密度マップを使用することです。3Dワールドの高さを定義する2D Perlinノイズマップを使用するのではなく、3D Perlinノイズマップを使用します。一番下に近い値がより確実になり、一番上に近い値が確実に空気になるように、マップに重みを付けます。これにより、ワールドの高さが得られますが、Minecraftの地形と同様に、地形のスライスの側面図が示すように、オーバーハングと洞窟も可能になります。

張り出しのある世界

ここから、浮島をテストしたり、フラクタルノイズを使用して洞窟システムを追加したりできます。

洞窟システムのある世界

上記の写真と洞窟システムのアイデアは、この素晴らしいブログ投稿からのものです。ここでPerlinノイズのすべてを学ぶことができます、そして、ここであなたを始めさせるいくつかのサンプルコードがあります


4

ここでの他の答えは素晴らしいですが、私は少し異なるアプローチを取りました。

モデリングツール(3DSMAX)で環境を生成し、そこからスパースoctreeを構築します。立方体の空でない各リーフノードはボクセルです。レンダー時に、レイキャスティング(HLSLで実装)を使用して、どのボクセルがどのピクセルを占有しているかを見つけ、ピクセルをソースモデルのテクスチャ値を平均してツリーを生成するときに計算したノードに格納された色に設定します。

これにより、多くの素晴らしい利点が得られます-無料の衝突検出、可変LOD、ビュースペースカリングなど-そして、レイキャスター以外に-実装が簡単です。

残念ながら、電話からサンプルコードを投稿することはほぼ不可能です。


代替手段として+1。合理的なパフォーマンスで実装することは不可能ではありませんが、長所は短所をはるかに上回っています。ボクセルレイトレーシングは、GPUに大きな負荷をかけます。これに必要な算術と条件は、同じGPUサイクルが多くの印象的な画面スペース効果を適用できる場合、非常にコストがかかります。SSAO。最大の問題は、ラジオシティで見られる複数のバウンスでレイキャスティングが最適に見えることです。数百万または数十億のボクセルで構成されるシーンや、各レイセグメントがバウンスと合成にかなりの労力を要するシーンでは実行できません。
エンジニア14年

...これが、私が答え(VoxLap)で脇役としてスカリーレイキャスティングに言及した理由です-うまく実装することさえ困難です。垂直スキャンラインアプローチが機能する場合、レンダリングプロセスの次元を3Dから2Dに削減したため、コストはピクセル単位のレイトレーシングよりも桁違いに低くなります。このアプローチは今でも私が待ち受けていますが、従来のRTRTでは可能な複雑な照明ソリューションを排除します。
エンジニア14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.