概要
ゴールデンウイークに仕事と一切関係ないタイトルの通りの環境でちょっとしたデモを作っていた。 その過程で豆知識的な物がいくつか有ったので忘れないようにメモ。qiitaでも良いのかもしれないけど、あそこに書けるほど大した話でもないです。
環境
- Windows 8.1(x64)
- Unity4.3.4f Pro
- OculusRift devkit 1 SDK0.25
- Ovrvision SDK v0.6
- MMD4Mecanim_Beta_20140430_3
Unity
シーンの使いまわしをしたい
File→Save Scene asで別名保存をポコチャカ作れば良い。
負荷が重い関数を見つけたい
ctrl+7のprofiler→deep profileで関数単位くらいまで分解出来るのでボトルネックが見つけられる。
設定ファイルの保存先
Application.streamingAssetsPath 以下が作法として正しい。
MMD4mechanimのMMDモデルの大きさ調整
MMDモデルインポートした!→大きさがシーン内で変!という状況での修正方法は
- PMX2FBXのImport Scaleでの調整
- PMX2FBXのVertex Scaleでの調整
- UnityEditor上のTransform.Scaleでの調整
の3種類くらい方法が思いつくが、上記環境での推奨手法はVertexScaleを変えて再インポート(通常は8なので、16にすると倍の大きさになる)
@izm モデルのサイズ調整ですが、PMX2FBXのVertex Scaleで調整(再変換)するのが最も安全な方法です。ただ、サイズ変更前に FBX や .model.bytes などのファイルは一旦削除したほうが良いです。 pic.twitter.com/Yl2xAQ05So
— Nora (@Stereoarts) 2014, 5月 4
Ovrvision
物理演算をそのまま組み込むと変
マーカーを検出したり見失ったりした時、あるいはマーカーを見たまま移動したとき、サンプルではOvrvisionViewというGameObjectをあっちこっちに移動させている。
マルチマーカーでのARとしては正しいが、一方で物理演算上はオブジェクトがガッタンガッタン揺れる(それも、意図せず)ことになる。
いわゆるマーカARを作るとき
・カメラは固定でマーカの位置姿勢を動かす
・マーカの位置を固定してカメラを動かす
の二種類の方法があるわけですが、物理エンジンを使おうと思うと後者でなければちゃんと動かないので、注意が必要ですね。
— izm (@izm) 2014, 5月 2
そんなわけでトラッキング対象が一個であるなら、いっそのことマーカーの位置を固定してカメラの方を動かしてしまえ!というアプローチもある。
こんな感じ。(これは、トラッキング対象が一個の場合。マルチマーカーでUnityだと、うーん、大変だと思います)
https://gist.github.com/neon-izm/f36763a35a63e1250a8c
こんな感じに動きます。
ヤッターOvrvisionSDKのAR部分、オブジェクトを動かす方式からUnityカメラを動かす方式に切り替えデキタワー
GIF by Gyazo http://t.co/t4NjTdH25H #Gyazo
— izm (@izm) 2014, 5月 3
位置姿勢の計算結果の精度が良くない
これは、憶測も交じっている。 OvrvisionSDK v0.5のUnity実装において、マーカーの検出自体は割と良好だが
- カメラの内部パラメータが決め打ちされている(本当はフォーカスを合わせるためにグリグリとフォーカスリング動かすと、再計測しなければいけない)
- マーカーの大きさを指定できない。(マーカーARは原理上、マーカーの物理世界上の一辺の長さを必要とします)(現時点で開発元は20cm四方をリファレンスとしているとのこと)
と言うわけで、バージョンアップ待ちか、マーカーを一辺20cmにするのが良いかと思う(キャリブレーションは、内部でちゃんとされているかも不明なのでやるべきか分からない)
60FPS出ない
カメラからの画像取得が重い。なのでその部分を別スレッドの切り出す。と言うのを @hecomi さんがやっていた。 http://tips.hecomi.com/entry/2014/04/07/004634 これは効果が絶大で、逆にシングルスレッドでは割と速いPCでも結構60FPSを割ってしまう。
SDKのバージョンが違うが、数行修正するだけで動く。以下はOvrvisionSDK v0.6向けのOvrvision.csファイル。差し替えて使うとマルチスレッドになる。
ついでに明るさやコントラストをOvrvisionSDK v0.5で設定ファイルに出せるようになったので、sキーで現在の明るさ等を保存、開始時に自動読み込みをするようにした。
https://gist.github.com/neon-izm/028fe364b96ad389cdaf
ARを作った時に3Dモデルの立体視が壊れる
正統派な解決としては、左右両方のカメラからマーカー検出をする。というのが一番正しい。
ダーティな解決策として、例えばサンプルシーンで言うところの
OVRCameraController以下の左右カメラのtransform.positionのx座標を目視で弄ってやるだけでも、とりあえず破綻は無くなる。
(デフォルトだとCameraLeftが0.0でCameraRightが0.28だが、マーカーのサイズによって大きくしたり、小さくしたりする必要がある)
Ovrvisionのサンプルシーンで矢印キーで見え方調節してたら立体視が壊れる
Ovrvision.csファイル内で矢印キーに合わせてウェブカメラのクロップを行っている。
これで現実世界の絵をステレオで見た時に違和感が無いように調整している。
しかし、ここを変更すると上のOVRCameraController以下の左右カメラのtransform.positionも更新しなければ、CGと現実の位置合わせが狂って、立体視が壊れてしまう。
上で挙げたOvrvision.csではこれに対する対応もちょっと入れている。アプリケーション実行中の左右キーでの調整に合わせて3Dモデルも(一応)付いてくるようにした。
左右の絵がガタガタに見える
ovrvisionで左右がガタガタに見えた時 は焦点距離を調節する。
運搬時にいつの間にかずれたりする。また、このレンズは焦点距離が変化するとかなり縦方向に歪むので、運搬した後、デモする前にovrvisionの先端のフォーカスリングを回して正しい見え方になるように調節する事。
— izm (@izm) 2014, 5月 4