凹みTips

C++、JavaScript、Unity、ガジェット等の Tips について雑多に書いています。

RealSense が届いたので Unity で出来ることなどを詳しく調べてみた

はじめに

RealSense 3D カメラの F200 が届きました。

f:id:hecomi:20150223220832j:plain

RealSense は Intel による NUI 用のセンサ・SDK を扱うブランド名で、顔分析、手指・ジェスチャー検出、音声認識、背景除去、AR などが可能です。この前身として本ブログでも紹介したことのある Perceptual Computing という名称がありましたが、こちらを改めた形となるようです。

確かに「パーセプチュアル・コンピューティング」は技術視点な名前な気がするので、「リアル・センス」の方が短くコンセプト的なので分かりやすい改名だな、と思いました。

個人的にはインタラクションデモでの利用を想定していることから、Unity での活用を主軸に据えて調査してみました。本エントリでは、その調べた内容を共有したいと思います。

デモ

以前の空間図形認識モジュールを利用して魔法を描いてみました。

手のトラッキングを利用しています。例としては微妙かもしれませんが、RealSense 部分に関してはノンコーディングで出来ます。

背景

CES 2014 にて公開され、その後にも GDC 2014 や IFA 2014、都内のイベント等で発表されています。

RealSense モジュールを搭載したカメラとしては 3 種類準備しているようです。

今回届いたフロント用カメラの F200 の他に、タブレット用の Snapshot やリアカメラ用の R200 があるようです。Snapshot に関しては、先月発売の DELL Venue 8 7000(Android タブレット)に搭載していて、カメラ撮影時にデプス画も保存することで、Lytro のようにリフォーカスしたり、長さの計測などが撮影後に出来るようです。

また、SDK 自体は昨年にリリースされており、総額 100 万ドルの賞金のかかった App Challenge も行われていたようです。

未だ数は少ないですがアプリショーケースも公開されていて、いくつかのアプリを試すことが出来ます。

その他に RealSense でできることに関しては、Youtube にたくさん動画が上がっていますので、見ると何が出来そうなのか色々とつかめると思います。

スペック概要

見た目

F200 は PCSDK の頃のカメラ(Senz 3D)と同じく Creative 製で、Senz3D と比べると少し横に長いですが重さはそれほど変わりません。Leap Motion も並べて写真を撮ってみました。

f:id:hecomi:20150223221017j:plain

スペック

  • VGA(640x480 60fps) デプスカメ
    • 640x240 であれば 110 fps
    • 0.2 – 1.2 m の範囲
  • 1080p(30 fps) RGB カメラ
    • 848x480 以下は 60 fps

ラッキングについて

購入 / SDK のダウンロード / 開発に必要なスペック

購入

購入は以下から可能です。

価格は $99 で、送料は $24.81、総額 $123.81 で、Paypal で決済しました。キャンセルされていると勘違いして 2 個購入してしまったのですが、2個目は 2/3 に注文し、不在票が 2/20 に投函されていたので、2 週間ちょっとで届いた形になります。

必要マシンスペック

必要なスペックとしては、第4世代(Haswell)以降のインテル Core プロセッサ搭載の Windows 8.1 64bit PC が必要で、USB 3.0 ポートが必要です。また、Unity での開発には Pro 版が必要です。

SDKのダウンロード

SDK はこちらからダウンロードできます*1

ポチポチと進めていけば大丈夫ですが、1点、音声認識用に日本語用の辞書をチェックして入れておくことをおすすめします。

f:id:hecomi:20150223223313p:plain

これとは別に「F200 Depth Camera Manager」もダウンロード、インストールします。これをインストールしないと、デプス画が取得できません。

f:id:hecomi:20150223232738p:plain

サンプルの実行

Capture Viewer を起動すると、利用できるストリーム一覧が表示されます。

f:id:hecomi:20150224005921p:plain

Depth 640x240 110fps とか IR 640x480 300fps とかスゴイものたちも見えます。デプス画はこんな感じです。

f:id:hecomi:20150224010858p:plain

Intel RealSense SDK Sample Browser を起動すると、様々な言語のサンプルを試すことが出来ます。Unity のサンプルも含まれており、起動すると Unity のプロジェクトが立ち上がって動作させることが出来ます。以下は一例です。

FF がついたものが Front-Facing、前面カメラ用で、RF がついたものが Rear-Facing、背面カメラ用、DF がついたものが Dual-Facing で両面対応のサンプルになります。ここでは RF が

SDK の概要

概要

f:id:hecomi:20150223224914p:plain

SDK の構成としては、I/O や マルチモーダルな NUI 認識アルゴリズムのレイヤが最下層にあり、その上に C++ による SDK のインターフェースレイヤがあります。ユーザは、この SDK のレイヤを直接触るか、別の言語へのバインディングを通じて利用する形になります。

Unity の場合は、Web Player も考慮して、更に一層レイヤが積まれています。

f:id:hecomi:20150223225944p:plain f:id:hecomi:20150223230112p:plain

Web Player では Native プラグインの利用ができないので、JavaScript と同様にサーバ・クライアント方式で情報を取ってくるようです。Leap Motion とかと同じ一般的な方法ですね。

インターフェースには接頭辞として PXC[M] がついています。PXC はおそらく Perceptual(PX) Computing(C) の略で、M は Managed です。

f:id:hecomi:20150223225300p:plain

なお、デプスを利用しない一部の機能(顔検出や音声認識)については、F200 を持っていなくても利用できるようです。このアーキテクチャならプロ版じゃなくても出来そうですが...。

Unity Toolkit

上記の一層積まれたレイヤは、Unity Toolkit という層になっていて、Unity の Editor スクリプトの力を借りて RealSense SDK を簡単に扱えるようにした Script / Prefab 群になります。これについては後述します。

.unitypackage の場所

Unity Toolkit は、RealSense SDK をインストールしたディレクトリ下の RSSDK\framework\Unity にある RSUnityToolkit.unitypackage をインポートすることで自分のプロジェクトに加える事が出来ます。ここには Sample Browser で見た Unity のサンプルシーンが一通り含まれています。

なお、同ディレクトリにある Unity.PCStandalone.unitypackage は Unity Toolkit やサンプルを除いた C# バインディングの DLL(Native および Managed)、Unity.WebPlayer.unitypackage は Web Player 用の DLL(Managed)が含まれたパッケージになります。試してないですが、Web Player 用のパッケージを使えば Pro 版じゃなくても出来るかも...。

Unity でアプリを作ってみる

ではいよいよ Unity でのアプリを作成してみます。

Unity Toolkit の利用

Unity Toolkit は先述のように、最小限のコードのみで RealSense の機能を利用可能にできるよう、Unity のエディタ拡張を利用して便利にした Script / Prefab 群になります。Actions Triggerというものが用意されており、Trigger が手を検出した、トラッキングしてる、顔をロストした、みたいなイベントで、Actions がその結果として、GameObject を Active にしたり、動かしたりといったことをするものになります。Actions がスクリプト単位で分かれていて、ここにエディタ拡張で作られたメニューを通じてポチポチと Trigger と、その中に記述する Rule を設定していく形になります。

例えば、手のトラッキングのサンプル(Full Hand tracking-right Prefab)を見てみます。

f:id:hecomi:20150225005637p:plain

ルート要素には Activate ActionDeativate Action という Action がアタッチされています。これはその名の通り Trigger に応じて指定したオブジェクトの表示 / 非表示を担当するもので、Activate Action では Hand Detected Trigger によって hands joint を表示し、Deativate Action では Hand Lost Trigger で hands joint を非表示にするよう指定されています。Trigger の中を見ると、例えば Activate Action では、Which HandACCESS_ORDER_RIGHT_HANDS と右手が指定されており、Hand Index で 0 となっているので、最初の右手を見つけたら、という Rule が設定されています。

なんとなく掴めたと思いますので、同様に指のトラッキングを見てみます。

f:id:hecomi:20150225011748p:plain

Tracking Action という Continuous Action が設定されています。Continuous Action には Start Event / Process / Stop Event の 3 種類の Trigger を設定する形になっていて、Start Event が起きたら Stop Event が起きるまで Process が周る形になります。ここでは近距離-遠距離間で(どこでも良いので)手が見つかったら開始して、ロストしたら終了する、という Trigger が設定されていて、 Process では Tracked Joint で指定した指の部位に応じて Transform を変化させる形になっています。すべての指にこれを設定することで手のひらが作れる、という形になっているわけですね。

なお、Tracking Action では Hand TrackingFace TrackingObject Tracing がプルダウンリストから選択でき、それぞれインスペクタの項目が変化します。

他にも色々な Action があるのでサンプルを見たり試してみると色々と遊べると思います。

f:id:hecomi:20150225025202p:plain

C# バインディングの利用

Unity Toolkit はおそらく好き嫌いがありそうだな、と思います(個人的にはゴリゴリスクリプト書きたいのでイベントハンドラだけ出して欲しかった)。Unity Toolkit でできること以外に色々やりたい場合には、生の PXCMHogehoge を触れば可能です。例としては映像ソースを取ってくるといったことが挙げられますが、こちらに関しては Image Prefab にアタッチされている DrawImage.cs などを見てみると参考になると思います。より踏み込んだ詳細は Reference をご参照ください。

冒頭の魔法発射デモ

人差し指の Tip の Action / Trigger / Rule を流用して、以前公開した空間図形認識モジュールをそのオブジェクトへアタッチすると魔法が使えるようになります。これが冒頭のデモになります。

参考サイト

Unity を使った先行事例としては、中村 薫さんが Unity での利用方法による詳解や、Unity ちゃんの顔を自分の顔に同期させるデモを紹介されています。

別途ツイートをまとめてくださっている Togetter も参考になります。

所感

性能について

手のトラッキングに関して言えば Leap Motion の方が高速でロストしない印象ですが、こちらは正対した状態や障害物が近くにあってもトラッキングができるので、有利な面も多いと思います。あと辺なステートに入り込まない感じもします。

f:id:hecomi:20150225002058p:plain

代わりにトラッキングは結構遅い感じがしました。速い動きに対して追従性が良くないので、軌跡を利用するようなアプリケーションに使うのは難しそうです。冒頭のデモでは結構重くフィルタをかけています。

デプスに関しては Kinect v2 の方が綺麗なのと遠距離も可能ですが、かなり近接させても平気なので、小さいものの 3D スキャンや、小さな変化を追うような用途には向いてそうです(レゴも認識できそうでした)。

音声認識音声合成、顔の詳細なトラッキング、Metaio を使った AR や物体認識も SDK で使えるので、マルチモーダルなインタラクションデモを作成する、といった点では良さそうです。

その他

Alienware 17 の昨年モデルを使っているのですが、相性が悪いのか、なかなか接続がうまく行かず苦労しました...(未だに未解決)。RGB 画は安定して取れるのですが、IR やデプス画を撮ろうとすると接続が切断される、といった現象です。ワークアラウンドとしては、タスクマネージャから RealSenseDCM.exe(Depth Camera Manager)を Kill したり、FF_HandsViewer.exe とかが動きやすいので、これをまず起動させて止めてから、Unity に移るとやると安定しました(謎)。

おわりに

これだけのセンサ・SDK が 1 万円ちょっとで利用できるのは本当にすごいと思います。今回紹介できなかったオブジェクト認識周りや音声認識も組み合わせて、研究からゲームまで色々な用途に使えると思います。ただ一方で、マルチモーダルなインタラクション設計は相当難しいと思いますので、果たして生活を便利にするようなインターフェースにつながるかは、まだ若干懐疑的です。色々な人がアイディアを出しあって活発に議論されて、いろんな使い道が発掘されたら良いなと思いますので、興味のある方で未購入の方は是非買って試してみてください。

*1:会社情報などの入力が必要です(私は個人としました)

Maya LT でローポリキャラクタモデリングに挑戦して Unity で動かしてみた

はじめに

前回のエントリ(Maya LT 2015 の勉強始めました - 凹みTips)では、Maya LT の基本的な使い方を勉強しました。そこで今回は 1 週間使ってローポリのキャラクタモデリング、および作成したモデル・アニメーションの Unity での利用に挑戦してみました。

デモ

出来上がって Unity で動かしてみたものがこちらになります。

自分で作ったモデルが動くとやっぱり感動しますね。

参考書

MAYA LT 3D‐CG キャラクター講座 (I・O BOOKS)

MAYA LT 3D‐CG キャラクター講座 (I・O BOOKS)

こちらの書籍の内容を参考に作業しました。「Maya LT」 の基本「2 頭身 3D-CG キャラ」を作るスキニング・モデリングの 3 章に分かれており、本エントリは 2 章の内容をやってみたものなります。なお、1 章、2 章については株式会社フーモア様のブログでも公開されています(後述)。書籍は白黒なのに対してブログの方はフルカラーなので、適宜ブログの方を参考にしながら作業しました(書いてある内容はほぼ同一です)。

Maya LT の基本的な知識を要求されるところもありますが、前回のエントリで紹介しました公式のチュートリアルの主要なところをやっておけば、特につまずくことなく作業出来ると思います(逆にやってないとちょっと厳しいかもしれないです)。

書籍の方では WEB では公開されていないスキニングモデルの章もあるので、こちらもやってみようと思います。

進捗の流れ

モデリング

まずはこちらを参考にしながらモデリングしてみました。

1点困ったのが、作業の途中で「インタラクティブ分割ツール」が必要になるのですが、こちらは Maya LT 2015 では廃されてしまい、マルチカットツールになってしまったようです。ただしメニューに表示されていないだけで、MEL からは直接実行することが出来るようです。

そこで、「ウィンドウ > 一般エディタ > スクリプトエディタ」で InteractiveSplitTool を実行するだけの MEL をポリゴンシェルフに登録したら便利になりました。

f:id:hecomi:20150209020335p:plain

f:id:hecomi:20150209020322p:plain

UV 展開・テクスチャ

次に UV 展開とテクスチャ作成をやってみました。

UV 展開はお手本通りにやるとびっくりするぐらい綺麗に出来ました。以前 Blender でキャラクタモデリングに挑戦した時の UV 展開の惨状が嘘のようです。

絵をペンタブで描くのは得意ではないので、テクスチャはイラレで作成しました。

f:id:hecomi:20150209021424p:plain

グラデーション、乗算、ぼかし、ドロップシャドウあたりで適当にやるとそれっぽくなる気がします。みなさんどんな風に作業しているんでしょうか。

リギング・アニメーション

そして、リギングとアニメーションです。

アニメーションは微調整で結構時間かかりました。あと、動かしてるとポリゴンが気になりだして、結構戻りながら作業してました。

1つのタイムラインにアニメーションを複数入れ込んで Unity で分割する方式で紹介されているのですが、そのままだと前後のアニメーションカーブと滑らかに接続されてしまう関係で、ループ付近でぎこちない動きになってしまいました。説明では言及されていませんでしたが、滑らかにするためにはアニメーションのグラフエディタでループ付近の接線を細かく調整したりする必要があるのかなと思います。

f:id:hecomi:20150209224140p:plain

Unity へのエクスポート

そして最後は Unity での作業です。

Maya LT 2015 では「Unity へ送信」機能が追加されているので、こちらを利用して Unity の Assets ディレクトリ下に直接保存しました(これによりポリゴン数制限がなくなります...、とはいっても今回はローポリなので関係無いですが)。詳しくは Autodesk 公式のチュートリアルをご参照ください。

作成したアニメーションは、FBX を Project ペーンで選択し、Character Import SettingsAnimations タブの Clips で直接フレームを指定して分割します。

f:id:hecomi:20150209231329p:plain

アニメーションを分割した後は Mecanim で簡単に制御できます。デモのものはこんな感じでやっています。

f:id:hecomi:20150209022715p:plain

完成モデル外観

最終的なポリゴンはこんな感じです。

f:id:hecomi:20150209022231p:plain

おわりに

思ったより可愛く出来て困惑しています...。

作りたいゲームの構想があるので、人間じゃないモンスターや簡単なオブジェクトとかも色々と試して見ながらゆるゆると作っていきたいなぁ、と思っています。あと余力があればスキニングモデリングの方もやってみたいと思います。

第2回おうちハック勉強会でキーノートトークしてきた

はじめに

本日、GARAGE秋葉原で行われた「おうちハック勉強会 #2」に参加して、キーノートトークで発表してきました。

みなさん各々作られたとても濃いものを発表されていて面白かったです。私は今まで作ってきたものの紹介と、その反省点や考察、それを踏まえて今月作ってみたものの紹介をしてきました。本エントリでは、その資料と、これまでとの差分の部分について書きます。

資料

内容について

過去のブログ記事についての詳細は以下になります。

サーバのコードはこちらです。

今回の差分としては「誤動作」と「即時性」の改善で、Android Wear を使った半自動化をしてみたのと、まとめて色々な機器を操作できる無線スイッチを作ってみました。

Android Wear との連携による半自動化

これまでは、自動化することで思わぬ動作をしてしまうことが多々ありました。例えば GPS 情報のノイズで家からいないことになり電気が消えたり、何も動いてないのに廊下の電気がついたり、寝る前に Google カレンダーに登録していた自動おやすみスケジュールが発火されて全部の電気やモニタが消えたりといった感じです。これを改善するために、いったんアクションを行うかどうか Android Wear へ通知し、違うアクションもできるよう選択肢を与えたり、登録されていないアクションは音声認識で行えるようにしました。

サーバ側で解釈したイベントに応じた情報(タイトルや背景画像、API の URL 等)を JSON につめて GCM 経由で Android へ通知し、NotificationCompat.WearableExtender にその情報をつめてレイアウトしてアクションを実行できるようにしています。

f:id:hecomi:20150202003541p:plain

動画ではトリガとして、ミクミンPさんのエントリで紹介されている TWE-Lite x リードスイッチによる開閉センサを玄関に設置して利用しています。

これによってドアを開けた瞬間にほぼ瞬時に情報が飛んでくるようになりました(GCM からの遅延がなければ)。Android Wear 通知用のコードはまだ整理してないですが以下になります。

ぶっちゃけ帰ってきた / でかけるタイミングでないと Android Wear をつけていないので、PC やその他の機器にも同じように通知が来てアクション出来るようにしようと思います。

無線スイッチの作成

同じく TWE-Lite を使って無線スイッチも作ってみました。

f:id:hecomi:20150131172340j:plain

ちょっとまだ見た目がアレな感じですが、ベッド脇には全ての電気・モニタを消したり部屋の電気をつけれるスイッチを、パソコンの前にはデュアルモニタの ON/OFF が出来るスイッチを、玄関には全ての家電をオフにしたり帰ってきた時に一連の電気やモニタをつけるスイッチをとりつけています。地味ですがかなり便利です。やっぱりスイッチは間違うことのない安心感があってイイですね。

両方共まだ作ったばかりで実際に生活してどうなのかというところは、また追々ご報告できればと思います。

おわりに

みなさんの LT がとてもおもしろくて刺激を受けました。Slack で色々垂れ流すのは便利そうなので真似してみようと思います。あと物理的に動くものがあると良いので今年は何か作りたいです。

おうちハックは色々な技能が身について、実際に生活も便利になったり面白くなったりして、かつ共有もしやすいとても面白いテーマだと思うので、継続して色々とやっていきたいと思います。

最後になりましたが、素晴らしい会を開催してくださった大和田さん、湯村さん、ありがとうございました!