【Unity】PDSデータから月面を作る

PDS(Planetary Data System)とは

PDSはNASAの惑星探査ミッションによって得られたデータを長期間アーカイブするシステムとして始まりました。 PDSが使用するPDS標準は国際惑星データ連合(International Planetary Data Alliance; IPDA)によって惑星探査データの標準として推奨されており、多くの国の宇宙機関がデータアーカイブにこのPDS標準を利用しています。アーカイブされた製品はオンラインで入手できます。


「PDSデータから月面を作る」では、下記サイトを参考にさせていただきました。

また、Ken Watanabeさんの"MoonVRAsset"を使用させていただきました。


月のPDSデータを取得する


LUNAR ORBITAL DATA EXPLORER からJAXAの月周回衛星「かぐや(SELENE)」のデータを取得してみたいと思います。(JAXAの「かぐや(SELENE)データアーカイブ」からも同じデータがダウンロードできます)

取得するのはアポロ11号着陸地点: 北緯0.67416度 東経23.47314度 付近としたいと思います。


①データの検索

LUNAR ORBITAL DATA EXPLORER のData Product Search にアクセスします。


STEP 1. SELECT DATA SETS TO SEARCH

▽JAXA SELENE/KAGUYA Main Orbiter

  ▽TC - Terrain Camera

  ▽Derived Data

   ▽DTM Map Seamless V2.0 にチェック


STEP 2. SET ADDITIONAL FILTERING PARAMETERS

▽Find by Location or Feature

図のように緯度経度を入力します。(アポロ11号着陸地点

※月面マップ上で任意のエリアを指定することもできます。

STEP 3. PREVIEW SEARCH RESULTS SUMMARY

検索結果が表示されます。


STEP 4. SUBMIT QUERY

"View Results inTable"か"Select Results on Map Display"をクリックすると、検索結果がリスト(地図)で表示されます。"Add All Results to Cart"を選ぶか、個別に選択する場合は"In Cart"にチェックを入れます。


②データのダウンロード

Downloadタブに移動します。

下の方にある、"CONTINUE WITH CHECKOUT"の"Continue>"ボタンをクリック。

パッケージフォーマットやデータ構成を選択し、

"COMPLETE THE PROCESS"の"Your email:"にメールアドレスを入力して、"Submit Request"をクリック。

送信が成功すると、画面にメッセージが表示されます。しばらくするとメールが届きますので、メール内のリンクからダウンロードページにアクセスするとダウンロードができます。

データファイル(.img)とラベルファイル(.lbl)の2つが必要です。2つともダウンロードしておいてください。


▼今回取得したデータ画像(DTM_MAPS02_N03E021N00E024SC)

※右下付近がアポロ11号着陸地点。


Unity で月面データをインポートする


MoonVRAsset からプロジェクトデータをダウンロードします。

Unity でプロジェクトを開きましょう。

「MoonVR」フォルダの中にサンプルシーンやスクリプトが用意されています。今回は、地形を作るところまでやってみたいと思います。


③PDSデータのインポート

取得したデータファイル(.img)とラベルファイル(.lbl)を、Projectウィンドウの任意の場所に読み込みます。


④新規シーンの作成

新規シーンを作成し、Terrainを作成します。


⑤Moon Terrain Importer コンポーネントの追加

作成したTerrainに、"Add Component"から"Moon Terrain Importer"(スクリプト)を追加します。先ほど読み込んでおいたデータファイル(.img)とラベルファイル(.lbl)をそれぞれアサインします。


⑥Terrainの生成

"Make Terrain"ボタンをクリックすると地形が生成されるはず。

...が、何かエラーが出る;

どうやら読み込んだ元ファイルが大きすぎるようで(解像度:10800)、Unity で設定できる解像度を超えているようです(たぶん)。

Moon Terrain Importer では下記のように設定されるようなので、

(データの解像度①)÷(Sampling値②)=(UnityのHeightmap Resolution設定③)

10800 / 2 = 5400 →(UnityのHeightmap Resolution設定)...1025,2049,4097 までしか無いため4097に設定されますが、実際は足りてないということに...。

データ側の解像度(① ÷ ②)を下げるため(4097以下になるように)Sampling値を上げてみました。

Sampling:3 → 10800 / 3 = 3600

4097以下になり、無事Terrain生成できました!(上と左の地形が無い部分は、Unityでは4097に設定されているけれど、データは3600しかないので余分な部分が残ってしまうためだと思います)


▼生成された地形を真上から見た画像


【補足】

ちなみに、①データの検索で「DTM Map Seamless V2.0」にチェックしましたが、

STEP 1. SELECT DATA SETS TO SEARCH
▽JAXA SELENE/KAGUYA Main Orbiter
 ▽TC - Terrain Camera
  ▽Derived Data
   ▽DTM Map Seamless V2.0 にチェック

SLDEM2013 V1.0 のデータだと、1ファイルの範囲は小さくなりますが、解像度:4096 なので

Sampling:2(デフォルト値)→Heightmap Resolution:2049

Sampling:1          →Heightmap Resolution:4097

となり、Unity の設定できる範囲内なので(さらに解像度設定値とピッタリなので)、余分なベース部分が残らず地形が生成できました。


▼9個のデータを取得してUnity上で位置調整して繋げたもの


とりあえず今回は地形を生成するところまで。

これを使えば、実際の月面を散歩することもできそうですね!


▼人間の身長から見た月面上の景色


【追記】(2023/4/8)

MoonVRAsset ですが、自動生成されたデータの高さ方向は正確ではないということが分かりました。検証した結果、Width / Length を6000にしたとき、Height 400でおおよそ正確な地形になりそうです。("Make Terrain"後は、Height値はデータによりマチマチでしたが、かなり起伏が激しい形状になっていたようです。)

  • Terrain Width:6000(m)
  • Terrain Length:6000(m)
  • Terrain Height:400(m)

※Width / Length がそれぞれ 6000(m)にしているので、ここでは1/5スケールになります。(KAGUYAのデータは、1ユニット30km四方と思われるため)

KUMA Lab

「宇宙×VR」「サイエンス×アート」を目指して ノンゲームVR開発・CGデザインを主にやっているフリーランスです。 バーチャル世界に無限の可能性を感じています。 カバー写真:Voyager 1's Pale Blue Dot (NASA/JPL-Caltech)

0コメント

  • 1000 / 1000