Post on 24-Jan-2017
OpenAppLab センサーコース
KINECTMixed 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 updateRealSenseハッカソンで優勝しました。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 WorldReal 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.8m0.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が出る前にこれを作ってください!