Unity上でNays2DHの計算結果を3D表示する【開発記録 vol.1】

# はじめに
表題の通り、iRIC Nays2DHの計算結果をUnity上で3D表示できるようにしよう！
という個人的なプロジェクトの開発記録です。
（進捗報告的な記事なので詳細な手順までは説明しない旨、ご了承ください）

まずは3か月で、iRICのように時間毎の計算結果を切り替えられるようにすることが目標です。

なお、開発記録自体は開発の習慣化&自身へのプレッシャーとして
毎週アップロードする予定です。

# 現状の報告
Nays2DHの水位と地形をOBJ形式に変換し、Unity上で可視化するところまでは
できています。以下のような感じです。
![Animation2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1147458/e2c2d7cd-ce13-3bc9-37f6-749a5561d693.gif)


# 開発内容
## iRIC上でNays2DHの計算実行
まず、計算結果が無いと何も始まらないので作ります。
今回は北海道 豊平川（kp16.0～17.0）を対象に一定流量を流した計算を実行しました。
（ここは3D関係なく、ただのiRICの操作なので割愛します）

なお、計算に用いる河床のデータはほとんど公開されていないのですが
2023年3月末に北海道開発局が保持するデータが公開されました。
（お陰で色々と開発がしやすくなりました。開発局の方々には感謝です。）

https://www.hkd.mlit.go.jp/ky/kn/kawa_kan/slo5pa000000zpx4.html?fbclid=IwAR3uqR1ZMABSF7iIazuQVYvQ2cdlNyYbvU8ExAv9oa0htxmbn7vCHkjX9OE

ただし、用途は**研究開発を目的とした使用**に限られており、
結果を公開する場合は**北海道開発局河川管理課への確認が必要**である点は注意してください。

ちなみに、今回の開発記録の公開に上記のデータを利用すると
確認が必要になって大変なので、ここでは自前のダミーデータを使用しています。

## Nays2DHの計算結果を3Dモデルに変換
計算結果の値は以下のどちらかの方法で取得することができます。
（一般的にとっつき易いのはcsvのエクスポートかと）
- iRIC上でcsvファイルとしてエクスポートする

https://iric-gui-user-manual-jp.readthedocs.io/ja/latest/03/03_10_05_calc_result.html

- HDFファイルとしてpythonで読み込む

https://bi.biopapyrus.jp/python/module/h5py.html

上記いずれかの方法で、計算格子の座標値、水位、地形（標高）を取得し
Pythonを使ってOBJ形式に変換しています。

OBJ形式を作るモジュールみたいな都合のよいものは無いので
以下のサイトを参考にしながら変換するプログラムを作りました。

https://www.hiramine.com/programming/3dmodelfileformat/objfileformat.html

以上の流れで作成したプログラムがあるのですが、
ここで解説するとそれだけで2～3記事のボリュームになって（僕が）辛いので
ここではexe化したものを置いておくことにします。

[cgns2obj_nays2dh.zip](https://drive.google.com/file/d/1uF8rgyvfj-F7FWuJgFt4HQZ1XFuxhUYk/view?usp=share_link)　※Windows11での使用を想定

解凍したフォルダ内のcgns2obj_nays2dh.exeを起動すると、
以下の画面が表示されるので何も考えずに地形と水深の両方で
同じCase1.cgn（iproを解凍すると入っています）を選択して、変換を押してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1147458/d6077434-66d8-3a0d-d8cc-c07ac64b4156.png)

cgns2obj_nays2dh.exeと同じ階層にoutputフォルダが作成され、
中に地形（初期）のOBJファイルと水位のOBJファイルが格納されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1147458/f1688f64-f03f-cfce-0f0c-0096c0d6864e.png)

## 地形用画像の取得
上述の地形ファイルに貼り付けるテクスチャ画像として
国土地理院の航空写真を用意します。

ここはスマートなやり方が分かっていないが故に忘れやすいので
備忘録としてやや詳細に書きます。

手順の流れとしては
1. iRIC上で計算格子範囲をshpで出力
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1147458/d3df6756-fc28-cc10-f9c4-895c5e0f4ae5.png)
　

2. QGISで読み込み、緯度経度の範囲を確認
    （xyzタイルをエクスポートしようとした時に表示される以下のウィンドウを利用する）
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1147458/08a70e0d-acfc-9531-ac05-d85f93d6d6e6.png)
　

3. 地理院地図で、指定範囲の画像をダウンロード
    https://maps.gsi.go.jp/help/intro/kinolist/1-insatu.html
　

4. テキストエディタでland.mtlを作る
    ```python:land.mtl
    newmtl land
    map_Kd img20230404163427947.png # ダウンロードしたpngファイル
    d 1.0
    illum 2
    ```

5. landフォルダを作成し、以下3つのファイルを格納する
    - 地形のOBJファイル（land_step=1.obj）
    - land.mtl
    - ダウンロードしたpngファイル

## Unity上で可視化
Unityにてプロジェクトを立ち上げて、作成したlandフォルダや
水位のOBJファイルを読み込めば可視化できます。

ただし水面をそれっぽくしたかったので、今回はレンダリングパイプラインをURPとし、
Unity Asset StoreからSimple Water Shader URPをダウンロードして
水面のマテリアルにあてました。

https://assetstore.unity.com/packages/2d/textures-materials/water/simple-water-shader-urp-191449

# おわりに
vol.1は「地形と水面の3DモデルをUnity上で可視化できた」という報告でした。
今回の記事は2か月くらいの作業内容を凝縮してお届けしたのでボリュームが多いですが
次回からは1週間分の作業内容なので少ないボリュームでより詳細な記事になるかと思います。

# （自分用）やりたいことのメモ
- 一時点ではなく、全時刻の水面を切り替え表示できるようにしたい
- 流速をパーティクルで表示したい
- PLATEAUの建物を表示したい
- 水面のシェーダーを流速と合わせたい