LeapMotion+VRMのハンドトラッキングで遊んで記録する
上半身だけのアニメーションを作りたかったので、LeapMotionともろもろ使って手の動きを記録することにしました。
結論としては全く使えませんでした。FinalIKとLeapMotionのパラメータの鬼調整が必要になります。上半身だけであれば、Quest2でモーションを記録して手付けで手の表情をつけた方が早い気がしました。
LeapMotionの設定についてはこちらを参考にさせて頂きました。数か所異なる点があったので、そこを修正した上で記載しています。
SDKのインストールとUnityへの組み込み
1.ここから環境に合わせたSDKをダウンロード&インストールする。アカウント登録をしていない場合は登録した上でダウンロード&インストールする
2.Unity上で動かすためにここからUnityパッケージファイルをダウンロードする
3.Unity2019でプロジェクトを作成し、2.でダウンロードした「Core」をダブルクリックしてインポートする
4.いろいろやり方はありますが、大変なので今回はサンプルをまずそのまま使います。「Assets」→「Plugins」→「LeapMotion」→「Core」→「Examples」→「Capsure Hands(Desktop)」をダブルクリックして開く
5.「File」→「Save as」で別名保存する
6.LeapDeveloperKit(最初にダウンロードしたもの)の中にある「Leap_Motion_Installer」をダブルクリックし、モニタアプリをインストールする
7.LeapMotionをUSB2.0に接続し、Windowsメニューの「Leap Motion Control Panel」を選択して立ち上げる
8.下記のような設定にする
9.Windowsメニューの「Leap Motion Visualizer」を選択して立ち上げる。このように手を前に出してボーンが表示させるか確認する
10.「Leap Motion Visualizer」を閉じて、Unityに戻る
11.「Play」ボタンを押して動くか確認する。見えにくい場合はカメラの位置を調整する
VRMモデルに適用する
1.UniVRM安定版(2021.5月現在)をダウンロードし、Unityパッケージファイルをダブルクリックしてインポートする
2.「Assets」を右クリックして「Create」→「Folder」を選び、フォルダを新規作成する。VRMDataなど名前をつけて、その中にVRMファイルをドラッグ&ドロップする
3.アセットストアからFinalIKを購入しインポートする
4.「Hierarchy」→「HnadModel」の左の▶をクリックし、「RigidRounHand_L」→「palm」を選択する
5.「palm」を右クリックし、「Create Empty」を選んで空のオブジェクトを子の状態で作成する。「HandL1」などの名前に変更しておく
6.「RigidRounHand_R」も同様に4.5を行う
7.2.でドラッグ&ドロップして読み込んだVRMファイルの青い立方体(Prefab)を「Hierarchy」にドラッグ&ドロップして配置する
8.「Hierarchy」にある「LeapHandController」を選択し、「W」キーを押して手の骨が正面にくるように位置を調整する
8.7.で配置したモデルを選択し、「Inspector」の下の「Add Component」をクリックする
9.「Full」と検索欄に入力すると「Full Body Biped IK」が出てくるので、それを選択して適用する
10.「Left Arm」の左の▶をクリックし、「Target」に5.で作成した「HandL1」をドラッグ&ドロップする
11.「Right Arm」も同様に「HandR1」をドラッグ&ドロップする
12.「Left Arm」の「Position Weight」と「Rotation Weight」を1にする。同様に「Right Arm」も行う
13.一度Playボタンを押して、LeapMotionの手がモデルに追従していることを確認する(この時点ではズレててもOK)
14.再生した状態のまま「Hierarchy」→「HnadModel」→「RigidRounHand_L」→「palm」→「HandL1」をクリックし、画像のように値を入力する
15.手の位置と角度がだいたい同じになるように14.の数値を調整する
16.調整が終わったら、「Inspector」→「Transform」の右の「…」をクリックし、「Copy Component」を選択して値をコピーする
17.「Play」ボタンを押して再生を解除し、「Hierarchy」→「HnadModel」→「RigidRounHand_L」→「palm」→「HandL1」を選択する
18.「Inspector」→「Transform」の右の「…」をクリックし、「Paste Component Values」を選択して値をペーストする
19.「Hierarchy」→「HnadModel」→「RigidRounHand_R」→「palm」→「HandR1」を選択し、14.のRotateY軸の値のマイナスを取った値を入力する
20.念のため「Play」ボタンを押して位置が適切か確認する
21.「Hierarchy」にあるモデルの「J_Bip_L_UpperArm」をクリックし、以下のように値を「Rotation」のY軸の値を入力する。同様に「J_Bip_L_UpperArm」の「Rotation」のY軸の値を-90度に入力する
22.「Hierarchy」にある「LeapHandController」をクリックし、「Wキー(位置)」「Eキー(サイズ)」を押してモデルの手の位置と重なるように調整する。少し埋まるくらいでOK。もしモデルの手の距離が「LeapHandController」と合わない場合は「J_Bip_L_UpperArm」「J_Bip_R_UpperArm」のY軸の角度を調整する
23.モデルの「J_Bip_L_Index1」を選択し、「Inspector」の「Add Component」をクリックする
24.検索欄に「Rigged Finder」と入力し選択する
25.「Finger Type」が「TYPE_INDEX」になっていることを確認する
26.「Bones」の左の▶をクリックし、「Element 0」から「Element 4」まで下記のように設定する。モデルの「J_Bip_L_Index1(根もと)」を「Element 0」にする。また「Size」を「3」にする
27.同じように「J_Bip_L_Little1」「J_Bip_L_Middle1」「J_Bip_L_Ring1」「J_Bip_L_Thumb1」の割り当てを23.から26.と同様の方法で行う。ただし「Finger Type」を
・「J_Bip_L_Little1」は「PINKY」
・「J_Bip_L_Middle1」は「MIDDLE」
・「J_Bip_L_Ring1」は「RING」
・「J_Bip_L_Thumb1」は「THUMB」
にする
28.23.から27.まで右手も同様に割り当てを行う
29.「Hierarchy」→「HandModels」→「RigidRoundHand_L」をクリックし、「Inspector」→「Rigid Hand」→「Fingers」の横の▶をクリックし、自分のモデルの左手指を下記のように割り当てる(下記はVRoidの場合)
30.「Hierarchy」→「HandModels」→「RigidRoundHand_R」をクリックし、右手も29.同様に行う
31.「Hierarchy」にあるモデルの「J_Bip_L_Index1」をクリックし、「Model Finger Pointin」のXYZの値を調整し、LeapMotionの指の角度とモデルの指の角度がだいたい合うようにそろえる
32.「Hierarchy」にあるモデルをクリックし、「Inspector」→「LeftArm」→「chain」の値をこのようにする。Pullは手を伸ばしたときにどれだけ身体が引っ張られるか、Reachはどれだけ身体が傾くか、「Bend Goal Weight」は手首を回転させたときにどれだけ腕が変化するかを調整するもの。「Play」ボタンを押して値を確認し、「Play」解除後にその値を入力する
モーションを記録する
基本的にはボーン情報をOSCで送受信できる「VMCProtocol」とモーションを「.anim」の形式で記録する「EasyMotionRecorder」で記録を行います。
1.ここから「uOSC」をクリックしてダウンロードする
2.こちらをクリックし、「Code」を選択して「Download ZIP」をクリックしてダウンロードする。ダウンロード後解凍する
3.解凍してできた「uOSC-v0.0.2」(Unityパッケージ)をダブルクリックしてインポートする
4.解凍してできた「VirtualMotionCaptureProtocol-master」→「Sample」→「SampleBonesSend」をUnityの「Assets」にドラッグ&ドロップして読み込む
5.「Hierarchy」の下の「+」をクリックして、「Create Empty」で空のオブジェクトを作成する。「OSCSend」などの名前に変更しておく
6.「OSCSend」に「Assets」→「uOSC」→「Script」→「uOscClient.cs」をドラッグ&ドロップして適用させる
7.「Assets」の中にある「SampleBonesSend.cs」を「OSCSend」にドラッグ&ドロップして適用させる
8.「SampleBonesSend」の「Model」に「Hierarchy」にあるモデルをドラッグ&ドロップする
9.デスクトップ左下にあるWindowsマークを右クリックし、「Windows PowerShell」を選択する
10.青い画面が立ち上がるので、「ipconfig」と入力してエンターキーを押す
11.「IPv4アドレス」と書かれている横の数字をメモする(127.0.0.1など)。メモったら×ボタンを押して「Windows PowerShell」を閉じる
12.「Hierarchy」にある「OSCSend」をクリックし、「Inspector」→「U Osc Client」の「Address」に11.でメモった数値を入力する
13.2019.3以下のバージョンで新しくUnityプロジェクトを作成する
14.こちらから「EVMC4U」をダウンロードする
15.解凍してでてきた「ExternalReceiverPack_v3_7」(Unityパッケージ)を新しく作成したプロジェクトの「Aseets」にドラッグ&ドロップして読み込む
16.「Assets」フォルダの中に「ExternalReceiver」と名前がついたシーンファイルがあるので、ダブルクリックして開く
17.(すでに「Assets」の中に「VRM」というフォルダがあるバージョンの場合はこの項目を飛ばしてOK)「VRMモデルに適用する」の1.でダウンロードした「UniVRM」Unityパッケージを「Aseets」フォルダにドラッグ&ドロップして読み込む
18.「Assets」を右クリックし、「Create」→「Folder」でフォルダを作成する。その中にLeapMotionで使用したVRMモデルをドラッグ&ドロップして読み込む
19.18.で読み込んだVRMファイルを「Hierarchy」にドラッグ&ドロップして配置する
20.「Hierarchy」にある「ExternalReceiver」をクリックし、「Inspector」→「ExternalReceiver」→「Model」に「Hierarchy」にあるVRMモデルをドラッグ&ドロップする
21.LeapMotionの方のUnityプロジェクトを開き、「OSCSend」の「U Osc Clinent」の「Port」の値をコピーする(ここでは「3333」)
22.13.で作成したUnityプロジェクトを開き、「U OSC Server」にペーストする。2つのプロジェクト間でPortのナンバーを同じにする
23.LeapMotionと13.で作成した記録用プロジェクト両方の「Play」ボタンを押して、動きが同期するか確認する。起動順は特にないですが、記録用→LeapMotionだとスムーズです。
またLeapMotionだけでなく、AzureKinectなども「モーションを記録する」の方法で記録することができます
24.ここからボーン情報を記録する「EasyMotionRecorder」をダウンロードし、解凍する
25.解凍してできた「EasyMotionRecorder」Unityパッケージを記録用プロジェクトの「Aseets」フォルダにドラッグ&ドロップして読み込む
26.「Assets」→「EasyMotionRecorder」→「Prefab」→「EasyMotionRecorder」Prefabを「Hierarchy」にドラッグ&ドロップする
27.「Hierarchy」にある「EasyMotionRecorder」をクリックし、「Inspector」の「MotionDataRecoder」→「Animator」に「Hierarchy」にあるモデルをドラッグ&ドロップする
28.記録用プロジェクトのカメラの位置を調整し、上半身が見えるようにする
29.LeapMotionのプロジェクト・記録用プロジェクト両方の「Play」ボタンを押し、記録したいタイミングでキーボードの「R」キーを押す。記録が開始されると記録用プロジェクトの「Console」ウィンドウにこのようにFPSが表示される。停止したいときはキーボードの「X」を押す
30.記録用プロジェクトの「Assets」→「Resources」の中にこのようなファイルができているのでクリックする(日付・時間がファイル名になっているので分かりやすい)
31.「Inspector」の歯車アイコンをクリックし、「Export as Humanoid animation clips」を選択する。そうすると「.anim」形式でアニメーションが書き出される
32.一度保存する
33.「Assets」→「Scenes」をクリックし、何もないところで右クリックして「Create」→「Scene」を選択して新しくシーンをつくる
34.新しく作ったシーンをダブルクリックして開き、「Assets」→「VRMData」の中にあるアバターのPrefab(青い立方体のアイコン)を「Hierarchy」にドラッグ&ドロップする
35.「Assets」を右クリックし、「Create」→「Folder」で新しくフォルダを作成する。「AnimData」とか名前をつけておく
36.31.で書き出された「.anim」ファイルを「AnimData」にドラッグ&ドロップして移動させる
37.「AnimData」の何もないところで右クリックし、「Create」→「AnimationController」を作成する。名前を適用につける
38.「Hierarchy」にあるモデルをクリックし、「Inspector」→「Animator」の「Animation」に37.で作成した「AnimationController」をドラッグ&ドロップする。このとき「Apply Root Motion」にチェックを入れておく
39.「Hierarchy」にあるモデルをクリックし、「Window」メニュー→「Animation」→「Animator」で「Animator」ウィンドウを表示させる
40.グレーのマス目の何もないところで右クリックし、「Create State」→「Empty」を選択する
41.「New State」をクリックし、「Motion」のところに「AnimData」フォルダに入れた「.anim」ファイルをドラッグ&ドロップする
42.「Play」ボタンを押して動くか確認する