on
分子受肉の話の続き
要約
(2021年4月:(おそらくOculus側のソフトウェアアップデートにより)Oculusのソフトウェアを立ち上げながらSteamVR側でHMDのトラッキングをすることができなくなってしまったようです。残念ながら、ここに書いていあるやり方は通用しなくなってしまいました) やりたいことがOculus版のソフトだとうまくいく。なので「Oculus版のMR機能+バーチャルモーションキャプチャー」の方法を模索する。結果的に、だいたい動いた。ただ、カメラのキャリブレーションが難しいのでどうにかしたい。
以下、私的な試行錯誤ですので、なにかあれば私@skm58によろしくお願いします(なんとなくふと気になって追記しました 2019/07/02)
この続きの、カメラ位置を(無理やり)合わせる方法はこちら。
注意(2019/03/01 22:00 added)
以下の手順を試していて、どこかの段階で環境が壊れる例があったそうです(ツイートをリンクさせていただきます)。もしやる場合は気をつけて取り組んでください。
HMDに何も映らなくなり、NVIDIAドライバーの再インストールで復旧したとのことですが、原因不明で直る理由もわかりません。もしすでに他に不具合がでた方がいたら申し訳ありません。
BE CAREFUL. This procedure may cause some troubles in your PC environment, so please REALLY careful to do this. One reported that HMD went black at a certain step of following procedues and required reinstallation of NVIDIA driver. It’s unclear what cuased this and why it’s recovered by reinstallation.
自分の環境ならどうにでもなるのですが、ひとさまの環境を壊す可能性のあるものを書くのは怖すぎる。。。
結果
まえは、自分の体の前に出せない(alpha maskがつくられない)ものがあったが、大丈夫そう。これで技術的な問題は解決、実戦投入できそう。ただ、後述するようにカメラ位置合わせが難しく、今回の動画もずれてる。
ながれ
私はゲームでは試してないのだが、しらべたところOculusのBeatSabarでMR合成しようとした人がいた ので、他のゲームでも運が良ければ使えるかもしれない。このあたり、日本語の文章がほぼ存在しない(英語も超少ないけど・・・)ので、もしこのメモがだれかの参考になれば嬉しい。
- 確認
- Oculus版のゲームをコマンドラインから-mixedreality -externalcompositionのオプションで起動して、2分割画面が出ることを確認
- Oculus版のゲームをコマンドラインから-mixedreality -directcompositionのオプションで起動して、「Unity has not started sending image data」が出ることを確認(LivのCompositorと同じ画面)。
- VMCを起動し、仮想カメラを起動。Oculus版のゲームに表示されている画面サイズにあわせたとき、正しく合成されることを確認。
- カメラキャリブレーション
- 本物のカメラを接続
- CameraTool.exeを使ってカメラキャリブレーションし、cameracalibration.xmlを出力
- CameraToolが起動しないのでZEDSDKを入れた(これが効いたかはわからない)
- CameraToolを終了
- cameracalibration.xmlの書き換え
- VMCを起動し、VRMの読み込み・キャリブレーションなど設定の後、externalcamera.cfgを出力
- externalcamera.cfgをcameracalibration.xmlに翻訳(頑張る)
- 本番
- CameraToolを起動し、cameracalibration.xmlを読み込み
- Save Camera to OVRServerする
- CameraToolを終了
- ゲームを-mixedreality -directcompositionで起動する
- もしキャプチャ元を選ぶように言われたら、VMC仮想カメラを選択
- ゲームが第三者視点で起動し、VMCの画面が合成される
- 楽しむ
作業メモ
一部の分子モデルが正しく画像合成されない問題
前回、Steam版Nanome + VMC + LIVの組み合わせでかなりやれることがわかった。しかし、クロマキー合成すると、特定のモデルが常にアバターの裏側に行ってしまう問題が残っていた。テスト動画では、surface表示にしてから体の前に持ってくることでごまかしたが、これだと実用上問題がある。直したい。
仕様らしい
色々試してみて、これはビューアソフトの問題だとわかった。4分割画面の時点でalpha maskが正常に表示されないことを確認したので、ビューアソフト内部の問題だと判断し、開発企業に問い合わせた。結果、そういう挙動になることは既知、との答えをいただいだ。とても詳しく回答をいただいて、非常にありがたかった。もはや打つ手がない感じで、ちょっと残念だ、というのが前回までの話(書いてないけれど)。
Oculus版の存在を思い出す
ほぼ諦めかけていたのだが、偶然、このまとめを目にした。
Oculus Rift+バーチャルモーションキャプチャー+LIVでMR合成する方法
とても参考になった。
「Oculus APIだとLIVをつかったMRSはできない」というところを読んだ時、そういえばOculus版もあったことを思い出した。たしかOculus版の方にはMixed Reality Captureという機能があった気がしたので、その動かし方を調べた。おおかた公式で説明されていた。ここのサイト。
(関係ないが、このOculusのMRC周辺のドキュメントは、リンクが切れていがちで精神的に翻弄されやすい。たぶん日本語版のページがないのだろう。記事の中のリンクではなく、左の別枠にあるリンクでひらけば大丈夫)
なぜかOculus版だとうまくいく
まず、コマンドラインから目的のソフトを以下のオプション付きで起動して、二画面分割が出ることを確認。
- -mixedreality -externalcomposition
この時点で、Steam版でのクロマキーのfront/backの認識されない問題が回避できていることがわかった。
次に、以下のオプション付きで起動して、LIVのcompositorと同じような画面が出ることを確認(Unityがまだシグナルを送ってません、的なガビガビの文字)。
- -mixedreality -directcomposition
さらにVMCを起動し仮想カメラをONにした状態で、directcompositionで起動し、画面サイズと背景色を合わせるとクロマキー合成ができる。
これで、システム的にはOculus版でもVMCを使ったクロマキーができるようになった。
やっとできた!・・・のだけど、まだ問題が残っている。
カメラキャリブレーション
カメラキャリブレーションが難所だった(いまだに完全には解決してない)
- Oculusの公式で書いてあるとおり、CameraTool.exeを動かす
- sl_zed64.dllとsl_core64.dllがないと言われたので、ZED SDKを入れたら動くようになった。ただし、ZED SDKを入れる段階でCUDAの更新とか色々行われたので、何が効いたのかいまいちわからない。 CUDAの更新って嫌な思い出がおおく、あまりやりたくないし、おすすめしたくない。今回は無事でしたが。
- CameraToolを起動する
- CameraToolでVMCの仮想カメラは認識されるが、選択しても使うことができない。pidが不明です、的なことを言われたと思う。
- なので、まずは本物のカメラを使って適当にキャリブレーションする。
- なんとか最後までやってファイルを保存すると、cameracalibration.xmlが保存される
- cameracalibration.xmlの中身を適当に改変する。
- 形式はxmlで可読だったので、手で書いてみることにした。
- CameraToolはOpenCVのカメラキャリブレーションを使っているらしく、そのあたりののドキュメントを読みながら適当に数値を入れ直す。
- translation rotation cameramatrix これらを書きかえる
- distorsion補正は0でいいと思う(わからない)
本番
- VMCを起動し、設定して、キャリブレーション。
- externalcamera.cfgを出力し、cameracalibration.xmlに変換。
- CameraToolを起動して、cameracalibration.xmlを読み込んでSave Camera to OVRServerする。
- もしVMC仮想カメラ以外にカメラを繋いでない場合は、CameraToolを終了する(こちらで仮想カメラを呼んでるとゲームから呼べないらしい)。
- 目的のゲームを-mixedreality -directcompositionで起動する。
Oculus版のMR機能についてわかったこと
Steam版のexternalcamera.cfgに相当する情報が、二つのファイルに分かれている。
- mrc.confg
- -create_mrc_config のオプション付きで起動すると、実行ファイルと同階層にあるDataフォルダの中に置かれる。
- -load_mrc_config で、そのファイルを読める。
- 一度起動して出力されたファイルを編集し、-load_mrc_config付きで再び起動すると反映される。
- このファイルにはカメラ位置や回転を指定する変数がない。
- ゲームのバイナリが読む。
参考:OculusのBeatSabarでMR合成を頑張ろうとした先人のレポジトリ. BSOculusMREnabler
- cameracalibration.xml
- 座標・回転・歪み補正・カメラ行列の情報などが書かれている。
- CameraToolで読んで、OVRServer経由でゲームに渡す。
次やりたいこと
- externalcamera.cfgを読んでcameracalibration.xmlを出力するスクリプトを書く
- いまいち両者の数値の対応関係がよくわかってないので、しばらくかかりそう。
- メモ
- FOVのあたり(たぶんCameraMatrixの値から出てくる)は三角形かいて計算しないといけないような気がしている。
- rotationがなぜ4変数なのか理解できてない。2軸の周りの回転行列(の一部の成分)で表現してる?だとしても、どれがどれだかわからん。
- LIVみたいに合成した映像をHMDへ返す方法はないだろうか・・・。
- この二点が解決できれば実戦投入可能(なんの実戦だ・・・)
参考
- Oculus Rift+バーチャルモーションキャプチャー+LIVでMR合成する方法
- https://twitter.com/i/moments/1098106642812395520?ref_src=twsrc%5Etfw)
- 今回は-vrmode openvrじゃない方のオプションを試してみたことがきっかけで光明を見出した。
- Oculusのmixed reality capture
- https://developer.oculus.com/documentation/unity/latest/concepts/unity-mrc/
- 一番重要。リンクが切れがちなので、左のフレームからページを開くべき。
- ZED SDK
- OpenCVのカメラキャリブレーション
- BSOculusMREnabler
追記
- 2019/03/01 誤表記修正
- x Send to Oculus Serverする -> o Save Camera to OVRServerする
- x -OpenVR -> o -vrmode openvr
使用ソフト
- Virtual Motion Capture
- VMC の開発者は @sh_akira さんです
- ダウンロードサイト Booth
- https://sh-akira.github.io/VirtualMotionCapture/about.html
- Oculus版Nanome