LeapMotion Orionでキャラクターの手を動かす

#はじめに
Leap Motion Orionの登場により、トラッキング精度が格段に向上しました。
本記事では、Unity Assets for Leap Motion Orionを使ってキャラクターの手を動かす方法を説明します。
[こちらの記事](http://qiita.com/afjk/items/70cff5e2979515f2f508)のLeapMotionのOrion対応です。
併せて参照してください。
注意：LeapMotion Orionは現在(2016/02/22）ベータ版です。その点を十分理解の上ご利用ください。

**必要な有料アセット**
・[FinalIK](https://www.assetstore.unity3d.com/jp/#!/content/14290)(90$)

# Leap Motion Orion SDKのインストール
こちらのOrion VR(Beta)ボタンより、SDKをダウンロードしてインストールしてください。
https://developer.leapmotion.com/get-started

# Unity Assets for Leap Motion Orionのインストール

このページの下のほうにあるArchived Assetsから、Uity Core Assets **v4.0.0**をダウンロード
※最新のv4.0.1には今回必要なRigged Fingerスクリプトが含まれていないため、このバージョンを使用します。
[2016/03/25追記] v4.0.2にはRigged Fingerスクリプトが復活していますので、そちらを使用可能です。

https://developer.leapmotion.com/unity

![image](https://qiita-image-store.s3.amazonaws.com/0/43734/0ea472a0-c538-5099-cddd-fdea2e68a026.png)

#手順
##Unity Assets for Leap Motion Orionをインポート。
Leap_Hands_Demoシーンを開く。

##手の位置にCubeを追従させる
HierarchyのCamera＞LeapHandController＞RigidRoundHand_RのPalmにCubeを設定すると、Cubeが右手の位置に追従する。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Leap Motion Orion、Rigid HandのpalmにCubeを設定するとCubeがpalmの位置に追従する。 <a href="https://t.co/JU0PvBnLj0">https://t.co/JU0PvBnLj0</a></p>&mdash; afjk(エーエフ) (@afjk01) <a href="https://twitter.com/afjk01/status/702179082834989056">2016, 2月 23</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

##不要なCapsuleHandを削除
LeapHandControllerのLeft/Right Graphics ModelをNoneに設定する。
エラーが出るのでHandPool.csスクリプトを修正。
GraphicsModelが設定されていない場合は、ModelPoolにAddしない
[2016/03/25追記] v4.0.2ではエラーは出ないのでスクリプトの修正は不要です。

```csharp
    // Use this for initialization
    void Start() {
      ModelPool = new List<IHandModel>();
      //GraphicsModelが設定されていない場合は、ModelPoolにAddしない
      if(LeftGraphicsModel)
          ModelPool.Add(LeftGraphicsModel);
      if(RightGraphicsModel)
          ModelPool.Add(RightGraphicsModel);
      ModelPool.Add(LeftPhysicsModel);
      ModelPool.Add(RightPhysicsModel);
      controller_ = GetComponent<LeapHandController>();
    }
```

##モデルを読み込んでLeapMotionを配置
プロ生ちゃん（暮井 慧）MMDモデルで説明します。
http://3d.nicovideo.jp/works/td8608

LeapHandControllerはCameraの下から出してプロ生ちゃんに対してのLeapMotionの位置に対応するように配置。
[2016/03/25追記] 机の上にLeapMotionを置いて使用する場合は、LeapHandControllerのLeapServiceProvider>Is Head MountedのチェックはOFFに。
![image](https://qiita-image-store.s3.amazonaws.com/0/43734/889d9bc0-bc29-0c7c-87da-8b3849f6acbf.png)
LeapMotionをHMDにマウントするときはjoint_headの子に、回転させて目の前あたりに配置。
[2016/03/25追記] LeapHandControllerのLeapServiceProvider>Is Head MountedのチェックはON
![image](https://qiita-image-store.s3.amazonaws.com/0/43734/bdfcd159-528c-a6c4-eae9-8ec4efbf3332.png)

##プロ生ちゃんにFull Body Biped IKを適用。
Right Hand EffectorのTargetにCubeを設定し、Position Weightを1に。
LeapMotionにプロ生ちゃんの手が追従する。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Final IKのFull body biped IKを適用したモデルのHand Effector targetとして先程のCubeを設定すれば、Leap Motionの手の位置にモデルの手が追従する。 <a href="https://t.co/93lKX4GzWH">https://t.co/93lKX4GzWH</a></p>&mdash; afjk(エーエフ) (@afjk01) <a href="https://twitter.com/afjk01/status/702180057125617666">2016, 2月 23</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
##手の向きを調整
Rotation Weightを1にすると手の向きも反映されます。
向きが合っていない時はCubeの子にCubeを追加し、こちらをIK Targetとして再設定。
IK Targetを回転させて正しい方向に調整。
※再生中の変更は停止すると戻されるので値を控えておく。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">手の向きが合っていない時は、Cubeの子にオブジェクトを追加してこれをIK targetに設定。回転して正しい向きに調整する。 <a href="https://t.co/fpgGccDKia">https://t.co/fpgGccDKia</a></p>&mdash; afjk(エーエフ) (@afjk01) <a href="https://twitter.com/afjk01/status/702180819050307584">2016, 2月 23</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

#指を動かす
各指にRigged Fingerを追加。
![image](https://qiita-image-store.s3.amazonaws.com/0/43734/a9b1abf9-ce9d-9289-1a27-70c7f82a5751.png)

画像に従って指のBone、Model Finger  Pointing、Model Palm Facingを設定してください。
Model Finger PointingとModel Palm Facingは指の向きを決めています。
指の向きがおかしい場合はこの値を調整してください。
左手：親指
![image](https://qiita-image-store.s3.amazonaws.com/0/43734/f4966cbe-44e4-091e-a400-1b02c24b7859.png)

左手：人差し指～小指
![image](https://qiita-image-store.s3.amazonaws.com/0/43734/ace37e09-2f90-783f-39f6-53b1df0bf89c.png)

右手：親指
![image](https://qiita-image-store.s3.amazonaws.com/0/43734/39e8485d-b604-8b57-5328-e0fb30be6a13.png)

右手：人差し指～小指
![image](https://qiita-image-store.s3.amazonaws.com/0/43734/bcb77374-746a-100d-3ad9-f638a9fee2e1.png)

LeapHandControllerのRigidRoundHand_RのFingersをプロ生ちゃんのものに置き換える。
![image](https://qiita-image-store.s3.amazonaws.com/0/43734/7acb65ed-1875-3c5b-2c3f-6341d62bd4a8.png)
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">モデルの指にRigged Handコンポーネントを設定。各指のbonesや向きを設定したらLeapHandController下のRigid HandのFingersに設定。これで指の動きも反映されます。 <a href="https://t.co/3kGgmlrspQ">https://t.co/3kGgmlrspQ</a></p>&mdash; afjk(エーエフ) (@afjk01) <a href="https://twitter.com/afjk01/status/702181882750967809">2016, 2月 23</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
これで右手の設定は完了です。左手も同様に設定してください。

#指を動かす(ユニティちゃん編)
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ユニティちゃんの指も調整出来ました。 <a href="https://t.co/12W86WgKnI">https://t.co/12W86WgKnI</a></p>&mdash; afjk(エーエフ) (@afjk01) <a href="https://twitter.com/afjk01/status/705076216852832256">2016年3月2日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
ユニティちゃんの場合、手の向きが異なるためRiggedFingerの設定値を以下の通り読み替えて設定してください。
全ての指で共通です。親指はBonesのElement3は不要かもしれません。
![ユニティちゃん.png](https://qiita-image-store.s3.amazonaws.com/0/43734/4c98bc9e-c9f9-0ea4-4042-6d7466cc12d6.png)

![imageLicenseLogo.png](https://qiita-image-store.s3.amazonaws.com/0/43734/f437e277-b922-8ada-1054-d2c1b67dca8c.png)
この作品は[ユニティちゃんライセンス条項](http://unity-chan.com/contents/license_jp/)の元に提供されています

ご質問などあれば、Twitter:@afjk01までお気軽にお問い合わせください。

#あとがき
本記事は、2016/2/21に開催された「VRまつり冬」にてデモを行った「Mimic」でOrionに対応した際に調べた内容です。
Orionは飛躍的に認識精度が上がっていて素晴らしいですね。
Leapmotionをお持ちの方は是非試してみてください。