43
48

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Oculus DK2とLeapMotionの頭と指のトラッキングデータをキャラクターのポーズに反映する

Last updated at Posted at 2015-10-21

#はじめに
この記事では、こちらの作成方法を解説します。

DK2とLeapMotionのトラッキングデータをFinalIKとAvatar Hand Controllerを使ってリアルタイムにキャラクターのポーズに反映しています。

必要な有料アセット
FinalIK(90$)
Avatar Hand Controller for Leap Motion(5$)

適用可能なモデルについて
モデルごとに調整が必要になりますが、MMDモデルであれば大体同じ設定で出来そうです。
UnityちゃんやKyleなど、各関節のローカル座標がグローバル座標に対し傾いている場合は調整がかなり大変です。

#手順
プロ生ちゃん(暮井 慧)MMDモデルで説明します。
http://3d.nicovideo.jp/works/td8608
##1.MMDモデルをUnityへ読み込む
Stereoartsさんのホームページより、MMD4Mecanimをダウンロードして下さい。
http://stereoarts.jp/
詳細は上記ホームページや書籍の「主婦ゆに!」をご参照ください。

Rig>Animation Typeを「humanoid」に変更します(Final IKを適用するため)。
image

##2.DK2の向きに頭の向きを追従させる
Virtual Reality Supportedを有効にします。
 メニュー Edit>Project Settings>Player
 Player設定のVirtual Reality Supportedにチェック
image

HumanoidImitationPack(今回必要なスクリプトやゲームオブジェクトをまとめたもの)をダウンロードし、Assetsへ追加。
・その中のHumanoidImitation.csをSceneに置いたキャラクターに追加。
・HumanoidImitationのHeadにキャラクターのJoint_Headを追加。
image

これだけでOculus DK2の向きに頭が追従するようになります。

##3.FinalIKを使って頭の位置に姿勢を追従させる
@kikatyanさんのこちらのブログを参考にしました。
FinalIKを使って頭位置にキャラクターの姿勢を追従させる。

ポイントは、左右の肩のIK Targetの位置を頭の位置から逆算する事です(頭のIK Targetはないので)。
逆算と言っても計算はUnityにやってもらいます。
頭の位置のGameObjectの子として肩のIK Targetを作成しておけば、頭位置の変化に応じて肩のIK Targetも移動します。

3-1.Full Body Biped IKを適用
FinalIKをAsset Storeよりインポートし、キャラクターのコンポーネントにFull Body Biped IKを追加します。
image

3-2.BodyIKTargetを適用する
HumanoidImitationPackより、BodyIKTargetをプロ生ちゃんへドラッグドロップ。BodyIKTargetをJoint_Headの位置、LeftSholderTarget、RightSholderTargetを左右の肩の位置に合わせる。
image

3-3.HumanoidImitationのBody IK TargetへBodyIKTargetを追加
image

3-4.Full Body Biped IKへ左肩、右肩のターゲット設定
 LeftArm>Left Sholder Effect>
Target:へ追加
Position Weight:1
image

これで、体と頭が連動するようになります。
image

##4.LeapMotionの手の位置を反映する Leap MotionのUnity Core Asset v3.0.0を使用します。 ※Asset Storeのものは古いので以下からダウンロードしてください。 https://developer.leapmotion.com/downloads/unity

4-1.自分の手をLeap Motionで持ち込む
・LeapmotionのPrefab LMHeadMountedRigを追加する。
・Main Cameraは無効化します。
・LeftEyeAnchor、RightEyeAnchorのカメラは無効化し、CenterEyeAnchorのカメラを有効化。
・ClearFlagsをSky boxに。
image

手のモデルはお好みで設定してください。
画像はCleanRobotFullLeft(Right)Handを設定した例。
CenterEyeAnchor>HeadMount>LeapHandController>Hand ControllerのLeft(Right) Hand Graphics ModelへAssets>LeapMotion>Prefabs>HandModelsNonhuman>CleanRobotFullLeft(Right)Handをそれぞれ追加。
image

これで、自分の手を持ち込めました。

4-2.キャラクター用のLeapControlerを追加
Sceneに置いたLMHeadMountedRig>TrackingSpace>CenterEyeAnchor>HeadMount>LeapHandControllerをAssetsへドラッグ&ドロップしてPrefab化し、このPrefabをJoint_Headの子として追加する。
image
image
これでキャラクター用のLeapMotionの手が出ます。
image

4-3.キャラクターの手をLeamMotionに追従させる。
HandIKTargetControlスクリプトを使って手のIKTargetを制御します。
まず、HumanoidImitationPack>IKTargetsから、LeftHandIKTarget/RightHandIKTargetをプロ生ちゃんへ追加し、それぞれ左右の手首の位置に配置してください。
image
次に、キャラクターに追加したLeapControllerへHumanoidImitationPack>Scripts>Hand IK Target Conrolスクリプトを追加します。
画像の通り設定してください。
image

4-4.Full Body Biped IKへの手のIK Target追加
Left Arm>Left Hand EffectorへLeftHandIKTargetを追加し、Position Weight、Rotation Weightをそれぞれ1にしてください。
image
Chain>BendGoalには、肘を設定する。これで腕がおかしな方向に曲がるのを防ぐために入れています。
Right Armも同様に設定する。

image
これで、Leap Motionの手の位置にキャラクターの手が追従します。
手を伸ばしても肘が伸びきらない場合は、LeapHandControllerのScaleを大きくしてみてください。

もしもLeap Motionとキャラクターの手の方向がずれていた時は
Left(Right)HandTargetのRotationを調整して合わせてください。
image
image

キャラクター側のLeapMotionの手はもういらないので非表示にします。
LeapMotionControllerから、手のGraphics ModelをNoneに設定。
image

これで、頭と手の追従が完了です。
これだけでも結構楽しいです。

##5.キャラクターの指を動かす
折角なので、ここまで来たら指も動かしたいですね。
Avatar Hand Controller for Leap MotionをAsset Storeからダウンロードし、インポートして下さい。
このアセットは手の位置も動かすことが出来るのですが、今回は指のみに適用します。

5-1.指用のLeapMotionコントローラーを頭に追加する
・EmptyGameObjectを9.joint_Headに追加する。名前はLeapAvatarHandControllerとでもしましょう。
・ComponentにIK Leap Hand Controllerを追加する。
・デフォルトでは、LeapMotionが水平に置かれている設定になっているので、HMDマウント設定とするため、Rotation x:270 Y:180 Z:0へ変更。
・Spawn Pointには自分自身(LeapAvatarHandController)を設定。
・Avatar Left Hand,Right Handにそれぞれキャラクターの手首(Joint_LeftWrist/Joint_RightWrist)を追加します。

もしもキャラクターのScaleを1.2等に変更している場合は、手が大きくなってしまうので、逆にLeapAvatarHandControllerのScaleを0.83(=1/1.2)くらいに小さくしてください。

image

5-2.左手にRigged Hand追加
image

5-3.各指にRigged Finger追加
image

5-4.Rigged HandのFingersに各指を追加。
順に、
Element 0 - Thumb:親指
Element 1 - Index:人差し指
Element 2 - Middle:中指
Element 3 - Ring:薬指
Element 4 - Pinky:小指
image

5-5.各指の設定
画像に従って指のBone、Model Finger Pointing、Model Palm Facingを設定してください。
Model Finger PointingとModel Palm Facingは指の向きを決めています。
指の向きがおかしい場合はこの値を調整してください。
左手:親指
image

左手:人差し指~小指
image

右手:親指
image

右手:人差し指~小指
image

これで完成です!
image

この実行ファイルはこちらで公開しています。

ご質問などあれば、Twitter:@afjk01までお気軽にお問い合わせください。
#あとがき
Oculus Connect2で話題となった「Toy Box」。その説明で触れられたShared Presenceを体験したいと思った事がきっかけでこのVRアプリを作成しました。
手軽に試す方法として、まずはキャラクターに自分の動きを追従させてみようという試みです。
Leap Motionは素晴らしいデバイスですが、トラッキングが外れる事が多く、なかなか思ったようにはいきません。
Oculus Touchが発売されたら対応したいですね。

43
48
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
43
48

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?