PanotreeをWindows+WSLで実行して、Unityの3Dシーンの静止画カメラアングルを自動生成する
このスクラップは何?
クラスタ―メタバース研究所2024年5月31日に発表した、PanoTreeをWindows+WSL環境で実行した記録です。
PanoTree
実行環境
- 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
と打ってインストールできます。
WSLを使用しないで、Windows環境のみでの実行は可能?
PoweShellを使用してPythonの環境高構築を試しましたが、できませんでした。後のpoetry install
でこけます。
サンプルプロジェクトの用意
UnityのサンプルプロジェクトがgithubにあるのでWindows上でcloneします。
> git clone https://github.com/cluster-lab/panotree.git
初期セットアップのための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
を叩いて、バージョンが返ってくれば成功。
参考
poetry install
cloneしたフォルダにcdする。
今回は、Windows環境の、D:/panotree
なので、WSLでは/mnt/d/panotree
にcd
$ cd /mnt/d/panotree
poetry install
を実行する。
$ poetry install
Unityプロジェクトの読み込み
クローンしたフォルダの、panotree/unityproject
をUnityHubから開く。
UniRxが導入できないエラーが発生する
今のところ問題なく動いていそう。manifest.json
でUniRxのソースとして、github.com/ClusterVR/UniRx.git
が指定されているが、どうやらプライベートリポジトリのようで、エラーになる。
いったんSafeModeに入って、エラーになっているUniRXをパッケージマネージャーからRemoveして、UniRxをアセットストアからインポートする。
サンプルシーンを開く
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>
実行できるとこういう画面になる
エラーUnityのコンソールに、SocketException: 要求したアドレスのコンテキストが無効です。
と出る PR#2で修正済み
SocketException: 要求したアドレスのコンテキストが無効です。
と出る自分の環境に依存した問題ではない可能性? 要検証
これは、自分のイーサネット環境が複雑だから出てるエラーなのかもしれない。vpnクライアントとか入ってるから、そこでこけているのかも。
今回は、スクリプトを修正して、WSLとWindows間の通信には、vEthernetではなく、tailscaleというvpnトンネルを使いました。
スクリプトの修正
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を実行するときには、スクリプトで指定したアドレスを使用しました。
実行する
panotree_explorer
を実行して、Unityがプレイモードになっていることを確認したら、panotree_explorer
の画面上でE
を押して処理を開始します。
panotree_explorer
のログに、Done
と表示されたら、処理は終了です。
プレイモードのまま、ヒエラルキーのTreeRoot
の中のオブジェクトを選択して、撮影した写真をプレビューする画面になります。
シーンをカスタマイズする
World
オブジェクト以下にオブジェクトを配置して、BoxColliderを使って、カメラの設置範囲を指定します。(サンプルのオブジェクトを参考にする)
アセットを使って実行してみた
使用アセット