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

RICOH THETA Sの動画機能を4k相当に拡張する(waifu 2x で)

概要

RICOHのTHETA Sは1920 x 960 30FPS(29.97)のEquirectangular形式のmp4動画を作ることが出来ます。素晴らしい!

しかし、この動画をHMDやパノラマビューアーで見てみると、「動画の解像度やビットレートがもっと高かったらなあ」と思うときもあります。
そこで、今年話題になった良い感じの超解像ソフトであるwaifu 2x を使って、擬似的に4k動画を生成してみようという試みです。

結論から言うと、多少時間は掛かりますが思った以上の効果を発揮するので、お気に入りのTHETAで撮った動画はアップスケーリング版を作りたくなりそうです。

作り方

waifu2x-caffeが 2015/7のバージョンから実写にも対応しました(すごい)

機械学習を利用した画像の高品質拡大ツール「waifu2x-caffe」が実写にも対応 
http://www.forest.impress.co.jp/docs/news/20150702_709790.html

しかもGUI版であっても、フォルダ内の静止画を一括変換できます(かなりすごい)

なので、今回はwaifu2x-caffeを使います。

作り方としては ffmpegでthetaの動画を静止画連番に書き出して、waifu2x-caffeに突っ込んで3840x1920にして再度ffmpegで結合する という流れです。これだけで分かった人は結論まで読み飛ばして問題ありません。

以下、入力をinput.mp4として、最終出力をoutput.mp4とします。

1.動画を音声と静止画連番に分離

ffmpegを使います。

Zeranoe FFmpeg - Builds http://ffmpeg.zeranoe.com/builds/win64/static/
からffmpeg-20151227-git-baf4c48-win64-static.7zを使いました(最近のバージョンなら他でも良いと思います)

音声を分離

ffmpeg -i "input.mp4" -vn "output.wav"

静止画連番ファイルをなるべく高画質に出力 (ffmepgのデフォルトjpeg切り出し、画質悪い…)

ffmpeg -i "input.mp4" -f image2 -vcodec mjpeg -qscale 1 -qmin 1 -qmax 1 img_%07d.jpg

2.waifu2x-caffeで連番静止画を拡大

waifu2x-caffeはこちら github.com

windows用実行ファイルの直接リンクはこちら https://github.com/lltcggie/waifu2x-caffe/releases/download/1.1.1/waifu2x-caffe.zip

GUI版で行うなら f:id:izm_11:20151231101845j:plain

こんな感じです。フォルダ単位で指定するのと、photoモードを選ぶのが肝心ですね。
仮に今回は .\res\以下に img000000.pngからimg000001.png img000002.png…という連番pngを出力することにしましょう。

処理速度としてはMaxwellGeforce GTX860M で大体一枚あたり6秒くらいでした。
一分あたり10枚のpngが処理できる感じです。めっちゃ不安になるくらいGPUファンが回ります。

1時間で20秒分のフレームが処理できるので、丸一日回して8分くらいですね!

3.ffmpegで再結合

エイっと結合します。

ffmpeg -r 29.97 -i .\res\img_%07d.png -i output.wav -s 3840x1920 -vcodec libx264 -b:v 50M .\res\output.mp4

このままガバっと2.で出力した連番pngと1.で分離した音声を合わせて4k動画をH264で生成します。
このくらいの解像度とビットレートで、手元のNexus 5(Android 5.1)でハードウェアデコード付きで再生出来ることを確認しました。

エンコードオプションは、ビットレートや2passなどの改善の余地がありそうです。詳しい人教えてください

これも良いかも(60Mbpsくらい)

ffmpeg -r 29.97 -i .\les\img_%07d.png -i output.wav -vcodec libx264 -pix_fmt yuv420p -crf 14 -preset veryfast -tune zerolatency,film -movflags +faststart .\les\output.mp4

結果

THETAのサイト内、公式動画サンプルで試してみました。 theta360.com

大体、解像度が足りないところがキュービックリニアっぽく補完されます。

http://izm.totheist.net/archive/theta_img/sample1.JPG

鉄塔付近や、ボーダー柄の服などのjpegノイズがうまいこと消えています。すごい。 http://izm.totheist.net/archive/theta_img/sample2.JPG

japanese karate(以下URLはリコーのサンプル動画への直接リンク)は、なぜかビットレートが5Mbps以下なので https://theta360.com/ja/gallery/sample/videos_s_3.mp4

こんな風に低ビットレート起因のjpegノイズが消えます。べんり。 http://izm.totheist.net/archive/theta_img/sample3.JPG

まともに4kパノラマを作るなら、ハードウェアが安いので10万くらい、ソフトウェアが安いので3万くらいするので、theta sだけでアプコン出来るのはコストメリットも、撮影の手間も少なくて良い感じです。

結論

  • waifu2x-caffeの超解像はphotoモードを使うと実写画像にも効果がある事を追試した
  • waifu2x-caffeの超解像はEquirectangular形式の画像でも効果がある事を確認した
  • 4k相当のパノラマ動画を安価に作れる可能性が出てきた
  • 各種動画サイトで配布されているパノラマ動画が低画質な時も、この方法で画質を向上させられる可能性が出てきた

  • いろいろ追試中です。意外と動画で確認したら、画質改善の効果を確認しにくいかも。そして、もしかしてRGBモードで非フォトの方が効果が分かりやすいかも…

参考URL

waifu2xでアニメをアップコンバートする - unsuitanの日記

ffmpegの使い方:tech.ckme.co.jp

最後に

私事ですが、引越しと転職を最近しまして、それに伴う出費により、食糧事情が悪化しております。 なにとぞ下記URLのウィッシュリストからご支援頂けると、めちゃくちゃ豪華なスパゲティを食べられます('-' *)

www.amazon.co.jp

OculusRiftを用いた就職活動

この記事に技術的な要素はありません。 この記事はOculus Rift Advent Calendar 2015 の2日目です。

qiita.com

1日目は @itachin さんのGearVR Coolerの話でした。

Gear VR Cooler! - VRの犬

続きを読む

RICOH THETA SのUnity上でライブビューパノラマ展開まとめ(メモ)

1.概要

前回のまとめ以降、ようやく触る時間と機材が出来たのでUnity上でTHETA SのHDMI Liveviewを追試しました。

イメージとしては凹みさんの

tips.hecomi.com

です。

  • THETA Sの取得できる画像、動画フォーマット一覧
  • HDMIキャプチャ方式のハードウェア紹介
  • Unity上でのHDMIキャプチャ経由の動画読み込み方法
  • Unity上での Dual Fish Eye → Equirectangular変換

みたいな内容です。

2.THETA Sの取得できる画像、動画フォーマット一覧

こんなイメージです。 f:id:izm_11:20151105014235j:plain 今回はHDMI Dual FishEyeを使います。

非リアルタイム

  • 静止画 5376 x 2688 Equirectangular
  • 動画 1920 x960 Equirectangular

リアルタイム

  • Dual Fish Eye (HDMI 1920 x 1080 インタレース60FPS)
  • Dual Fish Eye (USB2.0 UVC 1280 x 720 30FPS)
  • Equirectangular (スティッチ済みライブビュー、THETA API 640x320 MJPEG ストリーム)

3.HDMIキャプチャ方式のハードウェア紹介

HDMIからのキャプチャボードは色々な種類があります。最近だとスプラトゥーンの録画などでも皆さま買われてますが、あれも使えます。 OSから見た時に

  1. UVC(Webカメラ)として見える物
  2. キャプチャボード(direct showフィルタ)で見える物

という2種類の物が今回は使えます。 市場に出ているのは殆どすべてが2.です。

a.UVC-HDMIキャプチャボード Febon198(今回の秘密兵器!)

以下の2個をセットで買いましょう!

Febon198 www.amazon.co.jp

HDMI Signal Converter

www.banggood.com

Febopn198は OSからはUSB3.0の1080Pで60FPSなWebカメラとして見える、遅延は50-80ms程度(*1)、というトンデモないスペックの一品です。

デメリットは

などです。

Febon198はプログレッシブ信号しか受け付けないので、THETA含むデジカメからのインタレースな1080iなHDMI信号を読ませるには

HDMI Signal ConverterみたいにHDMI信号をなんでも1080Pに変換してくれるオモチャボードを通しましょう。

PCモニタ出力やXBOXの出力は1080Pなので、そういうのをキャプチャするだけならオモチャボードは不要なのですが、デジカメからの信号はインタレースが多いようです。ご注意ください。

セットで買わないと、こんな風に寝込む羽目になります。

b. 定番:BlackMagic Intensity Shuttle

ご存じ定番のBlackMagic!
なんでも読めるし、SDKも公式配布でフレームごとガバっと持ってこれて最高です。

www.amazon.co.jp

これを使えば大体のHDMI信号は読めます。ド定番!最高!!

b. その他キャプチャボード

遅延が大きいハズレもあったりする印象。2万円程度?

TL見てて動いたという話があるのはGC550など

www.amazon.co.jp

4.Unity上でのHDMIキャプチャ経由の動画読み込み方法

a. UVCキャプチャボード

Unity標準のWebCamTextureを開いて再生するだけです! こんな感じのスクリプトを、適当にUnityのPlaneにアタッチします。 Thetaの再生用 · GitHub

b. DirectShowフィルタキャプチャボード

ここが結構大変な印象です。

BlackMagic系や、一般的なキャプチャボードなら AVPro Live Camera

https://www.assetstore.unity3d.com/jp/#!/content/3683 を使えば大丈夫だと思います。トライアル版で必ず事前に動作は確認してください。

尚、このアセットですが 200ドル と、比較的お高いです

(だからこそFebon 198を今回お勧めしてます。こっちは読むのタダですからね!) (他に安価な手段があるかもしれません。情報お待ちしてます!)

5.Unity上での Dual Fish Eye → Equirectangular変換

凹みさんの方法(前述)と

Stereoarts(Noraさん )の方法があります。 Stereoarts Homepage (Theta Shader Pack)

今回は後者のNoraさんのTheta Shader Packを試しました。

手順を念のため録画しました。一発撮りです。

www.youtube.com

Theta shader Packと、このスクリプトで作業しました。(部屋が散らかっていてお恥ずかしい) Thetaの再生用 · GitHub

Unity上でビルドしたexeを動作確認用に置いておきます。 Febon 198か、USB接続のLiveviewモードなら、再生できると思います。 https://copy.com/L6wAq9dYdIOrIHp1

6.今後やりたいこと

生放送時のパノラマ配信インフラがどこかにないかなあと気になってます。ちゃんとした法人契約じゃなくても、個人でちょろっと試せる場があると嬉しいです。

補足

HDMIキャプチャボード越しの遅延チェック

*1:本家スペック表による。 Thetaでの遅延はこんな感じで測ると200-300ms程度です。どうやらThetaの絵を読み込んでHDMIから出すまでは、100ms以上のタイムラグがあるようです。

THETA SのUSBライブビューモードの認識手順

USBケーブルをPCとつながずに 写真動画切り替えボタンを押しながら電源を入れる→LiveviewモードになってからPCにUSBケーブルを刺す

という順番です。意外と忘れがちです。

ライブビュー経由で見る時の画質劣化

Dual Fish Eyeの時の実効解像度から考えて

  • HDMI経由で130万画素相当
  • USB経由で50万画素相当

くらいまで欠落してます。1920x960のスティッチ済み動画と比べるとHDMI経由でも3-4割くらい落ちてる雰囲気です。

RICOH THETA S 発売したので、個人用メモ

概要

ついに念願の動画も取得できる安価で安心な全球カメラが出ました!

TL上ではハックが進んで有益情報も多いですが、twitter上の内容で散逸してしまうと勿体ないので、メモとして記載します。

Unity上で見る方法

tips.hecomi.com

USBキャプチャ(720P 15FPS)

UnityのWebCamTextureからそのまま読めたと思います。
後は上記凹みtipsさんの記事を確認すれば大丈夫そうです。

HDMIキャプチャ(1080P 30FPS)

まずハマりがちなのが、「Modeボタンを押しながら電源ONでLiveモード(HDMIパススルー)」を選んでやること。

BlackMagicのIntensityとかのキャプチャボードで良いやつを買って Blackmagic Design: Intensity

AVPro Live Camera(200ドル) https://www.assetstore.unity3d.com/jp/#!/content/3683

を買うと言うのが一番楽なようです。少しお高いですが、安心感があります。

この時の遅延は最小で200ms位?

また、directshow互換で絵を持ってくることが出来るキャプチャボードもあるので、

www.amazon.co.jp

これもwindows上だと何とかしやすそうです(2万円程度) ただ、WebcamTextureでは読めないはずなので、上記AVPro Live Cameraが必要?

個人的に安くて気になるのがUVC互換のUSB3.0-HDMIキャプチャボード

FEBON: FEBON198 USB3.0 UVC HDMI Grabber Card User Manual

www.youtube.com

このキャプチャスティックが額面通りの性能なら、OSからはUVC対応のwebカメラとして認識されるので、UnityからそのままWebCamTextureとして取得できる気がします。

USB,HDMI併用時の3脚固定方法

スマートな方法だとこれが良さそう?

これを買って上のプラ部分を外す感じで www.amazon.co.jp

「いかにも使えそう」な、これは各端子と微妙に干渉するので不適

www.amazon.co.jp

360度配信向け機材

適当なスマホ+Cerevo LiveShell + THETA Sが今のところ良さそう。

ケース

純正ケースがギッチギチで凄く機動性を損ないます。
(一日差し込んで伸ばすと大丈夫という意見もあり)

最高にお勧めのケースは現在絶賛売り切れ中みたいです

www.amazon.co.jp

その他tips

Blenderのスフィアマップ適用

パノラマ合成

長時間HDMIパススルーで使うには、USB給電にして1A以上出るモバイルブースターに繋ぐのも必要ですが、    その前に本体を満充電にしておく。そうしないと、充電の熱で10分くらいで映像が止まったりする…
(逆に、満充電にしてUSB給電モードで使うと30分は連続で動きました)

2015/8現在のOculusRift+UnityのノートPC対応 開発動作環境構築

概要

OculusRift CV1(コンシューマ向け)の発表も近づいてきたので、OculusVR社は自社OculusSDKやOculusRuntimeを積極的にアップデートしています。

また、最新版の各種ゲームエンジンでは組み込みでOculusRift対応を進めています。(UE4は前から、Unityは5.1から)

そんなタイミングですが、最新のOculusSDK0.7以降では動作未保証になってしまったOptimusノートPC+Unity5.1でOculusRiftDK2の動作環境を作ってみようと思います。 色々検討した結果、今回はExtendModeなら最低でも動きそうな0.5.0.1環境にします。

プログラマ向けの手順をこれから書いていくので、分かる人は読み飛ばして「最後にまとめ」だけ読んで頂ければと思います。

(主婦ゆに本の、Unity5対応版も購入者は手に入れられるはずなので、ご検討ください)

このエントリに書かれていない事

  • 最新のUnity5.1以降で導入されたUnityネイティブのVR support
  • OculusRuntime 0.7対応

準備する物(もしくは、動作環境)

UnityとOculusRuntime0.5.0.1はインストールしておいてください。 下の2個はダウンロードだけしておいてください。

環境構築

一発撮りで申し訳ないですが、Unity上での操作手順を動画で撮ってみました。 8分程度です。

www.youtube.com

上の動画で作った動作確認用exe

OculusRuntime 0.5で動作確認済みです。
このexeの価値は、Optimus環境でOculusConfigUtilityの机と椅子のデモ(Show demo scene)が、クラッシュする事が多いので、 Optimus機の方は、机と椅子のデモ代わりの普通の動作確認にお使いください。

https://copy.com/Y22DH1oo7bXSSvuB

最後にまとめ

  • Optimusノートで動かす可能性があるコンテンツは、現時点でSDK0.5.0.1で作るしかないので、その環境を作る
  • Unity5.1以降であっても、VR Supportを使わなければ、普通に OculusUnityIntegration.unitypackage をインポートできる
  • 0.5.0.1対応のOculusUnityIntegrationをUnity5.1で使う場合は、パッケージをインポート→自動のUnity5向け変換をした後に、Assets/OVR以下のスクリプト内で #if UNITY_5_0 という定義があるので、そこを UNITY_5_0 || UNITY_5_1 などに書き換える必要がある
  • Optimus機の場合は DirectToRift.exeを右クリックして、グラフィックプロセッサと共に実行→高パフォーマンス で起動する必要がある

UnityでまともなMovieTextureを作りたい

この記事は、調べものをした途中の過程を記録する物で、成果物がある訳ではありません。

概要

Unity上での動画再生は、歴史的な経緯によりデスクトップ版ではQuickTime Playerを用いた再生を行っています。
つまり、大雑把に言うと*.movファイルをムービーテクスチャとして使用できます。
しかしQuickTime Playerはイマドキの主流であるGPUデコードには消極的で、CPUデコードを行っています(調査不足の可能性有り、何らかの最適なエンコードを行えば可能?)

その為、例えば4k2kの60FPS動画を再生すると、いまどきのCPUが1コアフル占有してコマが落ちる、と言う状況です。

多くの場合は、動画解像度を下げたり、30FPSにすることで対処出来ますが、例えばOculusRift DK2(75Hz)で全周動画を再生する、と言うシチュエーションでは、非常に困ります。

これを何とかする為の定番の方法と、現在調査中の方法をまとめます。

定番の手法

UE4+Windowsの例

Windows Media Foundationを用いた動画のGPUデコードが実装されています。

Unity+モバイル端末の例

例えばAndroidならSoCに動画のGPUデコード機能が入っており、android.mediaplayerクラスを利用することで再生が行えます。
Unity用のandroidのネイティブプラグインを書いて、このmediaplayerクラスの再生中のバッファをGLのテクスチャにバインドする。という事を行えば、Exsonys7xxx番代やSnapdragon810などで4k2kの動画がコマ落ちなくUnity上で再生出来ます。
こういった処理は、UnityのアセットであるEasyMovieTexture(30ドル)を買うと、ネイティブプラグイン部分のソースコードも同梱されているので改造し放題です。

うーん、Androidって凄い…

Unity+Windowsの例

http://www.renderheads.com/portfolio/UnityAVProWindowsMedia/ というアセットを使うことで、GPUデコード機能付きの再生が行えます。また、このアセットは外部の動画ファイルの動的読み込みにも対応しているため、Unity製の動画プレーヤーを作るような用途にも使えます。素晴らしい!

ただし、このアセットが200ドルします。うーん…お高い… そして全然Unity標準のMovieTextureと作法が異なるので、例えばAndroidWindows両対応みたいな事をする時に、結構大変そうです。

今回の提案手法

NVIDIAのCUDA実装の動画のGPUデコードを利用して、直接DX11のテクスチャバッファに動画の絵を毎フレーム書き込むネイティブプラグインを作成したいです。

これは、上記UnityAVProの機能限定(そしてNVIDIA GPU限定)版になる代わりに、再生負荷が低く出来る予感がします。

OpenCV 3.0.0rc1 のソースやサンプルを見てみると (@dandelion1124 さん 超助かりました!教えてくれてありがとうございます) BUILD_opencv_cudacodecとWITH_NVCUVIDをONにしてOpenCVをビルドして

Cudaを使った動画再生 https://github.com/Itseez/opencv/blob/master/samples/gpu/video_reader.cpp DX11テクスチャへの書き込み https://github.com/Itseez/opencv/blob/master/samples/directx/d3d11_interop.cpp を組み合わせたネイティブプラグインを作成して

Unity側で TextureのGetNativeTexturePtrをプラグインに受け渡してやる http://docs.unity3d.com/ScriptReference/Texture.GetNativeTexturePtr.html

という感じで 、望む物が出来そうな気がします。

OpenCVを使っているのは、単純に全部入りで楽そうだなあ、と思っただけなので、CUDAとDX11を生で叩いても同じ事が出来ると思います。(ウーン、UnityがOpenGLモードだと、もっと簡単な気がします。OpenCVやCudaとOpenGL仲良いですしね。でもOculusRiftのSDKはDirectX11ネイティブ対応なので、今回はDX11ですねえ)

残念ながら直近でまとまった時間が取れ無さそうなので、ここまで調べた時点で力尽きてしまいました。

しかし、UnityのMovieTextureは、大いに改善の余地がありそうなので、例えばCUDAじゃなくてOpenCLを使って汎用的な動画のGPUデコードなどが出来るアセットとかが50ドルくらいで売ってたら、人気になりそうですね。

どなたか、作りませんか!と提案してこの記事は終わります。

追記:MP4デコーダをCUDAのSDK提供のまま使って、アセット作って売るぞ!と言う場合は、一度NVIDIAの人にお伺いを立てたほうが良さそうです。うーん、知財周りは大変・・・

Gear VR向けの全周動画コンテンツの作成と宣伝

概要

Oculus VR社とSamusung社の協業によって、Gear VRと言うOculus社の品質を満たす高性能なスマホスロットインHMDシステムが発売されています。
最近は日本のキャリアでも該当機種を扱う(Galaxy s6シリーズ)為、国内での入手性も良いです。

この Gear VR向けコンテンツを、実写パノラマ動画で作っています。そのまま流すだけならmediaplayerで行けますが、選択肢で分岐したりループ制御やエフェクトがあるコンテンツを作る場合はUnity等のゲームエンジンを用いるのが良いと思います。

参考までに、このエントリでは僕が今お手伝いしているチーム(コンテンツ)のワークフローについて説明します。今後同じような事をする方の参考になれば嬉しいです。

環境

  • GoPro 6台マウント
  • Autopano Video Pro
  • VFX(After Effects,Nuke)
  • Unity5.0.0p2
  • OculusMobileSDK5.0.1
  • EasyMovieTexture 1.30

太字で書いた物はUnityアセットです。Unityではモバイル向け環境でのMovieTextureをサポートしていません。
その為にAndroid上でUnityを使って全周動画を球のメッシュに張り付けて再生する、と言うコンテンツの場合は太字で書いたEasyMovieTextureの助けを借りる必要があります。

この辺りの作成手順やソフトウェアについてはユニティの中の人の @warapuri さんが詳しいです。

www.slideshare.net

ワークフロー上の問題

チームの簡単なワークフロー図は以下の通りです。僕はUnityチームとして参加しています。 f:id:izm_11:20150502140959j:plain 今回は、Gear VR上で出来るだけ高解像度の動画素材を使いたいので 2880x1440 (30FPS)のH264(5.0 High Profile)のmp4を使う、と言う事になりました。

この解像度とプロファイルのmp4は、UnityEditor上でプレビューが出来ませんでした。また、EasyMovieTextureを使ったシーンでは、 該当アセット内のスクリプトのプラットフォーム分岐 #if UNITY_EDITIOR の中身が空っぽだったので、上図で言う赤い矢印の、UnityEditor上でのプレビュー確認が出来ません。

毎回Gear VRにビルドして転送して確認すると言う、人道的ではない開発を行う羽目になるのは嫌なので、ちょっとした工夫をして楽をします。

エディタ拡張による改善

バッチエンコードエンジン

Unityのエディタ拡張で、ffmpegのプロジェクト専用フロントエンドを作成しました。 f:id:izm_11:20150502011659j:plain こんな感じのGUIで、吐き出すのは一番UnityEditor上で負荷が低く、再インポートが速い theora(*.ogv)形式です。

EasyMovieTextureの書き換え

動画ファイルを扱うスクリプトの、空っぽだったUnityEditor上の処理を一通り書きました。
また、再生予定のファイルが例の巨大なmp4ファイルだった場合、自動的にパスを検索してエディタプレビュー用にバッチエンコードしたtheora形式の動画ファイルに動的に差し替える処理を追加しました。

この時、Movietextureを動的に読み込むために、theora形式の動画ファイルは /Assets/Resources以下に配置する必要があります。

また、HMD上でのプレビューについてはUnity 5.1以降だとVR previewが実装されるようです。
現状では拙作の OculusRiftDK2ExtendPreviewなどを併用することで、再生ボタンでDK2の見え方確認が出来ます。

neon-izm/OculusRiftDK2ExtendPreview · GitHub

f:id:izm_11:20150502231340j:plain

ビルドスクリプトの追加

/Assets/Resources以下と、/Assets/StreamingAssets以下のファイルは、Android向けに書き出すときに、基本的に全て転送されます。今回の様に大量の動画ファイルを含むプロジェクトでは、転送時間が最悪になります。
よって、こんな感じのPostProcessBuild.csをAssets/Editor以下に置きます。

using UnityEngine;
using System.Collections;
using UnityEditor;
using UnityEditor.Callbacks;


public class PostProcessBuild : MonoBehaviour {

    [PostProcessScene]
    public static void OnPostprocessScene()
    {
        if (EditorApplication.isPlayingOrWillChangePlaymode)
            return;
        
        // Move assets from Resources
        UnityEngine.Debug.Log(AssetDatabase.MoveAsset("Assets/Resources/TmpMovie", "Assets/TmpMovie"));
        AssetDatabase.Refresh();
    }

    [PostProcessBuildAttribute(1)]
    public static void OnPostprocessBuild(BuildTarget target, string pathToBuiltProject) {
        UnityEngine.Debug.Log(AssetDatabase.MoveAsset("Assets/TmpMovie","Assets/Resources/TmpMovie" ));
        AssetDatabase.Refresh();
    }
}
  • シーンビルド開始時に、theoraファイルが置いてあるフォルダを、別フォルダに移動する
  • ビルド中は/Assets/Resources 以下のサイズが少ないので速くビルドが完了する
  • ビルド後に、元の位置にファイルを戻す

という処理をしています。

ワークフロー改善の結果

Unityエディタ上で音やエフェクトの処理を確認した後に、Android向けに実機ビルドをする、と言う普通のゲームでは当たり前の手順が確立出来ました。
もし今回の様なコンテンツを、こういう工夫無しで作ろうと思うと結構大変だと思うので、同じようなコンテンツを作成したい方は、これらの点に留意しておくと快適だと思います。

最後に

僕がお手伝いしているチームGATE-Dは、現在OculusMobileVR Jamに参加しています。

vrjam.challengepost.com

また、MoguraVRさんに、コンテスト参加チーム紹介ページの一番上で、取り上げて頂きました。
ありがとうございます!

www.moguravr.com

5/11にコンテンツ提出締切と言うことで、チームは若干炎上していますが、鋭意頑張っております。

是非公開されたら、体験して頂けたら嬉しいです!以上宣伝でした。

Unity5PersonalでのOculusRift DK2環境構築

概要

Unity5から新たに加わったライセンス体系である、Unity5Personalライセンスは、従来のUnity4Pro相当の機能を無料で使うことが出来ます。

その為OculusRift DK2を用いたVRコンテンツも従来よりお手軽に作れるようになりました。

しかし現時点のOculusRift用SDK(以下OVRSDKと書きます)最新版であるOVRSDK0.4.4(Unity Integration)はUnity4.xとUnity5beta向けに開発されていた物で、Unity5正式版で使う時にライブラリのコードを修正する必要があります。

参考リンク:

qiita.com

このエントリでは、こういった修正をしなくても快適に動く環境を作成する手順を説明します。

環境

  • Windows8.1
  • Unity5.0.0f4 personal
  • OVRSDK0.4.4 + OvrMobileSDK0.4.3
  • OculusRuntime0.4.4

手順

  1. OculusRuntime0.4.4をインストール

  2. 通常通りUnityを起動してImportPackage→CustumPackage→OVRSDK0.4.4UnityIntegrationをインポート

  3. OvrmobileSDK0.4.3 Oculus Rift PC SDK, Samsung Gear VR Mobile SDK, Docs, Integrations | Oculus Developer Center をダウンロードして解凍→ovr_mobile_SDK0.4.3->VrUnity->UnityIntegrationのUnityIntegration.unityPackageを追加でインポート

以上です。

ProjectViewのAssets→OVR→Prefabsの中のプレハブが f:id:izm_11:20150316184333j:plain

上記画像のように、TrackingSpaceが追加されていれば、うまく上書き出来ています。

この後、LeftEyeAnchorとRightEyeAnchorのClearFlagsがSolidColorになってしまっているので、いつも通りのskyboxに変更しておきましょう

Unity5でOVRSDK0.4.4を使う場合の問題点

  1. ライブラリコードの修正が必要

  2. Monoscopic rendering(両目に同じ絵を映す)やPosition Trackingの有効無効を切り替えられない

  3. 十分なスペックのPCでもjadder(首を左右に振った時に絵がブレる)が発生する場合がある

と言う感じなので、現時点での最適なUnity5+OculusRift DK2向けの開発環境としては、このmobileSDKを併用するべきだと考えます。

テストバイナリ配布

一応Unity5でMonoscopic renderingやPosition Trackingの有効無効を確認できるバイナリを置いておきます。見え方の違いを確認したい時に使えるかもしれません。

https://copy.com/b242vKNyvIctRSXW

個人的にはMonoscopicでもPosition Trackingを有効にしていると、意外と立体に見える感じがして、楽しいです。

その他雑談

MonoscopicRenderingの良さ

Monoscopic renderingは両目に同じ絵を映すので、原理的に描画負荷を下げられます。なので例えば実写パノラマ動画を再生するようなコンテンツでは、これを使うとパフォーマンスが稼げて良いかもしれません。

また、低年齢(13歳以下)の人だと立体視の感覚が未発達なので、健康への影響を考えてOculusVR社は低年齢での使用を推奨していませんが、Monoscopic renderingであれば、そういった問題に対して別の結果が現れるかもしれません。興味深いです。

そして0.4.4以前では、Unity上でチェックボックスは有っても中身が実装されていなかったので、ようやく使えるようになって嬉しいです。

今回のネタ元

このOvrMobileSDK0.4.3を使うと良い、と言うアイディアは野生の男さん

野生の男 (@yasei_no_otoko) | Twitter

に教えてもらいました。感謝です。

Unity4.6ProでもOvrMobileSDK0.4.3を使ってPC向けビルド

@kaorun55さんが試してくださいました。

Unity4Proライセンスだけあれば、AndroidProライセンスは不要で使えます。 MonoscopicRenderingが必要であったり、最新の方が安心と言う方は検討ください。

余談

エントリ名はUnity5でもOculusしたい!と中二病でも恋がしたい!のパロディをしたかったのですが、ロゴを作っている最中に、これはもしやサムいのではないかと気付き、取り止めました。それにしてもモリサマーは可愛い…

PyCharmを使ってRaspberry Pi2上で快適リモートGPIOプログラミング

概要

せっかくRaspberry pi2も出て、モノノインターネットだとかフィジカルコンピューティングだとかユビキタス(これは死語?)も流行っているので、GPIO経由でセンサやサーボを使うプログラムを書きたいな、と思いました。
その際にPythonを使い、開発環境としてJetBrains社のPython IDEであるPyCharmを使って、普段使っているPCからリモート開発環境を作ってみました。
CUIモードのRaspberry pi2上で素のviで書くのもカッコイイとは思うのですが、入力補完等が親切な方が個人的には嬉しいです。
このエントリはその備忘録です。

多少覚えることはありますが、初心者がいきなりPythonをRaspberry pi上で書き始める、と言うのであればPyCharmは親切な環境であると思います。
他にもCPUが非力なLinuxが載る組み込み系ボード(BBB,Odroid)でも、同様に使えてIDEの恩恵を受けられるので、リモートは便利です!

続きを読む

OVRSDK0.4.4+Unityでのジャダーを防ぐビルド設定調査結果

概要

OculusRift DK2+UnityでOVRSDK0.4.4を使う時に、ビルド及び実行条件次第でジャダー(首を振った時に絵がガクガクする、凄く酔います)が起きる事がknown issueとなっています。

https://forums.oculus.com/viewtopic.php?f=37&t=18363

しかし、OVRSDK0.4.4+OculusRuntime0.4.4は現状では最もVRパフォーマンスが出る組み合わせでもあります(FPSが稼ぎやすい、遅延が短い)

よってこのエントリでは、VRコンテンツ製作者が上記環境で作る時に、どんなオプションでビルドすれば良いか、僕の調査結果を書きます。

先に結論

UnityEditorはDX9モードでもDX11モードでも良いので、BuildSettings→PlayerSettings→Other Settings→Use Direct3D11のチェックを必ず入れる事を推奨します。

f:id:izm_11:20150109005855p:plain

また、0.4.4環境では-force-d3dx9オプションは不要です。

検証環境

ソフトウェア

  • Unity4.5.5p5
  • Tuscany Demo
  • OVRSDK0.4.4
  • OculusRuntime 0.4.4

PC1(デスクトップ)

PC2(ラップトップ)

  • G-TUNE i420
  • Windows7pro(x64)
  • GeforceGTX860M+Intel HDGraphics4600(Optimusです)

制作環境

  • UnityDX11モード + DX11ビルド
  • UnityDX9モード + DX11ビルド
  • UnityDX9モード + DX9ビルド

検証手法

制作環境の3環境においてビルドしたexeを、PC1,PC2それぞれについて

  • -force-d3d9
  • -force-d3d11

オプションを付けて実行して「ジャダーの有無」「その他不具合」を目視確認。
また、いずれのPCでもTuscanyDemoが75FPS以上の速度で動くスペックです。

検証結果

緑のセルは問題なく動いた組み合わせです。赤いセルは問題があった組み合わせです。

f:id:izm_11:20150109010827p:plain

考察

  • DX9モードでビルドする意味は殆どない
  • 遥か昔はExtendModeだとUnityで作られたデモを遊ぶとき -force-d3dx9オプションを指定する必要があったが最新環境では不要。むしろ0.4.4環境ではジャダーを引き起こす可能性もある

Mastering the Oculus SDK日本語解説

このエントリはOculus Rift Advent Calendar 2014の12/14のエントリです。

Oculus Rift Advent Calendar 2014 - Qiita

明日12/15は @xxxxMakoto さんです!

概要

去る2014/9 にOculusVR社の主導で行われたOculusConnectと言うイベントで、いくつかの講演がありました。

その中でも、OculusSDKが何を目指して、何を実装して、将来はどんな機能を追加していくかと言う、一番ヘビーな(個人的には重要そうな)Mastering the Oculus SDKと言うプレゼンテーションがありました。

http://static.oculus.com/connect/slides/OculusConnect_Mastering_the_SDK.pdf

このエントリでは、上記講演の公開されているプレゼン資料について、和訳を書き、僕自身の感想や知見を加えた物を公開します。

ざっと80ページくらい+pdf(15MB)での公開です。内容は随時アップデートしていきたいと思っています。

資料の配布

こちらからDLください。[pdf] https://copy.com/trXEDBGAwcu9Kj6r

//本当はhtmlとか電子書籍的なフォーマットにしたかった…

また、googledocの生データが以下にあります。コメントを入れられるので分かりにくい点などあったら書いて頂くか

izm (@izm) | Twitter までお気軽にメンションくださいませ。

explain_Mastering_Oculus_SDK - Google ドキュメント

対象とした読者

VRに興味がある情報系の学部4年程度があれば問題なく読めると思います。

飛ばし飛ばしで読むか、じっくり読むかで変わりますが、後者だと概ね1時間程度の時間が掛かるかと思います。

なんでこんな物を書いたのか

OculusVR社というか、Palmarさんから日本はDK2の優先的な出荷先として認定されていて、日本の開発者に掛かる期待は大きいように思います。

なので、ちゃんとした資料を、英語が苦手な人でも読めるように整備出来たら、うれしいなあと思い、今回こんな感じに公開しました。

//Twitterに断片情報だけ書いていくと、どんどん有益な知見が流れてしまって勿体ないので、他の人も知見をドンドンまとめてほしいです!

著作権

本エントリで配布しているpdfの著作権全てOculusVR社に帰属します。

また、OculusVR社の公開しているpdfを勝手に使用している為、怒られたらごめんなさいをします。

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を被せると、スムーズな体験を提供できると思います。

プログラム上で出来る事

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