読者です 読者をやめる 読者になる 読者になる

個別記事にするほどでもないUnity+OculusRift+OvrvisionのTips

概要

ゴールデンウイークに仕事と一切関係ないタイトルの通りの環境でちょっとしたデモを作っていた。 その過程で豆知識的な物がいくつか有ったので忘れないようにメモ。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にすると倍の大きさになる)

Ovrvision

物理演算をそのまま組み込むと変

マーカーを検出したり見失ったりした時、あるいはマーカーを見たまま移動したとき、サンプルではOvrvisionViewというGameObjectをあっちこっちに移動させている。
マルチマーカーでのARとしては正しいが、一方で物理演算上はオブジェクトがガッタンガッタン揺れる(それも、意図せず)ことになる。

そんなわけでトラッキング対象が一個であるなら、いっそのことマーカーの位置を固定してカメラの方を動かしてしまえ!というアプローチもある。
こんな感じ。(これは、トラッキング対象が一個の場合。マルチマーカーでUnityだと、うーん、大変だと思います)
https://gist.github.com/neon-izm/f36763a35a63e1250a8c
こんな感じに動きます。

位置姿勢の計算結果の精度が良くない

これは、憶測も交じっている。 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モデルも(一応)付いてくるようにした。

左右の絵がガタガタに見える