Ovrvision+OculusRiftDK2のマーカレストラッキングもどきを実現する(仮)

概要

OvrvisionSDK2.1が公開され、OculusRift DK2が高視野角ビデオシースルーHMDとして使えるようになりました。

OvrvisionSDKにはAR機能があり、Arucoのマーカを用いたマーカARが実装されています。
しかし、マーカ無しでARを使えたら、ちょっと楽しいかもと思い、大急ぎで試しに作ってみました。
まだやりたい事が実現できていないので、また進捗があったら別の記事を書こうと思います。

作り方

OvrvisionSDK+OVRSDKを組み合わせます。以下のような処理を行います。

  • OvrvisionSDKのAR関係を無効化する
  • 現実の絵をOvrvisionSDKで持ってくる
  • OVRSDKのOVRCameraRigのポジトラを有効にして、CG座標系上のある絶対座標にCGを置く

つまり、普通のOculusRift DK2のコンテンツの作り方にして、背景だけをOvrvisionカメラの現実に差し替えます。

すると、まるでマーカ無しでSLAM等を使ってトラッキングをしているかのように、うまい感じにCGが現実に重なるはず、という企みです。ポジトラ用カメラがあるって素晴らしいです!

Gyazo - f0a7d9ed2db8c73ea3207a49cb9c95b7.gif

結果

マーカーとか無しで自分の部屋にキャラクターを呼べます

YouTube

本当はこうしたかった

OVRManager.tracker.GetPose()というAPIがあり、これを使うとDK2のカメラ座標に対する位置姿勢の絶対値座標と姿勢が取得できます。

DK2のポジトラカメラの高さを測って、この値に合わせてOvrCameraRigを動かしてやれば、 体験会やデモなどで綺麗にモデルを床に立たせる事が出来るはずです。

しかし、OVRSDK0.4.3.1時点では、このAPIがバグで動いていないので、

DK2座標については「rキーでリセット」

床の高さについては「uキーで上昇」「dキーで下降」

と言う原始的なユーザが見た目で合わせこむ形式になっています。 つらい…

原理的にこんなことも出来るはず

  • 好きなMMDモデル+モーションに差し替えて、自分の嫁を自分の部屋に呼べる
  • 自分の部屋のベッドで好きなMMDモデルと添い寝
  • 自分の部屋で好きなMMDモデルに壁ドン(これは簡易な手検出を行うと良いかも)

などなど、応用範囲は広そうです。

とりあえず試してみたい方へ

実はこの冒頭のクエリちゃんのデモ、コードは10行くらいしか書いていません。 一応冒頭のクエリちゃんデモのプロジェクト一式をソースコード込みで以下に置きます。

Unity4.5.5Pro+OculusRuntime0.4.3+OvrvisionSDK2.1+OVRSDK0.4.3.1の組み合わせです。 また、モデルにはクリエイティブコモンズライセンスで公開されているクエリちゃんを使用しています。 近くに寄っても破綻しない高解像度なテクスチャを含み、表情も豊かでアニメーションも比較的多く含む(mecanimセットアップ済みのモデルもある)ので、お勧めです。

http://www.query-chan.com/product.html

クエリちゃん【デジタル・インタラクティブ・アイドル】OFFICIAL WEBSITE

f:id:izm_11:20141202013629p:plain

プロジェクト一式+実行ファイル

https://copy.com/Mj2YR2OJRhIZ2YCG

解凍したbinフォルダのtest_Direct.exeをダブルクリックすると冒頭のデモが試せます。

床の位置合わせ等は手動で行う事になるので、少々味気ないですが、クエリちゃんの代わりにお好みのモデルに差し替えて、自室に好きなモデルを召喚して遊ぶなどしていただけたら嬉しいです。 シーンファイルのAlwaysInWorld内以下にモデルを配置してビルドするだけで使えます。

大体1mくらいカメラから離れてrキーを押してリセットした後、uキーやdキーで部屋の床とキャラクタの立っている高さを合わせます。

スマフォスロットインHMDの視野角及び没入感を改善するハードウェアMOD

概要

スマフォスロットインHMDにおける問題点と、解決可能になりえる手法、試験的なMODを行った結果を書きます。

スマフォスロットイン系HMD Advent Calendar 2014 の 1 日目です。 このAdventCalender、完走出来るか非常に怪しいです><

スマフォスロットイン系HMD Advent Calendar 2014 - Qiita

スマフォスロットインHMDにおける問題点

「視野角が狭い」の一言に尽きます。 これは、

  • スマフォのサイズが一般にOculusRiftのパネルよりもサイズが小さい
  • Youtube等の既存立体視コンテンツを樽型歪みが起きにくい低倍率レンズを用いている

という2点が主な原因となります。

参考

OculusRift DK2の光学系の、特に視野角についての調査は以下スレッドが詳しいです

http://www.mtbs3d.com/phpbb/viewtopic.php?f=140&t=19834 http://frederic.lopez.free.fr/oculus%20rift/viewable%20zone/DK1-63.5mm-2mm.png

解決するための手法

樽型歪みが起きても、死んでしまう画素(つまり、HMDを覗いてても見えない画素)が増えても良いので、レンズ倍率を上げてしまう。

というのが手っ取り早い手段です。 ただ、一般にはレンズ倍率を上げると、焦点距離も変わるので、そうなると市販のスマフォスロットインHMDでは対処が・・・

ともかくやってみましょう。

MOD

元になるスマフォスロットインHMD

http://www.aliexpress.com/item/2014-New-ColorCross-Professional-Plastic-Edition-Head-Mount-3d-Vr-Virtual-Reality-Glasses-Oculus-Rift-Google/32214059791.html

(まあ、あれです。ハコスコDXです)(焦点距離などの緒元が記載されていて親切ですね。)

Amazon.co.jp: ハコスコDX(デラックス)黒: 家電・カメラ

これの良いところは

  • IPD(目の間の距離)を物理的に調節できる
  • レンズマウントを回すだけでディスプレイとレンズの調節が出来る(1cm程度ですが)
  • ↑の関連で、グリグリ回しているとレンズマウントだけを取り外せる

点です。

新しく使うレンズ

プラスチックルーペ20個で10ドル http://www.aliexpress.com/item/5X-35mm-Jewelry-Magnifier-portable-handheld-Mini-loupe-Phone-Strap-Magnifier/1580803656.html

他の物でも良かったですが、僕には丁度良い作りでした。

f:id:izm_11:20141201003946j:plain

レンズの加工

ルーペレンズの根元から切り、切断面をヤスリで整えます。レザーソーなどで簡単に切ることが出来ます。

f:id:izm_11:20141201004005j:plain

倍率を稼ぐために二枚重ねにして元のレンズ部分の奥にテープで留めます(元からあったレンズは外します)

f:id:izm_11:20141201004043j:plain

再組立てをします。

f:id:izm_11:20141201004058j:plain

結果と評価

4.7インチFullHDのスマートフォン(SH-06E)で見え方を確認しました。

ユニティちゃんライブステージCandy Rock StarをOculus Riftに対応してみた ‐ ニコニコ動画:GINZA

この動画を同一フレームで比較した結果が以下です。

  • 視野角は大きく広がった
  • この動画を見た時に樽型歪みが気になりにくい=OculusRift光学系に近い
  • しかし、レンズが遠くなったことで「すごい双眼鏡を覗いている」感じが出てしまう
  • これを解消するには、別の素材を使うしかない

個人的な感想

  • 多分このHMDの無改造品にGalaxyNote3買って普通に刺した方がちゃんと見える…

  • GoocleCardBoardのリファレンスはレンズ径25mmですが、小さすぎると思います。今回使ったものは35mmですが、それでも視界にレンズ周りのプラスチックが見えてテンションが下がる

  • ハコスコDXの白、白い周りのプラスチックが気になるので、没入感を求めるなら黒をお勧めします

以上で1日目の記事は終わりです。

2日目はたかしすきーさん( takashiski@GCB改造してる (@takashiski) | Twitter )にお願いします

スマフォスロットイン系HMD Advent Calendar 2014 は絶賛参加者募集中です。よろしくお願いします。

スマフォスロットイン系HMD Advent Calendar 2014 - Qiita

2014/11現在のDK2設定、バージョン違い等の最適解情報まとめ

概要

OculusRift DK2が発売され、多くの人の手元に届いています。
これからOculusコンテンツを作ろう!と思ったときにSDKバージョンが幾つもあって、お勧めPCも色々あって、どれを選べば良いのかみたいな目安があると、便利かなと思い、調べてみました。
僕の思い込み等が入っている可能性もあるので、ツッコミや質問等、お気付きの点がありましたらtwitter

https://twitter.com/izm

に連絡いただけると嬉しいです。そしてMacは詳しくないので、Windows限定です。(Radeonも詳しくないんで教えてください)

  • デモ、開発用PC別のインストールすべきSDKバージョン
  • Unityの設定
  • どのくらい"VRとして"パフォーマンスが出ているかの確認

と言う内容です。

まず、OculusRift DK2自体のセットアップやファームウェアアップデート等については

を上から順に見ていくと、おそらく初期不良じゃなければ動くはずです。

SDK等の選び方

Unityのバージョンは4.5.2か4.5.5が推奨です。4.5.3-4.5.4は強く非推奨です。
また4.6beta,5.0betaも余程事情が無い限り勧めません。詳しい人なら大丈夫です。
DK2のファームウェアは以下のおすすめOVRSDKバージョンの最新版に合わせるのが無難です。

後述のOVRSDK0.4.2と0.4.3.1の使い分けで

  • OVRSDK0.4.2→Unity4.5.2
  • OVRSDK0.4.3.1→Unity4.5.5

がOculusVRが動作を確認した組み合わせなので、Unityのバージョンもそれぞれに合わせておく事を推奨します。

また、Windows7ではAeroを無効化出来ますが、検証したところメリット(ExtendMode時のPostPresentの値が減らせる等)は確認出来ませんでした。一方でAeroを無効化するとjadderが増えます。よって
Windows7はAero Onが現時点での推奨環境です。

Optimusノート

市場に出ている99%のGeforceGPUが載ったゲーミングノートPCがこれです。GeforceIntelGPUを両方使えるやつです。
このPCを使う場合、前提条件として「小まめにシステムイメージまるごとをバックアップする」ことを強く推奨します。具体的には隔週ごとにバックアップを取るくらいでも間違いではないです。
なぜならOculusランタイムとOptimusノートは相性が悪く、TLを見ている限りかなりの確率でブルースクリーンを繰り返して起動しない状態に陥る為です。
このタイプのPCはOVRSDK 0.4.2一択です。 0.4.3以降だと相性問題が更に悪化するためです。

また、ブルースクリーンを繰り返して起動しなくなった場合、セーフモード起動→GPUドライバのアンインストール→通常起動→GPUドライバの再インストールで復活する事もあるので、試す価値はあります。

このPCはExtendモードでしか動作しません。 稀に当たり個体だとDirectモードが動くようです
[補足] RazerBladeの当たり機種だと動く個体も存在しています。RazerBladeはOculusVR社内にOptimusのテスト環境用に使われているからでしょうか…

[補足の補足] 11/25現在、有志によるDirectModeの動作検証が進んでいます。

OculusSDK Optimus検証メモ

キルロボブログ: G-Tune i790でのOculus Runtime 0.4.3 動作検証

G-TUNEというかClevo製ベアボーンのOEM個体については0.4.3.1(Oculus Runtime 0.4.3)においてDirectModeが動く可能性が高いです。
その際、Windows7の方がWindows8.1よりも動作状況が良い場合が多いです。(おそらく8.1でのマルチGPU周りの追加機能が悪さをしている状態)

また、GeforceDriverは344.75が比較的安定しているので、アップデートを推奨します。

オンボードGPU搭載機種

個人的にはパフォーマンスが出ない為、あまりお勧めではないです。可能ならPCのアップグレードを推奨します。
描画負荷が相当に低いコンテンツなら、大丈夫です。 OVRSDK0.4.2か0.4.3.1をお勧めします。 Directモードが動きます。Directモードでデモしましょう。

それ以外(GPUの載ったデスクトップPC)

MacBookPro(Geforce)、MSI GT72等の一部ノートPC、SLIノートも便宜上ここに入ります。
現時点での最適解なPC群です。

最適なパフォーマンスを出すならOVRSDK0.4.3.1をお勧めします。
過去のノウハウを使う可能性があるならOVRSDK0.4.2も次善の手です。(例えばFinalIKでポジトラと自キャラを合わせる、OVRCameraControllerを書き換える等)
Directモードでデモしましょう。

Unityの設定

力尽きました。後で追記します…
まずはビルドしたらDirectToRift.exeで起動する事とか、UnityをDX11モードで起動するべきかとか、VSyncはUnityでオフにするかオンにするかとか、0.4.3以降だとScreenScaleを変えてパフォーマンス稼げるとか、maxFovをケチってしまうと微妙にパフォーマンスが稼げるとか色々あるんですが、うまく書ける自信がありません…

VRパフォーマンスの検証

まずは前提として「75FPSをキープ出来るようにコンテンツを作る」ようにしないと、この項はほとんど無意味です。
パフォーマンスチューニングは大変ですが、頑張るしかありません。
本題です。基本的な話をすると
最適な設定をしたDirectモード>いい加減な設定をしたDirectモード>(越えられない壁)>最適な設定をしたExtendモード>いい加減な設定をしたExtendモード

の順にVR体験は変わってきます。大事なのは「Directモード、Extendモードそれぞれに、設定最適化の余地がある」 と言う事です。
この設定が最適かどうかを検証する手段を以下に書きます。

Directモードで動くPC

動作確認するPCにインストールしたOVRSDKのバージョンに対応したovr_sdk_win_0.x.yをダウンロードして
Oculus World DemoのショートカットをダブルクリックしてTuscanyDemoを起動します。

f:id:izm_11:20141118232337p:plain

Directモードで起動したらスペースキーを押してプロファイル画面を出し、スクリーンショットを撮ります。ここで理想的な数値例を以下に挙げます。(協力:野生の男さん)

注目すべきは「PostPresent」の値で、これはSDK0.4.3以降で最適なGPUドライバ設定を行うと0ms-0.2ms程度に収まるはずです。 0.4.2以前、あるいはGPUドライバの設定(トリプルバッファリング等)に不備があると10ms以上の値が出ます。 例えば0.4.2では頑張っても以下のような値になります(10msくらい)。

f:id:izm_11:20141118232222p:plain

また、いい加減な設定だとPostPresentが40ms以上になる事もあります。そうなっていた場合は非常に設定が悪いので要設定確認です。GPUドライバの色々な設定を変えてこの値が小さくなるように試行錯誤するべきです。

VisionProcは通常無視できるくらい(<1ms)の値になっているはずです。

(この辺りの数値の理屈、解説はOculusRift DK2 Advent Calender記事で行う予定です)

Extendモードでしか動かないPC

つらいです…

  • 75Hzモードで動かすためにDK2をプライマリモニタ(メインディスプレイ)にしましょう。(Unity4.5.2は必須。4.5.5だと不要かもしれない) Dismon http://dualmonitortool.sourceforge.net/dismon.html をデスクトップに置いておくと、切り替えが楽です。
  • そもそも絶望的に75FPSのパフォーマンスが出ない場合は、ディスプレイモードを60Hzにしましょう。多少マシになります。
  • Optimus環境におけるPostPresentの数値目標は50ms程度

Unity5.0beta+OVRSDK0.4.3.1+OculusRuntime0.4.3において、ExtendモードでもPostPresentの値が取得できました。
少なくとも僕の環境(Optimusノート)においてTimeWarp 60ms程度、PostPresent 50ms程度が発生しており、これは要するにDirectモードに比べてExtendモードは3フレームの遅延が起きていることを示します。これはつらい…

Geforceの場合の推奨設定を藤宮ケイさんから教えてもらいました。下記を参考に!

最後に

これからも最新SDKでドンドンとVRパフォーマンスが高まっていくはずなので、ワクワクですね!
最適な設定で良いVR体験を!!

Kinect v2をOculusRiftと組み合わせてデモをする際のノウハウと知見

概要

Kinect v2は現時点で椅子に座った体験者の頭と手の位置を取得するだけなら、安価なセンサ類の中では一番安定していると個人的には思っています。 単純なヘッドトラッキングだけならOculusRiftDK2のカメラがあれば何とかなりますが、他の関節も取得したい場合は、こういったデバイスを併用することになります。

OculusRiftと併用して展示する機会が何度かあったので、その際に分かった事を書きます。

Kinect v2 Unity Integrationは重い

OculusRift DK2は75FPS環境が推奨されていて、Unityで制作したコンテンツを安価なPCで75FPSを出すためには色々なチューニングをしています。
しかしKinect v2 Unity IntegrationのパッケージをUnityに読み込み、関節の位置だけを取得する(つまり、描画負荷はほとんど無い)コンテンツを作って、Kinect 未接続時に75FPSギリギリのシーンに対してKinectを接続すると65FPS程度まで速度が低下しました。 まだ定量的には計測していませんが、特にCPU及びGPUが非力なノートPC環境でのデモを行う場合は、Kinectの分の負荷増加を考慮してパフォーマンスに余裕があるコンテンツを作ることが望ましいと思います。

座りっぱなしの人は検出されにくい

椅子に座って首を回すくらいしか動きが無い体験者を、Kinect v2は人だと検出しにくいです。
そして体験者の背後で覗き込む人や、後ろを通りすぎる他の人をKinectが検出してしまって、ゲーム内のキャラクター位置があらぬ方向に吹っ飛んでしまってアアアッ!!!となります。

これに対しては、ある程度椅子に座った後に動きを要求するか、椅子に座る前に体験する人をトラッキングしていることを確認してからの方が望ましいです。

人検出は万能ではない

椅子に座っている体験者の様子を覗き込む人がいると、二人分の点群が合体して、頭と腕と足がありえないポーズになることがあります。
これはv2のSDKで特に顕著で、v1の時はもうちょっとうまく分離できていたような記憶があります。
こんな時は、「一度Kinectのカメラを手で覆ってから戻す」なんてことをやりがちですが、前述の「座りっぱなしの体験者はKinectで検出されにくい」と言うのと併せてリカバリー不能になる事が多いです。
そんな時は落ち着いて覗き込んでいる人に事情を説明してしゃがんでもらう、離れてもらうなどしてもらいましょう。 進入禁止エリアを物理的にテープを床に貼る、カーテンで区切るなどの対処が許される展示なら、検討する価値があります。

プレビューを使おう

上で挙げたような問題に対処するために、技術者がもし貼り付いていられる展示であれば、別窓でKinectが今誰を検知しているかをプレビューしておくと、便利です。
Kinect SDK browserの中に入っているサンプルの「Body Basic WPF等が低負荷でおすすめです。
(Kinect Studioのpreviewを使うと詳細情報が取得できるんですが、割と重いソフトであること。Kinectのマイク入力を拾って、エコーがかかった外部の音が体験者のヘッドホンに入ってしまう。などの問題点があるので、Body Basicが良いと思います)

また、Kinect v2の人認識は複数ソフトウェアでデータは共有しているので、デモの開始前にこのプレビュー画面を見ながら、体験予定者が検知されていなければ、立ったり座ったり、手を動かしてもらいましょう。Kinectに検知させてから座ってもらい、OculusRiftを被せると、スムーズな体験を提供できると思います。

プログラム上で出来る事

  • 一番距離が近い人を体験者と見なす だけでは大抵失敗する
  • このエリア内にいる中で一番近い人、みたいな区切りをすると比較的安全
  • しかし人検知は万能ではないので、技術者張り付きではない環境では、一定の事故は起きる。遊びなら諦めましょう。お仕事だったら…大変ですね!!

VR環境における簡単な振動ユニットの使い方について

概要

VR環境での視覚、聴覚だけではなく、他の感覚もユーザに呈示すると没入感が高まる事が広く知られています。
たとえばOculusRiftでジェットコースター系のデモをするときに扇風機を使うと怖さが増える等です。
今回僕は乗り物(ロボット)に乗るVRシステムを作成し、その過程で振動ユニットを使いました。体験者からのヒアリングで、結構いい感じだったと言われたので使い方を少し書きます。

振動ユニットとは

太鼓やバスドラム等は生音で聴くと体が振動します。また2.1ch環境のサブウーファーもブルブル震えます。今回話す振動ユニットと言うのは大雑把に言うと可聴音は出ないサブウーファーを椅子などに張り付けて、低音が流れた時に振動させる。と言う物です。

基本原理はスピーカーと同じなので、雑に言うとワット数が高いほどパワーがあります。 今回は上海問屋の振動ユニットを使いましたが、他の類似製品でも基本的には同じです。

【上海問屋】通販サイト | 【お一人様2点まで】 スピーカーでは再現しきれない重低音の臨場感を振動で再現 50Wハイパワー振動ユニット ボディソニック トランスデューサ ホームシアター 上海問屋 DN-82305 [★]

(うーん、実はこの製品、安価でパワーあってイチオシだったのですが、完売してしまいました…OEM元は新しい型を売ってるので、また上海問屋さんで扱ってほしい…)

接続設定

普通は例えば5.1ch環境のサブウーファーに追加して振動ユニットを付けたりする訳ですが、VR環境の為に多少配線を変えます。

  • 体験者はヘッドホンで音を聞く(適切な音量)
  • 振動ユニットは、なるべく大きく振動させる

と言うのが目指すところになります。 適当にPCの根本から分岐させて

1.ヘッドホン側は音量を小さく出来る様に
2.振動ユニット側は音量を大きく出来る様に

しています。以下に雑な配線例を図示します

f:id:izm_11:20141013214856p:plain

展示で使う際のノウハウ

  • 例示したLepai LP-168HAはサブウーファーのカットオフ周波数フィルタが効かないので、人の話し声とかでもブルブル震えてしまう。もっと良い選択肢があるはず。
  • 椅子は座面のクッション性が良いと、振動を吸収してしまう。今回は小学校の椅子と言う、座面が木の板で、直接振動が届くような物を使っています。
  • 背もたれより座面に設置する方が効果が高い。
  • 家でデバッグする時、階下の住人に怒られないようにする。

大事なこと

振動ユニットは、乗り物系コンテンツなら、ポン付けノンコーディングで「没入感を足す」(正確には「ただの椅子に座ってる感覚を打ち消す」)という効果があります。

例えばOculusのジェットコースターデモの風を足す時、「速度に応じた風量の変化がない」「風量が現実より少ない小さな扇風機」であっても、結構効果がありました。つまりこの手の視覚や聴覚以外の感覚は多少いい加減でも結構ちゃんと効果があります(そこから完全再現するまでは、凄く大変ですが)

どんどん変なデバイスとか使って遊んでいきましょう!