【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四方と思われるため)