Leap Motionの日本語情報は非常に限られているので公式ドキュメントをざっくり日本語訳にしました。誤訳などあったらお知らせください。
本エントリはhttps://developer.leapmotion.com/documentation/Languages/CSharpandUnity/Guides/Leap_Overview.htmlの日本語訳となります。
Leap Overview
Leapは装置近くの手、指、および指状のツールを高い精度で検出し追跡します。
Leapソフトウェアは検出した物体を分析し、手、指、ツールなどの位置関係、ジェスチャー、および動きを認識します。 Leapの検出範囲は、装置の中心を頂点とした逆ピラミッドです。 検出距離は約25~600ミリメートルなっています。
Topics:
座標系
モーショントラッキングデータ
座標系
Leapは右利きのデカルト座標系を使います。 Leap Motionの中心を基点としてそこからの距離がmm(ミリメートル)単位で取得できます。
Leap Motionの右側がX座標のプラス値、情報がY座標のプラス値、手前側がZ座標のプラス値となり、その反対方向がそれぞれマイナス値となります。
モーショントラッキングデータ
Leapが手、指およびツールを追跡している間、更新セットまたはデータフレームとして追跡結果を取得できます。各フレームは、ジェスチャーやモーションなどの基本的なトラッキングデータのリストを含んでいます。
手、指、ツールまたはジェスチャーを検出するとき、LeapはユニークなID指示子をそれに割り当てます。 その実体がセンサー検出範囲に残っている限り同じIDが振り続けられます。ただし、センサー検出範囲から外れたりトラッキングが途切れた場合は、同じ実態に対して新しいIDを割り当てるかもしれません。これは、Leapソフトウェアが再検出したときに同じものであるかの判断ができないからです。
注意: 私たちは、Leapが消費者にリリースされる前に、あなたのアプリケーションに提供された動作追跡データを高めるのを計画しています。 Leap SDKの今後のリリースでは、私たちは、時代を通して、より詳細な追跡データと連続を提供するために骨格の手のモデルを紹介するのを計画しています。
フレーム
フレームオブジェクトは、センサーが検出した追跡データ、ジェスチャーおよび要素のリストを提供します。
トラッキングデータのリスト
- Hands -- 検出されたすべての手
- Pointables -- 検出されたすべての指と指状のツール
- Fingers -- 検出されたすべての指
- Tools -- 検出されたすべての指状のツール
- Gestures -- 検出されたすべてジェスチャーの開始、終了、変化
検出されたPointableオブジェクトに対して3つのpointablesリスト(Pointables、指およびツール)が取得できます。例えば、検出した手はHandsオブジェクトを通して関連しているpointablesにアクセスできます。 Handsオブジェクトでは、Leap検出範囲内にある指やツールとは関連していない可能性があることに注意してください。
フレームからフレームの間の指のように個々のオブジェクトをトラッキングする場合、新しいフレームで関連付けられたIDを使用できます。
以下の機能を使用して、IDに対するオブジェクトを取得してください。
- Frame.Hand()
- Frame.Finger()
- Frame.Tool()
- Frame.Pointable()
- Frame.Gesture()
現在のフレームに存在しているなら、これらの機能は対応するオブジェクトの参照を返します。 オブジェクトがもう存在していないならnullが返却されます。nullはトラッキングデータの記録に含まないようにすることで、Leapトラッキングの参照量を減らすことが出来ます。
フレームモーション
Leapは、移動、回転、拡大縮小などすべてのモーションを分析します。 例えば、両手をLeap検出範囲内で左に動かすと、フレームには「移動」の情報が含まれます。 手をひねればフレームには「回転」の情報が含まれます。手の距離を変えればフレームには「拡大縮小」の情報が含まれます。
動きを分析するとき、Leapは検索範囲内の物体すべてをチェックします。 片手を検出するだけなら片手の手の動きをフレームモーション要素のベースとし、2本の手を検出するならフレームモーション要素として両手の動きをベースにし、同時にHandオブジェクトから各手のモーションを要素を別々に得ることができます。
フレームモーションは、指定された以前のフレームと現在のフレームを比べることによって導出されます。
- RotationAxis — 回転軸の指示ベクトル
- RotationAngle — 回転軸の周りの傾き(右手の法則を使用して時計回りで)
- RotationMatrix — 回転を表現する変換マトリクス
- ScaleFactor — 拡大・縮小
- Translation — 直線的な運動を表現するベクトル
アプリケーションで利用する場合、複数フレーム間で手と指を個々にトラッキングする必要はなく、モノを操作するためのモーション要素を適用できます。
手のモデル
手のモデルは手に関連している指と指状のツールのリストと同様に検出された手の位置、特性、および動きの情報を提供します。
Leap APIは手のできるだけ多くの情報を提供します。 しかしながら、Leapはあらゆるフレームのすべての手の属性を決定できるかもしれないというわけではありません。 例えば、手をグーにしたときなどは、指がLeapで検出できないので指のリストは空になります。よってこのようなケースを考慮してコードで指のリストが空のときでも正常に動作するように考慮した方がよいでしょう。
Leapは、手が左か右の手であるかどうか決定しません。 また、視点に1人以上の人の手か他の手のような物があるなら、2本以上の手がリストに現れます。このように2本以上の手が検出されたときも、最適なモーショントラッキングのクオリティを確保するためにLeap Motion Controllerの検出範囲にあるすべての手についてトラッキングすることをお勧めします。
手の属性
Handオブジェクトは検出された手の物理的な特性を報告するいくつかの属性を提供します。
- PalmPosition -- 手のひらの真ん中の位置をミリメートルで測定
- PalmVelocity -- 手のひらの速度をmm/secで測定
- PalmNormal -- 手のひらの中心から垂直に下向きを指すベクトル(図参照)
- Direction -- 手のひらの中心から指に向かって指すベクトル(図参照)
- SphereCenter -- ボールを持ったときの中心位置
- SphereRadius -- 手に持ったボールの半径をミリメートルで測定
「Direction」と「palmNormal」は、Leap座標系に関して手の向きを説明するベクトル情報です。
「SphereCenter」と「SphereRadius」は手のひらに収まっているボールについての情報です。
手のモーション
Handオブジェクトはフレームの間の検出された手の動きを報告するいくつかの属性を盛っています。 Leapはその手の動き、関連する指、および指状のツールを分析して、移動、回転および拡大縮小を報告します。 手をLeap検出範囲内で動かすと移動情報が生成され、手をターンしたりねじったり傾けると回転情報が生成され、向かい合ったまたは距離のはなれた指やツールを動かすと拡大縮小データが生成されます。
手のモーションは、指定された以前のフレームと現在のフレームの手の特性を比べることによって導出されます。
- RotationAxis — 回転軸の指示ベクトル
- RotationAngle — 回転軸の周りの傾き(右手の法則を使用して時計回りで)
- RotationMatrix — 回転を表現する変換マトリクス
- ScaleFactor — 拡大・縮小
- Translation — 直線的な運動を表現するベクトル
指とツール
- Pointables — Pointableオブジェクトとしての指とツール
- Fingers — 指のみ
- Tools — ツールのみ
このリストを使って前のフレームで得られたID値を使用することで個々の指かツールを見つけることができます。?
前のフレームで検出したものが現在のフレームでも存在しているならば対応するオブジェクトの参照を返します。 検出できなかったときはnullを返します。
指とツールのモデル
Leapは検出範囲の中で指とツールの両方を検出してトラッキングします。 形に従って、Leapは指のようなオブジェクトを分類します。 ツールは、より長く、より薄く、指よりまっすぐです。
Leapモデルでは、指とツールの物理的な特性はPointableオブジェクトに抜き取られています。 指とツールはPointableオブジェクトのタイプです。 Pointableオブジェクトの物理的な特性は以下のとおり。
- Length -- 指の長さ
- Width -- 指の平均した幅
- Direction -- 指の向いている方向を指すユニット指示ベクトル
- TipPosition -- Leapから指の先端までの距離(mm:ミリメートル単位)
- TipVelocity -- 指先の移動速度(mm/sec)
Leapは指かツールのどちらかとして検出されたPointableオブジェクトを分類します。 Pointable.IsToolの特性を使用して、Pointableオブジェクトがどれを表すか決定してください。
ジェスチャー
Leapは、ある動作パターンがジェスチャーであるかどうかを認識します。 Leapレポートジェスチャーは、モーショントラッキングデータの同じようにフレームで検出されます。検出された各ジェスチャーのために、LeapはGestureオブジェクトをフレームに追加します。 よって、認識されたジェスチャーはFrameからGestureオブジェクトとして入手できます。
以下の動作パターンはLeapによって認識されます:
- まる -- 円をたどる単一の指
- スワイプ -- 手の直線的な運動
- キータップ -- キーボードを叩くような指の動き
-
画面タップ -- 正面の画面をタップするような指の動き
Leapが最初にジェスチャーとして動作パターンを分類したときに、フレームにGestureオブジェクトが追加されます。 ジェスチャーが続くなら、LeapはアップデートされたGestureオブジェクトをフレームに追加し続けます。 ジェスチャーの「まる」と「スワイプ」は連続して発生します。 Leapはそれぞれがまとめるこれらのジェスチャーの進み具合をアップデートします。
タップは単発的なジェスチャーです。 Leapは単一のGestureオブジェクトとしてフレームに追加します。
重要
あなたのアプリケーションで身振りを交える前に、あなたは、あなたが使用するつもりである各ジェスチャーのための認識を可能にしなければなりません。 Controllerのクラスには、あなたが使用するジェスチャーのタイプのために認識を可能にするのに使用できるEnableGesture()メソッドがあります。
まる
LeapはCircleジェスチャーとして、指先で「まる」を描く指の動きを認識します。
あなたはどんな指やツールでも「まる」を描くことができます。 「まる」のジェスチャーは連続しています。 ジェスチャーがいったん始まると、ジェスチャーが終わるまで、Leapは状況を更新し続けます。 「まる」の動きからはずれたり、動きがゆっくりになると「まる」のジェスチャー検出が終了します。
詳しい情報に関するAPIリファレンスでCircleGestureを見てください。
スワイプ
LeapはSwipeジェスチャーとして、指先直線的な動きを認識します。
「スワイプ」ジェスチャーはどの指をどの方向に動かしても検出できます。「スワイプ」ジェスチャーは連続して発生します。 ジェスチャーがいったん始まると、ジェスチャーが終わるまで、Leapは状況を更新します。 指の移動方向が変わったり、動きがゆっくりになると「スワイプ」のジェスチャー検出が終了します。
詳しい情報に関するAPIリファレンスでSwipeGestureを見てください。
タップ
Leapは、 下向きのキータップと前後の画面タップの合計2つのタイプのタップを認識します。
キータップ
Leapは「キータップ」ジェスチャーとして指かツールで迅速で、下向きのタップを認識します。
ピアノの鍵盤を押すかのように、下向きに叩くことによって、キータップジェスチャを認識させることができます。タップジェスチャーは単発的なので、単一のGestureオブジェクトだけがタップジェスチャー単位で加えられます。
詳しい情報に関するAPIリファレンスでKeyTapGestureを見てください。
画面タップ
Leapは「画面タップ」ジェスチャーとして指かツールで迅速で、前後のタップを認識します。
をまるで垂直なタッチスクリーンに触れているかのように、前向きに叩くことによって、画面タップジェスチャを認識させることができます。タップジェスチャーは単発的なので、単一のGestureオブジェクトだけがタップジェスチャー単位で加えられます。
詳しい情報に関するAPIリファレンスでScreenTapGestureを見てください。
------
Copyright © 2012-2013 Leap Motion, Inc. All rights reserved.
Leap Motion proprietary and confidential. Not for distribution. Use subject to the terms of the Leap Motion SDK Agreement available at https://developer.leapmotion.com/sdk_agreement, or another agreement between Leap Motion and you, your company or other organization.