Quest3で疑似フルトラモーキャプする(上半身+手キャプチャ、下半身機械学習での動作)
こんな感じになります。
準備
こちらを参考にさせて頂きました。SDKのバージョンが違うので諸所異なっています。
1.2021以降でプロジェクトを作成し、以下をインポートする
2.Build SettingsでプラットフォームをAndroidにSwitchする
3.「Oculus」→「Tools」→「Project Setup Tool」を選択して、FixAllやApllyを押して赤い警告マークが消えるようにする
ただしこれだけ残ってしまうので、次の項目で解決する
4.「XR Plugin Management」の項目をクリックし、「Install XR Plugin Management」をクリックする
5.「XR Plugin Management」のPCとAndroidの項目それぞれ「Oculus」にチェックを入れる
6.パッケージマネージャーから以下をインポートする
7.「InteractionRigOVR-Hybrid」プレハブをHierarchyにドラッグ&ドロップする
8.「InteractionRigOVR-Hybrid」→「OVRCameraRig」をクリックし、「Hand Tracking Support」が「Controllers And Hands」になっていることを確認する
9.「Body Tracking Support」を「Supported」にする。QuestProでアイトラ&フェイストラッキングが必要な場合は「Face Tracking Support」「Eye Tracking Support」も「Supported」にする
10.その下の「Permission Requests On Startup」の「Body Tracking」にチェックを入れる
12.「Movement Tracking」の項目が以下のようになっているか確認する。特に「Body Tacking Fidelity」が「High」でないと、Quest3のInside-Out Body Tracking機能(足を推定する機能)が使えないので注意
13.「Tracking Origin Type」が「Floor Level」になっているか確認する
14.VRMを使う場合はUniVRMをインポートし、キャラクターをHierachyに設置する
15.FBXアバターの場合は、Humanoidであることが前提で、「Configure…」をクリック→「Muscles &Settings」で「Translation DoF」にチェックが入っているか確認する(VRMの場合はこの項目を飛ばしてOK)。確認できたらキャラクターをHierachyに設置する
16.Hierarcyにあるキャラクターを右クリックし、「Movement」→「Setup Character for Body Tracking」→「Format:Unity Humanoid」を選択する。
もしVRMでできない場合は、HierarcyにあるVRMキャラクターに「OVR Body」「OVR Unity Humanoid Skelton Retarget」を適用する
17.以下の項目をすべて「Full Body」にする
18.「OVRLeftHandVisual」と「OVRRightHandVisual」をオフにする
19.「OVRControllerDrivenHands」の「OVRLeftHandVisual」と「OVRRightHandVisual」をオフにする
鏡を作る
ハンドトラッキング含めたボディトラッキングができるようになっても、本当に動いているか確認するには鏡が必要になります。正確に描写するには複雑な設定やコードが必要ですが、ひとまず動いているか確認できれば良しとします。
1.Assetsフォルダを右クリックし、Create→Render Textureを選択し名前をつける
2.Hierachyの「+」→Cameraを選択して新しくカメラを作る
3.カメラのInspectorにある「Target Texture」の右にある◎アイコンをクリックし、先ほど作ったRender Textureを選択する
4.Hierachyの「+」→3D Object→Quadを選択する。「Mirror」などに名前を変える
5.Assetsにある作成したRender Textureを、HierachyのMirrorにドラッグ&ドロップする。そうすると自動的にマテリアルが作成されてRender Textureが適用された状態になっている
6.Mirrorを選択して、Inspectorから「Receive Shadows」のチェックを外す
7.MirrorオブジェクトのScaleのXの値を-1で掛けた値に変更
8.Render TextureのSizeの縦横比とMirrorのScaleの縦横比を同じにする
例えば16:9の場合、Render Textureは1024×576にし、MirrorオブジェクトのScaleを-2.9092×1.636425にする。Render Textureを高解像度にすると、ハッキリ映るが重くなる
9.2.で新しく作ったカメラとMirrorオブジェクトの位置を調整する
10.2.で新しく作ったカメラをMirrorオブジェクトの子にする
実行してみる
こんな感じになります。
確認と収録
1.PCとQuest3をケーブルまたはWifiで接続し、OculusLinkを起動させる
2.Unityのプレイボタンを押して、手も含めたキャラクターの動きが自分の身体の動きと同期するか確認する
3.動きをAnimationファイルとして保存したい場合は、「EasyMotionRecorder」を以下からダウンロードする
4.ダウンロードしたパッケージをインポートする
5.HierachyにEasyMotionRecorder.prefabを配置する
6.「MotionDataPlayer」と「MotionDataRecoder」の「Animator」にHierachyにあるキャラクターをドラッグ&ドロップする
7.実行して動いているのを確認したら、「R」キーで収録する
8.収録をやめる場合は「X」キーを押す
9.「Resources」フォルダに「RecordMotion_アバター名_収録日と時刻」というファイルがあるので、それをクリックする
10.インスペクタで右クリックし「Export as Humanoid animation clips」を選択する。そうするとファイルをAnimationClipに変換してくれる
(おまけ QuestPro用途中)VRMモデルをパーフェクトシンク化する
QuestProでフェイストラッキングをするため、VRMの表情を増やすパーフェクトシンクを導入します。
パーフェクトシンク準備
1.VRoidでVRMを書き出すときに「透明メッシュを削除する」にチェックが入っていないことを確認して書き出す。デフォルトではチェックが入っているので注意
2.新しくプロジェクトを作成する。パーフェクトシンク化専用のプロジェクトにする
3.以下からHANA_Toolをダウンロードする
4.UniVRMを読み込む
5.VRMモデルを読み込み、Hierarchyにドラック&ドロップする
6.「HANA_Tool_v4_0_6_VRM.unitypackage」をUnityにインポートする
7.「HANA_tool」→「Reader」を選択し、「SkinnedMeshRenderer」の◎を押して顔のメッシュを選択する
8.「ReadBlendshape」を押して、HierarchyにあるVRMモデルの「Face」メッシュ→「BlendShape」を確認する。項目が増えていたらOK
9.「Hanatool」→「ClipBuilder」を選択し、以下のように設定する。Questの
場合はOVRで出力する
10.読み込んだVRMの「アバター名.BlendShape」フォルダ→「BlendShape」を選択し、通常のVRMのBlendShapeでは見かけないものをクリックして、表情が変わればOK
11.「VRM0」メニュー→「Export VRM 0.x」を選択してVRMファイルを新しく書き出す
12.Quest3用のプロジェクトに11.で書き出したVRMファイルを読み込み、「アバター名.BlendShape」フォルダ→「BlendShape」をクリックし、パーフェクトシンク用のBlendShapeがあるかチェックする
フェイストラッキングの設定をする
1.VRMモデルのFaceに「OVR Face Expressions」を追加する
2.以下のコードを作成し、VRMモデルのFaceに適用する
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class FaceExpressionsController : MonoBehaviour
{
private OVRFaceExpressions faceExpressions;
private SkinnedMeshRenderer meshRenderer;
// スタート時に呼ばれる
void Start()
{
faceExpressions = GetComponent<OVRFaceExpressions>();
meshRenderer = GetComponent<SkinnedMeshRenderer>();
}
// フレーム更新毎に呼ばれる
void Update()
{
if (faceExpressions == null || meshRenderer == null) return;
// フェイストラッキングの有効時
if (faceExpressions.FaceTrackingEnabled && faceExpressions.ValidExpressions)
{
// 目を閉じるを同期
meshRenderer.SetBlendShapeWeight(13, 100 * faceExpressions[OVRFaceExpressions.FaceExpression.EyesClosedL]);
meshRenderer.SetBlendShapeWeight(14, 100 * faceExpressions[OVRFaceExpressions.FaceExpression.EyesClosedR]);
}
}
}
3.「OVRCameraRig」をクリックし、「OVRCameraRig」の「General → Face Tracking Support」を「Required」にする
4.「OVRCameraRig」の「Permission Requests On Startup → Face Tracking」にチェックを入れる
5.以下から「FaceExpressionsControllerVRM.cs」をダウンロードし、VRMモデルのFaceに追加する
(実機が今ないので、この後検証できず…)