OpenAppLab センサーコース
KINECT
Mixed Reality
一般社団法人T.M.C.N / 株式会社システムフレンド
前本 知志
・システムフレンドという会社でセンサー&デバイス部長やってます!
KINECT等のセンサーを使ったアプリ(イベント用コンテンツ、医療ヘルスケア系)
スマフォのARアプリ(最近はやりのぬり絵してキャラに取り込めるやつとか)
を作っています。
http://www.systemfriend.co.jp/kinect_nui
・エアー書道では何度かテレビ出演をしています
2013年1月6日 東京MX TV 「Tokyo, Boy」 新年スペシャル
2013年8月26日 日本テレビ 「NEWS ZERO」 などなど。
・TMCN (Tokyo MotionControl Network) Co-founder(理事)
https://www.facebook.com/TokyoMotioncontrolNetwork
自己紹介
こういうのを作ってます。
https://youtu.be/ZSXwhj8HqkE
https://youtu.be/YxCGnmfChKk
書籍執筆
https://www.shoeisha.co.jp/book/detail/9784798139630
Intel RealSense SDK
センサープログラミング
2015/5/12発売
中村 薫, 前本 知志, 斎藤 裕佑,
谷口 直嗣, 初音 玲
(Tokyo MotionControl Network)
2016/01/23 update
RealSenseハッカソンで優勝しました。
RealSenseでMRしました。
http://www.systemfriend.co.jp/node/687
このセッションのながれ
1
• Mixed Reality(MR)とは
2
• KINECT-MR実現へのステップ
3
• KINECT-MR GPU処理について
Mixed Reality(MR)とは
複合現実
(ふくごうげんじつ、英: Mixed Reality、MR)
とは、現実空間と仮想空間を混合し、現実のモ
ノと仮想的なモノがリアルタイムで影響しあう
新たな空間を構築する技術全般を指す。複合現
実感とも。
拡張現実と拡張仮想を包含する概念である。
空間的整合性、時間的整合性、光学的整合性な
ど実空間と合致させる要素によって、その性質
が評価される。
Wikipediaより
AR : Augumented Reality
現実世界の上に仮想世界(CG)を上書きする。
現実世界の映像上にCGを重ね合わせる。
映像の表示優先度は常に 現実世界<CG
Screen
High layer
AR の例
VR : Virtual Reality
現実世界からの情報を100%カットし、仮想世界(CG)に没
入する。
現実世界の映像、自分の手などの物体をセンシングして
融合する場合もCGオブジェクトとしてそれらが登場する。
映像の表示比率は常に 現実世界:CG = 0:100
Screen
Separate
CG World
Include
VR の例
MR : Mixed Reality
現実世界と仮想世界(CG)を融合する。
融合結果の前後関係を反映した状態の映像が創り出され
る。
MRを実現するためには現実世界の3Dスキャンが必要と
なる。
Screen
+
MR World
CG World
Real World
MR の例
KINECT-MR
実現へのステップ
with Unity3D
KINECTでのMR(きゃらみらー)
• KINECTのColorとDepthを利用してMR映像をリア
ルタイムに生成する
• KINECTを頭に装着し、MR映像をHMDに入力す
れば動き回れないHoloLensになる状態
STEP.1 座標系を合わせる
• KINECTの3D座標系(メートル座標系)
とUnity座標系と対応させる
(Unity内の1単位=1メートルと考える)
X
Y Z
1メートル
↓
1Unity
STEP.2 二つの世界のカメラを同期
• リアル世界のKINECTの設置高と注視点、Unity
内のMainCameraのY位置と注視点を合わせる
0.8m
0.5m
4.0m
0.8
4.0
0.5
=
STEP.2 二つの世界のカメラを同期
「きゃらみらー」では、、
• 初期状態でMainCameraは(0,0,0)にある
• KINECTのBodyFrame.FloorClipPlane.Wが床に対する
KINECTの高さを表すのでY位置を自動同期する
• MainCameraは(0,Y,0)から(0,1,4)を見つめるように傾
きを自動設定する。
• KINECTのカメラが見つめる位置を4メートル先の床
上空1メートルになるように手動調整する
(KINECTのチルトをAPIで制御できれば自動ででき
たのに…)
STEP.3 二つの世界の映像を重ねる
弊社開発風景
STEP.3 二つの世界の映像を重ねる
「きゃらみらー」では、、
• MainCameraと別にKINECTのカラー映像だけを
取得するSubCamera(Projection=Orthographic)
を用意している
• SubCameraの映像をMainCameraの無限大に遠方
にある背景映像として合成。
• 理由:MainCameraのProjectionはPerspectiveで遠
近法が適用されるため同一カメラで2D映像を
表示させたPlane等をとらえる手法では周辺部
が歪んで位置が合わなくなるため
ここはいろんなやり方があるので後述
するShaderで吸収することもできる
KINECT-MR
GPU処理について
リアルとバーチャルの
重なりを計算する
• KINECTのDepthとCGのZバッファをGPUで高速に
比較し物体の前後関係を判定し表示する
GPUでの処理
• 基本的にはこんなに簡単
if (KINECTのDepth<CGのZバッファ)
{
return KINECTのColor;
}
else
{
return CGのピクセル
}
CGのZバッファ(_CameraDepthTexture)からはスクリーン座標をキーにして
アクセスします。詳しくは調べてみてください^^
だが言うは易し…
発生する課題
• スムーズな体験をするためには秒間30フレーム
を下回らない処理スピードを保持する
• メインメモリ→GPU転送は低速だが、下記は転
送しなければならない
1. RGBカラー映像(1920x1080 Full-Color Full-HD)
2. KINECTのDepthデータ(512×424)
3. RGBとDepthのマッピングデータ(1920x1080 )
• Zバッファに書き込みをしないshaderを使って
いるオブジェクトやパーティクルは表示されな
くなる
だが言うは易し…
「きゃらみらー」では、、
• メインメモリ→GPUへのデータ転送を数フレー
ムに渡って分割したり、送る頻度を展示中でも
リアルタイムに調整できる
→少々送るのがずれても体験として気にならな
いものを見極め、この処理の対象とする
• パーティクルについては専用の表示レイヤーを
設けて表示されるようにしている。
その代わりパーティクルについてはMRでなく
AR表示となるがあまり気にならない感じ
最後に
ぜひがんばってHoloLensが出る前にこれを作っ
てください!

KINECT Mixed Reality