Skip to content

Leap Motionを使うLooking Glassアプリの開発について

注意:LEAPを使うならば、LEAPの大幅な性能強化となった"Orion"アップデートがリリースされているWindowsを選ぶのがベストです。

Orionは2013年以来ハードウェアが変わっていないLEAPを、ソフトウェアによって「ちょっと変わったデバイス」から「本当に素晴らしいデバイス」に変えてしまいました。多くの人にとって、当時から評判は今も変わっていません。

Mac版のSDK(V2)は、Orionが出てからアップデートされていないので、かなり古くなっています。

まず、以下のソフトウェアを準備してください。

LEAPはどのように機能しているのでしょうか?

KinectやRealSenseのようなデプスカメラとは異なり、LEAPは実際にはデプスマップを生成しません。

赤外線の発信機と受信機も使用していますが、これはコントラストの高い両手の映像を得るためです。

そして、読み取った映像を元にLEAPサービス(ランタイム)は驚くべきコンピューター・ビジョン・オペレーションにより手の骨が何をしているのかを把握し、LEAP unity SDKは問い合わせた追跡情報を元に、コライダ、メッシュ、ピンチ検出などの高レベルのタスクを処理します。

LEAPを使ってLooking Glassで何をするのがいいの?

最も簡単にして強力で飽きることのないLEAPの使用法は、リアルタイムスキャンされた「手」にコライダーを適用して物理シミュレーションで3DCGに干渉することでしょう。

ピンチ検出と、手に装着して出し入れできるコンテキストUIにより、(他の製品と比べって、もっと確実な、正確な)高度な操作が可能になります。

LEAP ランタイム

タスクトレイ内で実行中でない場合は、"Leap Motion Control Panel"プログラムを検索して起動します。

LEAPが検出されるとアイコンが緑色に変わり、ダブルクリックして「Leap Motionコントロールパネル」を開くことができます。

2013年からLeapを使っているなら(最適に動作していることを確認したいだけなら)、トラブルシューティングタブの「デバイスの再調整」を使うことをお勧めします。

バージョンを確認するには、 [バージョン情報] タブを使用します。

The LEAP SDK

[Looking Glass用Leap Motionサンプルシーン(以下ではLKG+LEAPサンプルと表記)をダウンロードすることを強くお勧めします。このシーンはLKG+LEAPの出発点として最適に設定されています。

Leap Motion Unity Core Assets(以下ではLEAP SDKと表記)に付属しているサンプルシーンの1つから始めることもできますが、ほとんどのシーンはVR向けに設定されており、必要のないものもあります。

すべてを一から設定しようとするのはトラブルの元です。

実行するには、LEAP SDK、HoloPlay Unity SDK、およびLKG+LEAPサンプルをすべて1つのUnityプロジェクトに読み込みます。(LKG+LEAPサンプルはいちばん最後に読み込んでください)

LEAP+LKGシーンを開きます。次のように表示されます。

leap and lkg

LeapServiceProvider/Controller

LEAP SDKの中心的なコンポーネントはLeapServiceProvider.csです。このファイルは通常、"Leap Motion Controller" GameObjectにアタッチされています。これはLeapXRServiceProvider.csとは異なることに注意してください。こちらはLEAPをヘッドセットにマウントしてトラッキングするためのものです。LeapServiceProviderは、LEAPのトラッキングスペースを表す白い線が付いた円錐ギズモを、現実世界にして約1mの範囲で描画します。

Leap Motion Controllerのscaleを変更すると円錐のスケールもまた変更されるため、シーン内の「手」の動きの範囲も合わせて変更されますが、これを行うとLEAP SDKのあまりよろしくない仕様のために手のオブジェクト形状に大幅な変形が発生します。これを「骸骨の手。」と呼びます。LEAP SDKでは、既定値の(1,1,1)スケールに合うようにすべてのユーザがシーンを構築することを前提としている為に発生してしまいます。

HoloPlay captureのsizeはデフォルトで5なので、0.2程度までスケールダウンしてLEAPのルールでプレイすることもできますが、ありがたいことに以下のようなことがわかりました。

スケーリング・ハック

「手」の物理演算用オブジェクトとグラフィック表示用オブジェクトのscaleは、コントローラオブジェクトのscaleに一致している必要があります。

「手」の各オブジェクトの親オブジェクトがあると仮定して、親のscaleを変更すると、ほとんどの場合は子供オブジェクトである「手」のscaleも正しく変更されますが、

一旦LEAPのセンサー範囲から離れた手を再表示しようとするときにLEAPコントローラーは以前の手のオブジェクトを再表示せずに、新しく手のオブジェクトをインスタンス化してしまう為に手の表示がおかしくなってしまうことがよくあります。

このような時に自動的にscaleを調整する必要最低限なスクリプトを用意しました。手の配列をLEAPコントローラーのscaleに合わせてサイズを変更します。Edit modeで動作します。

leap long fingers

注釈:なぜ指が長くなるのか?この現象はLEAP SDKの前のバージョンでは見られませんでしたが、前のバージョンでも発生する可能性はあります。

LEAP SDK内のRiggedFinger.csを置き換えるだけでこの現象を簡単に修正できます。

LEAP SDKが4.4.1などにアップデートされるまではこのスクリプトを置き換える必要があります。

このスクリプトはLKG+LEAPサンプルに含まれています。

トラッキング・スペース

通常、LEAPから高さ10cm(Leap Motionが反応する最小値)から30cmの範囲をLooking Glassの可視領域に対応させるようにLEAPコントローラーオブジェクトのセンサー範囲の配置とサイズを設定します。

さらに考えておくべき微妙な点は、Looking Glassが水平面に対して61°の傾きを持っているという事です。

実際の手をテーブルと平行方向に動かしたとき、Looking Glassに表示される手もテーブルと平行に動かしたいのか、それともLooking Glassのブロックの底面と平行に動かしたいのか?

正確に-29°の相対角度を設定すると、角度が大きすぎると感じられる傾向があるようなので、-15°から-29°の間に傾きを設定するのが良いかと思われます。

Angled 0 degrees 0 degrees
Angled 15 degrees 15 degrees
Angled 30 degrees 30 degrees

HoloPlay Captureを移動またはアニメートする場合、LEAPコントローラーをHoloPlay Captureの子オブジェクトに設定すると、カメラが移動しても「手」の相対位置はシーンに固定された状態になります。

HolPlay Captureのサイズを変更するときは、LEAPコントローラーのpositionとscaleを手動で設定する必要がある点は注意が必要です。(ピンチの距離については下記を参照)

「手」

LEAPで扱われる「手」は、いくつかの個別のコンポーネントで構成されています。

  • Graphical (meshes, renderers)
  • Physical (colliders, rigidbodies)
  • Attachments (transforms for connecting things to joints)
  • Pinch detector (pinchy pinch)

Graphical hands(3D表示される「手」):

基本的に使われるCapsule Handsは単純な構成のメッシュになっていますが、LoPoly Rigged Handsと呼ばれるやや洗練された構成のメッシュのものもあります。

Physics hands(物理演算用の「手」):

「手」にはボックスコライダーもカプセルコライダーも適用できます。

特に角ばった指を使うのでなければ、大抵はカプセルコライダーのほうが良いのでは?

一部のprefabでは手首/腕のコライダーも含まれていますが、実際に手首/腕のメッシュに対応できるのはカプセルコライダーの「手」のみです。

LoPoly Rigged Handsを使用している場合は、"Forearm" (前腕)コライダーオブジェクトを削除することをお勧めします。

注釈:これらの代替prefabを使いたいなら、prefabをシーンに配置して、HandModelsオブジェクト内の"Physics_Hands"の参照を置き換えます。

Attachment hands(アタッチを管理する「手」):

特定の「手」の関節/手の平に何かを追従させたり、固定したい場合(アタッチ)に非常に便利です。

「手」に何かを追従させたり固定したい場合は、HandModels内のメッシュやRigidbodyではなく、常にAttachment Handsのほうに付けるようにしてください。

時々、アタッチメントが再生成されて失われることがありますが、これは上述のスケーリングの失敗と同じ理由によるものです。

Attachment Handsコンポーネントは、どのボーンにアタッチするかの切り替えをしたり、アタッチしたオブジェクトを確認することができるウィンドウを持っています。

これらに追加された子オブジェクトはすべてアタッチされ、ローカル位置と回転を0にしない限り、アタッチポイントを中心に回転します。

hand attachments

多くの場合、手のひらのtransformポイントが最もスムーズで信頼性がありますが、何かを追跡したり、指先だけで操作したい場合もあります。

このような場合は、「手」のprefabの一部ではなく、アタッチされたオブジェクトに固有のコライダや機能を設定するほうが簡単です。

AttachmentHandEnableDisable.cs というスクリプトもあります。これは多くの場合に重要な機能であり、アタッチされている「手」がシーンに存在している/していないの状態に合わせてアタッチされたオブジェクトを有効/無効にできます。

多くの場合、トラック範囲から外れた「手」がシーン内で非表示になった時には、最後に「手」がトラックされていた位置にアタッチされたオブジェクトを残しておくのではなく、「手」が非表示になったときにはアタッチされたオブジェクトも一緒に非表示にするのが好ましいです。

それぞれの「手」用にスクリプトのアタッチが1つずつ必要で(つまり2つ必要)、それぞれの「手」のAttachment Handを参照する必要があります。

この仕組みをAttachmentHands.cs内に統合すれば、よりシンプルに実装できそうです。

Pinching(つまみアクションの検出):

PinchDetector.cs rはHandModel(物理演算用か表示用かのどちらか)を参照し、ピンチとリリース時にUnityEventsをトリガします。

トリガ距離はワールドスペース内にあり、LEAPコントローラのscaleを変更する場合はこちらのscaleも別途変更する必要があります。

"ControlsTransform" bool値がtrueの場合、PinchDetectorオブジェクトは手に対して相対的に移動し、transformが更新されます。これは、親指と人差し指の指先の中間のピンチ位置を取得するのに便利な方法です。

最後の注釈

  • シーン全体の設定を簡潔にしたいなどの場合は、アタッチメントとピンチスクリプトのアタッチはひとつのオブジェクトにまとめても問題ありません。
  • LEAP SDKには、HoloPlay Captureのctrl+E (Toggle Preview)バインディングを無効にするキー・バインディングがあります。
  • USBハブや問題のあるケーブルを使った時に、LEAPの挙動がおかしくなることがありました。
  • また、他の機器(vive lighthouses、デプスカメラ、おそうじロボット)や直射日光からの赤外線にも敏感なので、注意してください。
  • ある時、私たちのオフィスにあるたくさんのLEAPが完全に動作しなくなってしまいました。私たちが注文したばかりの新品のLEAPでさえもです。ファームウェアが時々自動アップデートされている事が原因ではないかという事が判明しましたが、新しいファームウェアではLEAPを接続するたびに異常が発生します。もしもLEAPの検出に不具合がある場合はLEAPのファームウェアリセットツールを試してみてください。
  • LEAPを机の上などで水平に設置するときは、誤動作を防ぐために、Leap Motionコントロールパネルの「トラッキング向きの自動調整」のチェックボックスをオフにして、LEAPの電源LEDランプ側を手前に向けて設置してください。