書籍転載:Intel RealSense SDKセンサープログラミング(3)
RealSense SDK Unity ToolkitによるUnityアプリ開発の基礎
― Chapter 8 Unityで作る「ゲーム/ノンゲーム」アプリケーション ―
インテル RealSense SDK Unity Toolkitの概要と、それがUnity向けに用意している各種機能を紹介する。
前々回と前回は、インテル RealSenseテクノロジーの概要を紹介しました。今回からは、インテル RealSenseの活用方法がイメージしやすくなるよう、実際のサンプルアプリ開発を紹介します。
書籍転載について
本コーナーは、翔泳社発行の書籍『Intel RealSense SDKセンサープログラミング』の中から、特にBuild Insiderの読者に有用だと考えられる項目を編集部が選び、同社の許可を得て転載したものです。
『Intel RealSense SDKセンサープログラミング』の詳細や購入は翔泳社のサイトや目次ページをご覧ください。プログラムのダウンロードも、翔泳社のサイトから行えます。
ご注意
本記事は、書籍の内容を改変することなく、そのまま転載したものです。このため用字用語の統一ルールなどはBuild Insiderのそれとは一致しません。あらかじめご了承ください。
■
本章ではUnityを使って作成するアプリケーションの例を紹介します。どのようにしてインテル RealSenseテクノロジーの機能が使えるか、参考にしてください。
8-1 SDK Unity Toolkit
インテル RealSense SDKでは、Unityから簡単に利用できるようにUnityパッケージ形式でツールキット「SDK Unity Toolkit」が提供されています。まず、このツールキットについて、解説します。
8-1-1 SDK Unity Toolkitについて
「SDK Unity Toolkit」はUnityアプリケーション構築の際にインテル RealSense SDKを少ないコーディングで手軽に利用できるように整備された便利なスクリプトやプレファブから構成されるユーティリティのセットです。SDK Unity Toolkitを利用すれば、簡単なアプリケーションはパーツをシーンに配置してプロパティを設定するだけで構築することができるので非常に優れたものだと筆者は感じています。ぜひ初心者の方もSDK Unity Toolkitを使って目に見えて動いてすぐ試せるアプリケーションを作って楽しんでみてください!
もちろんエキスパートな開発者であれば、SDK Unity ToolkitをベースにインテルReal Sense SDKのC# SDKを直接利用することができますので、高度な機能も余すところなく利用することが可能です。
>SDK Unity Toolkitの構造
SDK Unity Toolkitとインテル RealSense SDKの関係は図8.1のような階層構造になっています。SDK Unity Toolkit経由でSDK Unity C#のオブジェクトを取得できるので、開発者のスキルや知識に応じて柔軟な開発ができるようになっています。また、中間層のパッケージでPCまたはUnity Web Playerへ書き出したときの差異を吸収するようになっています。
- *1 「Unity Toolkit」より。
各中間層パッケージはC:\Program Files (x86)\Intel\RSSDK\framework\Unity
配下に配置されていますので、Unityにインポートして利用します。このとき、Unity Web Player用パッケージUnity.WebPlayer.unitypackage
をインポートすると大量のコンパイルエラーが発生しますが、これはPC用のライブラリとの重複部分があることが原因です。Assets\Plugins.Managed\libpxcclr.unity.dll
を手動削除すれば解決することができます。
>SDK Unity Toolkitの構成要素
SDK Unity Toolkitは表8.1の4つの構成要素からなっています。とくに「Action」「Trigger」「Rule」は、それぞれ図8.2のように関係しています。
要素 | 説明 |
---|---|
Prefab | Prefabは、あらかじめインテル RealSense SDKの機能が実装済みですぐに利用できる部品。例えばカラー画像を表示するImageやデバッグ表示をしてくれるDebug Viewerなど便利なものが用意されている |
Action | Actionはシーン内のGameObjectに対する特定の動作を表す。例えば「移動させる」ならTranslation Action、「回転させる」ならRotation ActionといったActionがあらかじめ用意されている。 ActionはTriggerから発動される。Actionは種類によって固定のTriggerが設定されているものと、任意のTriggerを追加して利用できるものがある |
Trigger | Triggerはセンサーが検知する何らかユーザーの動作やイベントを表す。Triggerは種類に応じて設定できるRuleの種類が決まっており、それらの中から選択して付与することで発動条件を指定する。例えば、一連の動作の開始から終了までを表すTrackingTrigger、回転動作を表すRotationTriggerなどが用意されている |
Rule | RuleはTriggerがどんな条件でActionを発動させるかという条件を表す。1つのTriggerには複数のRuleを設定することができ、どれか1つでもRule条件が満たされるとTriggerが発動する。例えばEventTriggerに付与できるHandClosed Ruleの場合は、 ・左右どちらの手を検知するのか? ・距離が近い手遠い手どちらを検知するのか? ・どの程度の閉じ具合で検知するのか?といった細かいルール設定をすることができる |
- スマイルレベルが50以上になってRule条件を満たしたらTriggerが発動!
- ActionがGameObjectを移動させる!
8-1-2 SDK Unity Toolkitのプレファブ
ここではSDK Unity Toolkitに用意されているプレファブ(Prefab)を簡単にご紹介します。シーンに配置するだけで使えるので、ぜひ試してみてください。
>Debug Viewer
Unityプロジェクトからインテル RealSense SDKやインテル RealSense 3Dカメラが正常に利用できるか簡単にテストすることができるプレファブです。深度(Depth)映像や手などの認識状況をリアルタイムに表示してくれます。
>Face tracking, Full Hand tracking-(left,right), Image, ImageSegmentation
顔のトラッキング(Face tracking)、手のトラッキング(Full Hand tracking-leftかRight)、カラー映像(Image)、背景抜きカラー映像(ImageSegmentation)をリアルタイムに表示してくれるプレファブです。
>PointCloudMesh
3Dスキャンを行って奥行情報からポリゴンメッシュ化した物体をリアルタイムに可視化してくれるプレファブです。PointCloudMaterial
プロパティを変更することで表面の色等の表現を変えることもできます。
>Sense AR
AR(Augmented Reality)アプリケーションを開発するために利用できる、現実世界を映し出すカメラと仮想世界を映し出すカメラ、2つのカメラを重ね合わせて画面表示を行ってくれるプレファブです。
8-1-3 SDK Unity ToolkitのAction
ここではSDK Unity Toolkitに用意されているActionの利用方法をご紹介します。
>Actionの追加
Actionの追加はUnityのメニューから行うことができます。ここではサンプルとして、手を閉じると立方体が消えるものを作ってみましょう。
まずは新規のシーンに光源としてDirection LightとCubeを1つ配置しましょう(図8.7)。CubeはMain Cameraから見える位置に配置します。この例では原点(Position:X=0, Y=0, Z=0)に配置しました。
Cubeを選択した状態でUnityの[RealSense Unity Toolkit]メニューから[Add Action]→[Hide]を選択します(図8.8)。
これでCubeにHideActionが追加されます。Inspectorビューを見ると、デフォルトでGesture DetectedのRuleが付与されており、ジェスチャーを認識したときにActionが発動するようになっています(図8.9)。
ではここでアプリケーションを実行してみましょう。ゲーム画面が表示されたら、カメラに向かって手を握ってください。右手でも左手でも構いません。
いかがでしょう。手を握った瞬間にCubeが消えましたね(図8.10)。
>Actionの追加
SDK Unity Toolkitには様々なActionが用意されています。表8.2は、主なActionの一覧です。
Action | 説明 |
---|---|
Hide | GameObjectをrenderer.enabled=falseとして非表示にする。デフォルトでは手を握ると実行される |
Translate | GameObjectの移動を行う。移動開始、移動、移動終了の3つのトリガーを設定可能。デフォルトでは手を握ると移動開始、握っている間移動を行い、手を開くと移動終了となる |
Rotation | GameObjectの回転を行う。回転開始、回転、回転終了の3つのトリガーを設定可能。デフォルトでは両手を握ると回転開始、両手を握って動かしている間回転を行い、両手を開くと回転終了となる |
Deactivate | GameObjectsプロパティに指定された対象GameObjectをActive=falseとして非アクティブにする。デフォルトでは手を握ると実行される。このActionはアタッチされたGameObject自身には影響を与えず、GameObjectsプロパティで指定されたGameObject群を処理対象とするので注意 |
Tracking | GameObjectの位置や回転方向をトリガーの認識に追従して変更する。追従開始、追従、追従終了の3つのトリガーを設定可能。デフォルトでは手を認識すると追従開始、手を認識している間追従を行い、手の認識が失われると追従終了となる |
Disable Behavior | GameObject内Behaviourをenabled=falseとしてコンポーネントを無効にする。デフォルトでは手を握ると実行される |
Show | GameObjectをrenderer.enabled=trueとして表示する。デフォルトでは手を握ると実行される |
Facial Animation | 表情の状態をGameObjectのブレンドシェイプへ反映しアニメーションさせる |
Scale | GameObjectの拡縮を変更する。拡縮開始、拡縮、拡縮終了の3つのトリガーを設定可能。デフォルトでは両手を握ると拡縮開始、両手を握って動かしている間拡縮を行い、両手を開くと拡縮終了となる |
Enable Behavior | GameObject内Behaviourをenabled=trueとしてコンポーネントを有効にする。デフォルトでは手を握ると実行される |
Activate | GameObjectsプロパティに指定された対象GameObjectをActive=trueとしてアクティブにする。デフォルトでは手を握ると実行される。このActionはアタッチされたGameObject自身には影響を与えず、GameObjectsプロパティで指定されたGameObject群を処理対象とするので注意 |
Send Message | トリガーが発動した時にFunctionNameプロパティで指定したUnity内でのメッセージを送信する。既存のActionでは実現できないカスタム処理をスクリプトで記述するケースなどで利用できる |
8-1-4 SDK Unity ToolkitのTrigerとRule
ここではSDK Unity Toolkitに用意されているTriggerとRuleの利用方法をご紹介します。
>TriggerとRuleの追加
TriggerはActionに追加して利用します。前項で紹介したサンプルに追加設定してみましょう。現在、CubeのAction設定は図8.11のように、手を握るとオブジェクトを非表示にするTriggerとRuleが設定されていますね。
では、追加でにっこりスマイルをしているときだけ顔でCubeを動かせるようにしてみましょう。Cubeを選択した状態でUnityの[RealSense Unity Toolkit]メニューより[Add Action]→[Tracking]を選択します(図8.12)。
TrackingActionが追加されました。デフォルトでは手の動きの認識に応じてオブジェクトを移動させるTriggerとRule設定があらかじめされています。
Inspectorビューを見ると、Actionの開始を表すStartEventのTriggerには手を認識したしたことを表すHandDetected
のRule、認識中を表すTracking SourceのTriggerには手の追跡を表すHandTracking
のRule、Actionの終了を表すStopEventのTriggerには手の認識を失ったことを表すHandLost
のRuleがあらかじめ付与されています(図8.13)。
では、認識開始を示すTrigger、StartEventに笑顔の認識Ruleを追加しましょう。Start Eventの[Add]ボタンをクリックすると追加できるRuleのリストが表示されますので、
[Facial Expression Detected]を選択します(図8.14)。
追加されたFacial Expression Detectedを展開すると、デフォルトで笑顔(EXPRESSION_ SMILE)がレベル30を超えたらTriggerを発動する条件が設定されていますのでこのまま利用しましょう(図8.15)。Hand DetectedのRuleは利用しないのでチェックを外しておきま
す。
同様の手順でTracking SourceにFace Tracking、Stop EventにFacial Expression Lostを追加しましょう。Hand系のRuleはチェックを外して無効とします。
設定を終えると図8.16のような設定となります。
ではここでアプリケーションを実行してみましょう。少しコミカルな動きになるので周囲の人の視線に気を付けつつ、カメラに向かってにっこり素敵なスマイルを作ってください。そしてそのまま顔を前後左右に動かしてみましょう。
いかがでしょう。顔の動きに合わせてCubeが移動しますね。また、スマイルをやめたり顔が認識されなくなるとCubeは移動を停止します。
もし、顔の動きとCubeの動きが合わない時は視点がずれているかもしれません。その場合はMain Cameraの向きや位置を調整してみてください。
動作がわかりやすいようにImageプレファブからImageオブジェクトを追加してみると、
図8.17のような感じとなります。
>TriggerとRuleの種類
SDK Unity Toolkitには様々なTriggerとRuleが用意されています。膨大な組み合わせがありますのでここではすべてを紹介しきれませんが、いろいろと組み合わせの設定を試して、どのような動きになるか試してみることをオススメします。
とても簡単にインタラクティブなアプリケーションが開発できることに気づかれるのではないかと思います。
■
次回は、インテル RealSense SDKとUnityを使ったサンプルアプリケーションを実際に作成してみます。
※以下では、本稿の前後を合わせて5回分(第1回~第5回)のみ表示しています。
連載の全タイトルを参照するには、[この記事の連載 INDEX]を参照してください。
1. インテル RealSenseテクノロジーとは? 構成要素/SDK/動作環境
インテル RealSenseテクノロジーが登場するまでの流れ、RealSenseの仕様やSDKの概要について紹介する。
3. 【現在、表示中】≫ RealSense SDK Unity ToolkitによるUnityアプリ開発の基礎
インテル RealSense SDK Unity Toolkitの概要と、それがUnity向けに用意している各種機能を紹介する。
5. WPF(Visual Studio)+RealSenseで作る表情感知アプリ
インテル RealSenseを活用したサンプルアプリケーション開発の第2弾として、Visual StudioとRealSenseを組み合わせる方法を紹介する。