球状の惑星とその領域を読み込む方法は?


14

私は、部分的に惑星探査で構成されるゲームを設計しています。疑似ランダム生成を使用して、すべての詳細を保存するのではなく、ロードする必要があるときに定義済みのシードから再生成します。これは重すぎます。そのため、プレイヤーが行ったランダムシードと変更をファイルに保存します。

プレイヤーは、軌道から惑星を見ることができる必要があります(非常に低いレベルの詳細で、その後地面に降り、着陸している地域の詳細レベルをゆっくりと上げ、反対側にあるものを降ろします)プレイヤーの視界の外に出る惑星の

平面の地面でそれをしなければならなかった場合、正方形のチャンクシステムで簡単にできます。しかし、ここでの問題は、惑星が-ほとんど-球体であるということです。

それでは、正確なポイントの周りに地面の詳細(レリーフおよび接地されたオブジェクト)をロードする最良の方法は何でしょうか?
私はすでに2つの解決策に取り組んでいますが、どちらにも弱点があります:

1.球体を正方形の塊に切断します。

正方形チャンク法

プレーヤーが地面に十分に近づいたら、彼/彼女の位置から最も近い正方形の詳細を改善する必要があります。
十分でない場合でも、プレイヤーが地面にいるときや地面に本当に近づいているときに読み込むために、各正方形をサブ正方形にカットできます。

しかし、写真でわかるように、プレイヤーがポールに着地しようとすると問題があります:正方形は非常に細い長方形になり、最後の行では三角形になり、さらに多くの読み込みが必要になるという事実に加えて、世代が歪んで表示されます。

2.二十面体から始めます。

二十面体法

ここでは、プレイヤーが近づいているときに、プレイヤーの位置の周りの三角形のテッセレーションを増やすことができます。

しかし、私はプレイヤーの位置よりも近くに三角形を見つける方法を知りません。その場合、デカルト座標が役立つ可能性があると聞きましたが、使用方法はわかりません。


私はそのためにC ++ / OpenGLを使用しているので、ここで生成およびロードする主なものは、表面のレリーフと色/テクスチャを表す頂点です。


執筆を始める前に、あなたの世界は球体ですか?各グリッドにファイルに保存されたプロパティがある球体にグリッドを課そうとしていますか?
アレックティール

@AlecTeal私は惑星をシミュレートしようとしています。だから、それは世界的に球体です。そして主な問題は、プレーヤーが任意のポイント、ポールまたは赤道沿いに着地できることです。
アラクトホル

2
だから....そこに実装の負荷があるので、「球体の世界のゲームエンジン」を検索しましたか。なぜ機能しないのですか?さらに、これがキューブマップを持っている理由です。これらは、この理由で球体に同相の位相多様体上の標準チャートです!
アレックティール

1
また、クワッド球オプションを評価することをお勧め
DNKがdrone.vs.drones

回答:


5

さて、ここに書きました:

http://www.maths.kisogo.com/index.php?title=Notes:Spherical_coordinates

(私は数学のマークアップが必要でした、そしてそれは本当にかなり長いです)


ドキュメントを適用する

文書は、多様体の概念を導入することから始まります。多様体とは、そのチャンクが「同相」(基本的には同じ)R ^ nのチャンクであるものです(R ^ 2は、x / y平面です。知っている)

チャートは、マニホールドの一部(おそらくはすべてですが、球体の場合はすべてをカバーすることはできません)をカバーします。

この記事では、角度を保持する、つまり一定の距離を保つ球体の4つのチャートを作成します。

球体上のポイントに座標を与えることは実際には非常に難しいことがわかりました!代わりに行うことは(例では円上ですが)、各ポイントに(i、x、y)の形式の座標を与えます。ここで、iは球の場合は1〜6、円の場合は1〜4です。これはチャート番号です。

xとyは、そのチャートの角度(または、円の場合は単にx)を指します。

球体の6つのチャートは、上/下半球、左/右半球、前/後半球です。


座標

これで、各ポイントに適切に動作する「素敵な」座標を与えることができます。数学的には、チャートのドメインは「オープン」マップです。これは、各ポイントの周りのボールもセットに含まれるような正の数が存在することを意味します。たとえば、範囲(0,1)(0 <x <1の場合はxを含むセット)が開いており、(0,1)(たとえば0.001)の任意のpを取得し、次のような数(たとえば0.0005)があります0.001の0.0005内の任意のポイントも(0,1)にあります。

これが意味することは、チャートを介して方向を渡すことができるということです。

現在、開発中のチャートには45度のオーバーラップがあります。この手段はあなたは、座標(i、x、y)は、安全にフォームの点を指定することができるで機能を持っている場合(I、X +、Y + b)が長いほどa、およびb(度)-45と+45の間であります

フォーム(i、x + a、y + b)の任意の点は、問題なく「通常の」3次元空間の点に簡単に変換できます。


実装

球上の何かの座標を保存する方法があり、これらの座標で大きな空間の領域を示し、座標のように動作し、たとえば開いています(代わりに2つの角度を使用すると問題になります)

また、「通常の球体を作成する方法」の答えを完全に破棄することもできます。これは、6つのプレーンを実行するだけで、それらのエッジを揃えること(簡単なこと)を確認できるためです。

使いやすい座標を持つ素敵な球体ができます

ご質問はコメントしてください、私はほとんど事前知識を仮定しようとしました。私は人々に教えることも初めてです


@Alec_Tealあなたがそれを投稿したのであなたの答えにあります、複雑で理解するのは難しいです(私はあまり数学の式に慣れていません)上記のような球体?あなたの「チャート」が正方形の投影なのか、それともそれ以上のものなのか理解できませんでした
...-Aracthor

@Aracthorそれはより一般的です。チャートは文字通り(マップの)本のチャートのようなもので、ある領域にグリッドを設定するだけです。たとえば、トーラスまたは2穴のトーラスがある場合、これらの方法が必要になります。ここでの答えはいずれも、異なるタスクであるジオメトリを作成するための通常の方法ほどには球上の座標を扱いません。私は数式を手伝うことができます、できるだけアクセスしやすいように書きましたが、これは私のパンとバターなので、複雑さはわかりません。
アレックティール

@Alec_Teal私はそれを検証しましたが、私はまだすべてを手に入れたとは思いません。しかし、チャットルームでこの議論を続けましょう。
アラクトホル

12

すでに示したように、この問題には多くの解決策がありますが、100%理想的なものはありません。球はトリッキーです。

キューブベース

Sporeなどのゲームでよく使用される一般的なルートの1つは(フードの下を覗かずに特定するのは難しいですが)、球体を立方体に投影し、各立方体の面に正方形のグリッドを使用することです。

(これは、アレックティールとdnk drone.vs.dronesが上記のコメントで説明していることです)

立方体に基づいて細分化された球

LoDに立方体表現を使用することを説明するこの投稿の画像

これには、緯度-経度法の多くの利点があり、ピーク歪みははるかに少ないです。ベクトルを正規化するか、絶対値の最大成分で除算することにより、顔グリッド上の位置と球上の位置の間を簡単に変換できます。また、キューブマッピングのテクスチャテクニックともうまく調和します。これは、惑星全体を遠くから見るときに便利です。

典型的なマッピング手法はgnomonic Projectionと呼ばれ、上記の画像でわかるように、まだ密度の不一致の問題があります。グリッドは、面の中心よりもキューブコーナーの近くではるかに密です。均一性が重要な場合は、適切なマッピング式を使用してこれを減らすことができますが、通常はマッピングを元に戻すのが難しくなります。

マッピング機能を変更して均一性を改善する

いずれの場合でも、角に90度の角を持つ4つの正方形の通常のグリッド交点が120度の角を持つ3つの菱形の集まりになる角にまだ角度の歪みがあります。

二十面体ベース

私の個人的なお気に入りのアプローチは、あなたが説明した正二十面体バージョンでしょう。なぜなら、それはピーク角度歪みを可能な限り小さくするからです。通常、三角形のグリッドには60度の角度で交わる6つの三角形がありますが、20面体の頂点には72度の角度で交わる5つの三角形があります。そのため、立方体の例の正方形よりもそれぞれの歪みが少なくなります。

キューブ版の正方形ほど馴染みのない領域であるため、おそらく人気がないのです。作業するにはもう少し数学が必要です。

近くのポイントを特定することは、見かけほど難しいことではありません。正二十面体ベースの測地球は、通常の三角形グリッド上に平坦化できます。

測地線テッセレーションを正三角形グリッドに平坦化する 三角形のグリッド上の二十面体のネット

そして、ここで説明したように正三角形の格子は、正方格子状に処理することができます

三角正方形グリッド同型

だから、正二十面体のどの面(正二十面体メッシュに対するレイキャストで行うことができます-その部分を単純化する賢い数学的な方法は知りません)を決定したら、使い慣れたものを使用して周囲を埋めることができますグリッドトラバーサル。:)

編集:

Class-I測地線を使用する場合、レベルベースのチャンク/テクスチャ/高さマップを効率的に格納するために、キューブベースのバージョンを格納するために使用する6つの正方形チャートと同様に、惑星を5つの長方形チャートに展開できます:

ジオスフィアの長方形チャートへの展開

(これは、別の回答でファジーロジックによって提起された懸念に対処するのに役立つ可能性があります。これも可能ですが、クラスII測地線では少し複雑です。クラスIIIは調査していません)

秘trickは、これらのチャートの軸が実際に垂直に使用されていないため、既存のオーサリングおよびストリーミングツール/技術がすぐにそれをサポートしないことです。とにかく独自のチャンクストリーミングを作成するか、オンザフライのプロシージャ生成を使用することを計画している場合、それは問題ではないかもしれません。また、オーサリングの問題を回避するには、より一般的なツールを使用して必要な解像度よりも高い解像度でソースマップを生成し、グラフグリッドに沿ってサンプリングするベーキングプロセスを実行して、直接プラグインする高密度で効率的な表現を構築します二十面体構造に。


1
ここには良いものがいくつかあります。+1しますが、後で答えを書く予定です(私も答えるときは、投票の初期段階を避けようとします)。私の唯一のコメントは、このアプローチは、より良い球をレンダリングするための表面をモデル化よりもあることだろう
アレック・ティール

あなたが好奇心in盛である場合に備えて、私は今私の答えを終えました。
アレックティール

4

手続き型または定義済みの高さマッピングおよびテクスチャのいずれかのレベルの詳細な地形で宇宙から地上に移動できるようにする場合は、チャンクLODを備えたクアッド球が推奨される方法です。

Icosasphereは、より均一なメッシュを提供し、テッセレーションが容易ですが、キャッシュする必要があるテクスチャとハイトマップをマップしようとすると問題が発生し、そのように非常にコンパクトまたはシンプルになりません。

クワッド球にはピンチポイントがありますが、テッセレーションが十分に行われていれば、それらは表示されません。次に、各領域(チャンク)がほとんど問題のない正方形グリッドであるかのように、テクスチャをマップし、DLODを効果的に実装できます。これは、二十球体に比べて実装が簡単で、計算とリソースの両方でより効率的です。

Gamasutraの手続き宇宙の生成についてを参照してくださいショーン・オニールの記事:
- パート1 ハイトとテクスチャのパーリンノイズとフラクタルブラウン運動。
- パート2 惑星生成のためのDLODを備えた手続き型メッシュのROAMアルゴリズム。パフォーマンスの問題に苦しんでいます。推奨されませんが、教育的価値には適しています。
- パート3 では、大規模なスケール、最適化、および浮動小数点の問題を扱います。主に宇宙のスケールに関連していますが、必要に応じて光年のスケールからセンチメートルに移行するときに惑星にも適用できます。
- パート4 惑星生成のためのチャンク(四分木)DLODによるクワッド球の実装について説明します <-特にこの記事を参照


0

私はプログラミングの専門家ではありませんが、何らかのチェックポイントを持つことができます。セキュリティチェックポイントを通過すると、もちろんアニメーションでクリアされますが、惑星の表面はロードでき、その逆も可能です。


これは、探査可能な惑星の表面を球体として設計しないオプションを開くことで問題を回避しますが、解決しません。
フィリップ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.