Open11

PanotreeをWindows+WSLで実行して、Unityの3Dシーンの静止画カメラアングルを自動生成する

DolphiiiinDolphiiiin

実行環境

  • Windows11 Pro 23H2
  • Unity 2021.3.2f1
  • WSL2 (Ubuntu)
  • Python 3.10.12 (推奨はPython 3.10.13らしい) (wsl上で実行)
  • poetry 1.8.3 (wsl上で実行)
  • Nvidia RTX 4070

WSLの環境構築はの詳細は割愛しますが、PowerShellでwsl --installと打ってインストールできます。
https://qiita.com/ryome/items/240f36923f5cb989da27

WSLを使用しないで、Windows環境のみでの実行は可能?

PoweShellを使用してPythonの環境高構築を試しましたが、できませんでした。後のpoetry installでこけます。

DolphiiiinDolphiiiin

初期セットアップのためのWSL内での環境構築

WSLを開いて、poetryをインストール

$ curl -sSL https://install.python-poetry.org | python3 -

インストールしてもPATHは通ってないので、インストールのログの最後当たりに書いてあるコマンドを実行する

Add `export PATH="/home/user/.local/bin:$PATH"` to your shell configuration file.

この場合はexport PATH="/home/user/.local/bin:$PATH"を実行
PATHを通したのでとりあえず↓を実行しておく。

$ source ~/.bashrc
$ source ~/.bash_profile

poetry --versionを叩いて、バージョンが返ってくれば成功。

参考
https://qiita.com/ksato9700/items/b893cf1db83605898d8a

DolphiiiinDolphiiiin

poetry install

cloneしたフォルダにcdする。
今回は、Windows環境の、D:/panotreeなので、WSLでは/mnt/d/panotreeにcd

$ cd /mnt/d/panotree

poetry installを実行する。

$ poetry install
DolphiiiinDolphiiiin

Unityプロジェクトの読み込み

クローンしたフォルダの、panotree/unityprojectをUnityHubから開く。

UniRxが導入できないエラーが発生する

manifest.jsonでUniRxのソースとして、github.com/ClusterVR/UniRx.gitが指定されているが、どうやらプライベートリポジトリのようで、エラーになる。
いったんSafeModeに入って、エラーになっているUniRXをパッケージマネージャーからRemoveして、UniRxをアセットストアからインポートする。

https://assetstore.unity.com/packages/tools/integration/unirx-reactive-extensions-for-unity-17276?locale=ja-JP
今のところ問題なく動いていそう。

DolphiiiinDolphiiiin

サンプルシーンを開く

Assets/ClusterLab/Scenes/Main.unityを開いて、Play

panotree_explorerを実行する

IPアドレスを調べる

WindowsとWSLの間のネットワークのIPアドレスが必要。
コマンドプロンプトで、ipconfigを実行して、イーサネット アダプター vEthernet (WSL (Hyper-V firewall)):のIPv4を調べる。

> ipconfig

WSLでpanotree_explorerを開く

クローンしたフォルダの、panotreeフォルダで、以下のコマンドを実行する。<Address>は、さっき調べたIPアドレスを入れる。

poetry shell
python panotree_explorer.py --device cuda --api_host <Address>


実行できるとこういう画面になる

DolphiiiinDolphiiiin

エラーUnityのコンソールに、SocketException: 要求したアドレスのコンテキストが無効です。と出る PR#2で修正済み

自分の環境に依存した問題ではない可能性? 要検証
これは、自分のイーサネット環境が複雑だから出てるエラーなのかもしれない。vpnクライアントとか入ってるから、そこでこけているのかも。
今回は、スクリプトを修正して、WSLとWindows間の通信には、vEthernetではなく、tailscaleというvpnトンネルを使いました。

https://tailscale.com/

スクリプトの修正

Assets/ClusterLab/Scripts/Infrastructure/Server/AgentServer.csの64行目を変更します。

@@ -61,7 +61,7 @@
         {
             listener = new HttpListener();
             listener.Prefixes.Add("http://" + domain + ":" + port + "/");
-            var localIPs = GetLocalIPs().ToList();
+            var localIPs = new List<string> { "100.***.***.**" };
             localIPs.ForEach(ip => listener.Prefixes.Add("http://" + ip + ":" + port + "/"));
             localIPs.ForEach(ip => Debug.Log(ip));
             listener.AuthenticationSchemes = AuthenticationSchemes.Anonymous;
@@ -200,4 +200,4 @@

今回はTailscale上でのローカルマシンのIPを明示的に指定しました。
panotree_explorerを実行するときには、スクリプトで指定したアドレスを使用しました。

DolphiiiinDolphiiiin

実行する

panotree_explorerを実行して、Unityがプレイモードになっていることを確認したら、panotree_explorerの画面上でEを押して処理を開始します。

DolphiiiinDolphiiiin

panotree_explorerのログに、Doneと表示されたら、処理は終了です。
プレイモードのまま、ヒエラルキーのTreeRootの中のオブジェクトを選択して、撮影した写真をプレビューする画面になります。

DolphiiiinDolphiiiin

シーンをカスタマイズする

Worldオブジェクト以下にオブジェクトを配置して、BoxColliderを使って、カメラの設置範囲を指定します。(サンプルのオブジェクトを参考にする)

アセットを使って実行してみた

使用アセット
https://assetstore.unity.com/publishers/44386