Unity用Movement SDKのボディトラッキング 更新日時: 2025/12/19
このセクションを完了すると、ボディトラッキングを含むプロジェクトに必要なプロジェクトレベル設定をすべて構成できるようになります。
VR用にプロジェクトを設定したら、以下の手順を実行します。
シーン内にOVRCameraRig prefabがあることを確認します。これは、ビルディングブロック を使って追加できます。 [Hierarchy (階層)]でOVRCameraRig を選択します。インスペクターで、OVRManager コンポーネントに移動します。 [Target Devices (ターゲットデバイス)] を選択します。下にスクロールして、[Quest Features (Questの機能)] > [General (一般)] に進みます。 ジェスチャーコントロールを使う場合は、[Hand Tracking Support (ジェスチャーコントロールのサポート)] で[Controllers and Hands (コントローラーと手)] を選択します。 [General (一般)] で、[Body Tracking Support (ボディトラッキングサポート)] を[Supported (サポート対象)] または[Required (必須)] に設定します。ボディトラッキングがアプリで任意の場合は[Supported (サポート対象)] を選択し、ボディトラッキングなしではアプリが機能しない場合は[Required (必須)] を選択します。このビューが表示されない場合は、[General (一般)] をクリックしてください。
インサイドアウトボディトラッキング(IOBT)を使うには、[Movement Tracking (動きのトラッキング)] セクションで、[Body Tracking Fidelity (ボディトラッキングのフィデリティ)] を[High (高)] にします。IOBTは、推奨されるフィデリティモードであり、APIの要件ではありません。詳細は、ボディトラッキングのトラブルシューティング を参照してください。 全身を使うには、[Movement Tracking (動きのトラッキング)] セクションの[Body Tracking Joint Set (ボディトラッキングの関節セット)] で[Full Body (全身)] を選択します。 アイトラッキングおよびフェイストラッキングを使うには、以上のステップと同じ設定を適用します。
注 : OVRManagerは起動時のアクセス許可リクエストがあり、必要なトラッキング技術に合わせて選択する必要があります。
フェイストラッキング、アイトラッキング、またはジェスチャーコントロールに依存しているプロジェクトの場合、HMD上でこれらが有効になっていることを確認する必要があります。通常これはデバイスの設定に含まれていますが、[Settings (設定)] > [Movement Tracking (モーショントラッキング)] で設定の確認や変更が可能です。 Unityエディターで、[Meta] > [Tools (ツール)] > [Project Setup Tool (プロジェクト設定ツール)] に移動して、プロジェクト設定ツールにアクセスします。 プラットフォームを選択します。 問題がある場合は、[Fix All (すべて修正)] を選択します。詳しくは、プロジェクト設定ツールの使用 をご覧ください。 ボディトラッキングを適用するキャラクターを設定する このセクションを完了した開発者は、以下のことができるようになります。
ボディトラッキングをキャラクターモデルにリターゲットする。 キャラクターのリターゲティング出力を調整する。 このセクションでは、キャラクターアセットをインポートしてから、ボディトラッキングを使えるようにする方法を学びます。
Metaは、84の骨で構成された独自のボディトラッキング骨格を使用します(
付録Aを参照 )。この骨格は、キャラクターリグではなく、人間の骨格に対応しています。Unity内では、一連のスクリプトを通じてボディトラッキングAPIにアクセスします。これらのスクリプトは、Unityゲームオブジェクトにアタッチされているコンポーネントとして実行されます。
ボディトラッキングサポートが有効化されている場合は、
OVRBodyスクリプトが、トラッキング空間内で更新されたボディポーズデータ(位置と向き)をポーリングします。このポーズデータは、直接解釈して使用するか、下の図にあるように、インポートしたUnityキャラクターにリターゲットすることができます。
ボディトラッキング(ソース)からキャラクター(ターゲット)にリターゲットするためには、ソースからターゲットにリターゲットする設定を生成する必要があります。この処理の手順は次のとおりです。
カスタムキャラクターをUnityプロジェクトにアセットとしてインポートします。 サードパーティモデルアセット(ターゲットリグ)を右クリックし、[Movement SDK] -> [Body Tracking (ボディトラッキング)] -> [Open Retargeting Configuration Editor (リターゲティング設定エディターを開く)] クイックアクションを選択します。 未作成の設定JSONを作成するよう求めるメニューが表示されたら、[Create (作成)] を選択し、その場所を選択します。 ツールにより、ほとんどのキャラクターに存在する既知の関節のセットと、キャラクター上の骨変換のリストが検出されます。リターゲティングにはこれらの既知の変換が使用されるため、検出された変換を確認し、必要に応じて変更を加えてください。手動で、または[Pose character to T-Pose (キャラクターのポーズをTポーズにする)] をクリックしてから[Next (次へ)] をクリックすることにより、キャラクターのポーズをTポーズにします。プロンプトに従って更新内容を設定に保存します。 次の画面では、最小Tポーズ という、既知の最小のソースサイズに合わせてキャラクターを位置合わせすることができます。これにより、背が低い場合に対応した設定の調整を行えます。[Align with Skeleton (骨格による位置合わせ)] をクリックすると、キャラクターが自動的に位置合わせされます。[Reset T-Pose (Tポーズをリセット)] をクリックすると、元のレストポーズにリセットされます。 [Preview Sequences (プレビューシーケンス)] のボタンをクリックすると、キャラクターが最小Tポーズに対してどのようにリターゲットされるかを確認できます。この結果を調整する方法については、リターゲットしたキャラクターの見た目を改善する のセクションで説明します。終わったら、[Next (次へ)] をクリックし、必要に応じて更新内容を設定に保存します。次の画面では、最大Tポーズ という、既知の最大のソースサイズに合わせてキャラクターを位置合わせすることができます。前述の最小Tポーズ に関する説明にあった位置合わせボタンを使います。[Preview Sequences (プレビューシーケンス)] のボタンを使って結果をプレビューします。プレビュー後、[Next (次へ)] をクリックします。
最後の[Review & Export (レビューとエクスポート)] 画面では、[Size (サイズ)] スライダーを使って最小値と最大値の間でキャラクターを拡大縮小した結果を確認したり、シーケンスボタンを使って拡大縮小をプレビューしたりすることができます。終わったら、[Validate and save config (設定を検証して保存)] をクリックします。
(任意) Unityはカメラからの見え方を決定するために、事前計算されたメッシュのバウンドを使用します。見えないと判断されるスキンメッシュはスキニングされません。したがって、想定される高さや幅と比較してメッシュのバウンドが小さすぎる場合は、バウンドの見える範囲によっては正しくアニメーションが付けられない可能性があります。この問題を回避するために、スキニングメッシュレンダラーの[Edit Bounds (バウンドの編集)]ボタンを使って、バウンドを大きくすることができます。例えば、ユーザーが前に手を伸ばしたためにバウンドの奥行きを越えてしまう場合などには、以下のようにレンダリングされるキャラクターのバウンドの奥行きを増やすことで対応できます。さらに、「Update When Offscreen (オフスクリーン時に更新)」オプションを有効化して、フレームごとにバウンドを再計算することも可能です。ただしこの場合、消費されるCPUサイクルが増加します。
キャラクターに対してボディトラッキングを有効化する 次のステップで、ソースからボディトラッキングの動きを読み取り、トラッキングデータを使ってキャラクターにリターゲットするコンポーネントを追加します。
キャラクターのモデルまたはprefabをシーンにドラッグします。 モデルを右クリックしてから、[Movement SDK] > [Body Tracking (ボディトラッキング)] > [Add Character Retargeter (キャラクターリターゲッターを追加)] を選択します。
あるいは、CharacterRetargeterコンポーネントとOVRBodyコンポーネントをキャラクターに手動で追加します。 前の手順で追加したコンポーネントで次のオプションを確認する必要があります。
ジェネレーティブレッグの場合は、キャラクターの[Provided Skeleton Type (提供された骨格タイプ)] が[OVRBody] (前の手順で追加)で[Full Body (全身)] に設定されていることを確認します。さらに、全身の関節がすべてのキャラクターで表現されるためには、OVRManagerの[Body Tracking Joint Set (ボディトラッキング関節セット)] が、[Movement Tracking (動きのトラッキング)] セクションで[Full Body (全身)] に設定されている必要があります。IOBTについては、OVRManagerの[Movement Tracking (動きのトラッキング)] セクションで、[Body Tracking Fidelity (ボディトラッキングのフィデリティ)] が[High (高)] に設定されていることを確認してください。IOBTはフィデリティモードとして推奨されていますが、APIの要件ではありません。詳しくはボディトラッキングのトラブルシューティング をご覧ください。 MSDKユーティリティには、キャラクターのリターゲティングを設定するために利用できるビジュアルリターゲティングエディターが含まれています。これを使って、ターゲット(キャラクター)に合わせてソース(ボディトラッキング)の骨格を位置合わせしたり、骨から骨へのマッピングとウェイトを表示したり、以下のような問題を修正したりできます。
リターゲットしたメッシュにボディトラッキングが位置合わせされない。 リグのプロポーションが典型的な人間のプロポーションと一致しない。 トラッキング対象となる人のプロポーションがキャラクターのプロポーションと大幅に異なる(例: 肩幅が広い)。 このような問題を解決するには、動きが自然に見えるようにキャラクターを調整する必要があります。実際の具体的な手順は、クリエイティブな意図によって変わります。例えば、キャラクターが背中を丸めて歩くようにしたい場合もあれば、キャラクターの姿勢をよくしたい場合もあるでしょう。リターゲティングエディターツールでは、キャラクターのリターゲットを視覚的に操作しながらクリエイティブな意図を実現することができます。
リターゲットされた骨格に変更を加えるには、CharacterRetargeterコンポーネントにプロセッサーを追加することができます。これらのプロセッサーは、リストに追加した順に実行されます。次のプロセッサーが利用可能です。
TwistProcessor - キャラクターの関節にツイスト処理を適用するプロセッサーです。手首の周囲がキャンディの包み紙のように不自然にねじれる問題や、ツイスト処理に関連したさまざまな問題を修正する上で役立ちます。
ISDKProcessor - ISDKをキャラクターに適用するプロセッサーです。これは、ISDKポーズをキャラクターに適用する際に便利です。
AnimationProcessor - キャラクターにアニメーションをブレンドするプロセッサーです。これは、キャラクター上でアニメーションとボディトラッキングをブレンドする際に便利です。LocomotionProcessor - キャラクターにロコモーションを適用するプロセッサーです。これは、キャラクターにロコモーションを適用し、それをボディトラッキングとブレンドするのに役立ちます。
CCDIKProcessor - CCDIKをキャラクターに適用するプロセッサーです。骨チェーンを解決してターゲットに到達するようにするのに役立ちます(ターゲットの手の位置をカスタムのハンドポーズに変更するなど)。
このプロセッサーは、CharacterRetargeterコンポーネントのソースプロセッサー /ターゲットプロセッサー のリストに追加できます。ドロップダウンからタイプを選択してください。設定はインスペクターで行うことができます。
リターゲットされたキャラクターの手首の周囲がキャンディの包み紙のように不自然にねじれる場合は、ターゲットプロセッサー のリストに2つのTwistProcessorを追加することができます。以下のボタンを押して、左右のねじれプロセッサーを設定してください。
Fill Left/Right Arm Indices (左右の腕のインデックスを埋める) Estimate Twist Axis (ねじれ軸を推定) これを設定するのに役立つボタンがプロセッサー上にあり、プロセッサーが追加されたらねじれの問題が解決されるはずです。MovementBodyシーンのスタイル化キャラクターにその一例があります。
リターゲティングエディターは、WYSIWYG(完成形を確認しながら作業できる)ツールであり、キャラクターのリターゲティングを改善するために素早く繰り返し調整を行うことができます。以下のステップが含まれています。
設定 - このステップでは、キャラクターのTポーズ、リターゲットする関節、マッピングする既知の関節を定義できます。
設定された関節 :
このリストで、リターゲティングには使わない骨を削除することができます。例えば、カスタムアニメーションやIKに使われている部位などです。 既知の関節 :
リターゲティングエディターにより、既知の各関節に対応する骨をできるだけ正確に自動判別します(Right_UpperLeg→右脚上部など)。これは自動位置合わせツールとして使われます。適切な見た目にならない場合は、修正を加えてください。 エディター可視化 :
リターゲティングエディターはUnityの変換エディターツールに統合されています。エディターでキャラクターの骨格がレンダリングされます。このステップにおいて、キャラクターはTポーズでなければなりません。そうでない場合は、[Pose character to T-Pose (キャラクターをTポーズにする)] ボタンを使うか、Unityの組み込み変換ツールを使って手動でキャラクターをTポーズに位置合わせすることにより、骨格の骨を動かします。 最小/最大Tポーズ位置合わせ - このステップでは、ソース(ボディトラッキング)Tポーズとターゲット(キャラクター)Tポーズの位置合わせを定義することができます。この位置合わせとマッピングが、リターゲティングロジックの基礎データになります。
エディター可視化 :
このステップでは、キャラクターの可視化により、リターゲティングの表示結果をプレビューすることができます。プレビューシーケンスの1つをクリックするだけで結果を表示できます。 結果を調整する場合(キャラクターを元に戻すなど)は、Unityの組み込み変換ツールを使ってTポーズの位置合わせを編集するだけで、キャラクターのプレビューがすぐに更新されます。 リターゲティングの見た目が適切なものになるよう、必要な位置合わせを行ってください。
レビューとエクスポート - このステップでは、さまざまなサイズやプロポーションを使って最小Tポーズと最大Tポーズの位置合わせの結果をプレビューできます。
ユーザーに合わせてキャラクターの背の高さを変更する このセクションで選ぶオプションによって、キャラクターをユーザーの背の高さに合わせて変形させることができます。さまざまな身長のユーザーに対応するには、関節周辺のエリアがメッシュに十分な影響を与えるようにすることで、キャラクターをさまざまな背の高さに適応させる必要があります。詳細については、付録Cの
キャラクターの高さの設定 をご覧ください。
このセクションを完了した開発者は、以下のことができるようになります。
ボディトラッキングがキーフレームアニメーションと互換性があることを理解する。 この知識を応用して、キーフレームアニメーションをインポートし、アニメーションをリグ全体または一部(例: 脚部)に適用させる。 このセクションでは、ボディトラッキングを応用して、キーフレームアニメーションをインポートし、アニメーションをリグ全体または一部に適用させる方法を詳しく説明します。
キャラクターにキーフレームアニメーションを追加したいと思うシナリオは多数あります。例えば、このようなアニメーションを使って、コントローラーでキャラクターを動かすと、ボディトラッキング状態から「アニメーション実行」状態に変えられます(ボディトラッキングと一緒にロコモーションコントローラーを使う方法については、次のセクションで詳しく説明しています)。
MovementBodyシーンには、手を振るアニメーションを使って体の部位を動かす例が含まれています。
キャラクターにアニメーションを追加するには、次のようにします。
追加するアニメーションをダウンロードまたは作成します。 「トラッキング用prefabを有効にする」で言及されているように、キャラクターのアニメーターコンポーネントにアバターが割り当てられていることを確認します。 アニメーションを再生するタイミングを制御するアニメーターコントローラーを追加し、それをアニメーターの[Controller (コントローラー)]フィールドに割り当てます。サンプルシーンの場合、これはWaveAnimControllerにあります。 CharacterRetargeterコンポーネントにターゲットプロセッサーを追加し、そのタイプをアニメーション に設定します。新しく追加されたプロセッサーでのアニメーションブレンドに使うマスクを定義します。
アニメブレンドインデックス : アニメーションのブレンドに使う関節を定義します。この例の場合、キャラクターが腕を振っているため、Right_UpperArm/Right_LowerArm/Right_Handの関節がこのマスクに追加されています。 このセクションを完了した開発者は、以下のことができるようになります。
コントローラーベースのアニメーションとボディトラッキングが、それぞれいつ必要になるかを理解する。 ボディトラッキングとコントローラーベースのアニメーションを併用するために、ロコモーションコントローラーを実装する。 このセクションでは、ボディトラッキングとコントローラーベースのアニメーションを併用するために、ロコモーションコントローラーを実装できるケースについて学びます。
ボディトラッキングとロコモーションの併用に便利な設計パターンとして、バーチャル環境内を移動するためにコントローラーベースのインプットを使い、その後、特定のコンテキストや場所の中でボディトラッキングを使うことが挙げられます。コントローラーベースのナビゲーションにおいて、キャラクターには通常、バーチャル環境におけるキャラクター速度に対応するアニメーションが付けられます(例: 歩く、ジョギングする、走る)。プレイヤーコントローラーを実装するオプションにはさまざまなものがあり、オンラインチュートリアルが用意されています。ただし、コントローラーベースのアニメーションとボディトラッキングを併用する場合は、以下の問題を解決する必要があります。
地面とオブジェクトのインタラクションが適切に実行されるよう、コライダーを配置する。 バーチャル環境内を正しく移動し、カメラの位置を1Pビューに合わせておけるように、PlayerControllerを実装する。 ボディトラッキングがコントローラーベースのアニメーションをオーバーライドする条件を決定する。 デモについては、
ISDKロコモーション のサンプルをご覧ください。ISDKロコモーションと統合する手順は以下のとおりです。
ISDKロコモーションをシーンに 統合します。リターゲットされたキャラクターのターゲットプロセッサーのリストに、Locomotion (ロコモーション) プロセッサーとAnimation (アニメーション) プロセッサーを追加します。 ロコモーションプロセッサーの[Setup (設定)] ボタンを押します。 アニメーションプロセッサーで、[Update anim blend indices with lower body (下半身によりアニメブレンドインデックスを更新)] ボタンを押します。 ロコモーション用のアニメーションブレンドツリーを含むアニメーターコントローラーを追加します。 ISDKロコモーションとボディリターゲティングの統合を示すシーンが、
高度なサンプル に含まれています。
AI Motion Synthesizerで自然なキャラクターアニメーションを追加する このセクションを完了した開発者は、以下のことができるようになります。
AI Motion Synthesizerのメリットを理解する。 AI Motion Synthesizerをプロジェクトに実装する。 AI Motion Synthesizerを活用して、座っているプレイヤーに現実味のある立ち姿の動きを提供する。 注: AI Motion Synthesizerは現在、QuestヘッドセットまたはMeta Horizon LinkでQuestヘッドセットに接続されたWindows PCでのみ利用可能です。
このセクションでは、AI Motion Synthesizerとボディトラッキングを使って、より自然なキャラクターアニメーションを実現する方法について説明します。
AI Motion Synthesizerは、Questヘッドセットからの少量の信号を通じて自然なキャラクターモーションを生成する革新的なAIフレームワークです。AI Motion Synthesizerでは、Questコントローラーからの入力データと、ボディトラッキングからの動作データが、AIの助けを借りてブレンドされることにより、VRで流動的かつリアルなキャラクターアニメーションを実現します。
それには、以下のようなメリットがあります。
アニメーションの忠実度の向上 従来のアニメーションコントローラーの代わりに、効率的で軽量なコントローラーの提供 歩行、走行、回転などの一般的なアニメーションなど、ロコモーション用の追加のアニメーションアセットが不要 ボディトラッキング付きのロコモーションを使用してVR環境でのナビゲーションを実装するための設計パターンの1つは、ナビゲーションにコントローラーベースの入力を使用することです。コントローラーベースのナビゲーション中、キャラクターアニメーションは、歩行、ジョギング、ランニングなどのロコモーションタイプに応じて異なります。AI Motion Synthesizerは、コントローラー入力に基づいて自然なモーションを作成し、ボディトラッキングとブレンドして、シームレスなキャラクターロコモーションを実現します。
さらに、AI Motion Synthesizerを使用すると、座った状態でも立っているかのようなボディトラッキングでVRを体験することができます。このフレームワークが実装されるまで、これは難しいことだったでしょう。
プロジェクトでAI Motion Synthesizerを有効にするには、以下の手順に従ってください。
ボディトラッキングを適用するキャラクターを設定する で、キャラクターの設定を完了します。MetaSourceDataProvider.csコンポーネントの[Enable AI Motion Synthesizer (AI Motion Synthesizerを有効にする)]オプションを有効にします。AI Motion Synthesizerジョイスティック入力 コンポーネントをキャラクターに追加します。または、IAIMotionSynthesizerInputProviderを実装することにより、カスタム入力プロバイダーを追加することもできます。カスタム入力プロバイダーで、デフォルトの速度、入力バインディングやその他のパラメーターを設定します。座ってプレイモードを有効にするには、MetaSourceDataProvider.csコンポーネントの[Enable Synthesized Standing Pose (合成されたスタンディングポーズを有効にする)] オプションを有効にします。これによりキャラクターが立ち上がり、ボディトラッキングされたポーズにかかわらずユーザーに正確なプロポーションが使用されます。 キャラクターは、AI Motion Synthesizerと全身トラッキングのブレンドポーズによって操作することができます。
AI Motion Synthesizerとロコモーションの統合を示すシーンが、
高度なサンプル に含まれています。
Movement SDKにはMovementBodyTrackingForFitness というサンプルがあります。これは、ボディポーズがBodyPoseAlignmentDetectionというコンポーネントを使ってどのように記録・比較されるかを示したものです。
このセクションを完了すると、開発者は、ユーザーが希望するエクササイズ(例えばスクワット)に必要なポーズを取っているかどうかをユーザーが判断できる検知機能を実装できるようになるはずです。
このセクションでは、以下の方法について説明します。
Unityエディターでボディポーズを可視化する 実行時にボディポーズを表示する Unity Preview中にボディポーズをエクスポートする ボディポーズをインポートする 2つのボディポーズの一致度を確認する 比較に基づいて呼び出すカスタムアクションを設定する エディターでボディポーズを調整する BodyPoseControllerコンポーネントを持つ新しいGameObjectを使って、ボディポーズをエディター内で作成します。名前を「BodyPose」にします。[BodyPose]にBodyPoseBoneTransformsコンポーネントを追加します。 インスペクターで、[Refresh Transforms (変換をリフレッシュ)] を選択します。 ボディポーズ(BodyPoseControllerに基づく)は、骨のPoses配列から構成され、実行時には表示されません。BodyPoseBoneTransformsで作成される変形もそのままでは表示されないため、以下の追加作業が必要です。
BodyPoseオブジェクトに、SkeletalDrawContainerコンポーネントを追加します。 先ほど追加したBodyPoseBoneTransformsを、SkeletalDrawContainerの[Body Pose Transforms (ボディポーズ変換)]フィールドに割り当てます。 ボディトラッキングデータアセット(Packages/Meta XR Movement SDK/Runtime/Native/Data/OVRSkeletonRetargetingData.assetからのものなど)を、SkeletalDrawContainerの[Body Data (ボディデータ)]フィールドに割り当てます。 プレイを押して、骨格を表示します。[Thickness (太さ)]または[Default Color (デフォルトの色)]のフィールドを変更して、骨格レンダリングの外観を調整します。注: 現在のところ、編集モードではこれらが表示されません。 Unity Preview中にボディポーズをエクスポートする OVRBodyPoseコンポーネントを[BodyPose (ボディポーズ)]オブジェクトに追加します。このコンポーネントはヘッドセットからボディトラッキングデータを読み出し、BodyPoseController用に変換します。OVRBodyPoseはデフォルトではFull Bodyに設定されていますが、Upper Bodyのみ(脚なし)にも設定できます。
注: Questデバイスの種類によって、ボディトラッキングされたデータの読み方が異なる場合があります。例えば、Quest 3は自動でFull Bodyのボディトラッキングデータをインサイドアウトボディトラッキング(IOBT)で拡張しますが、この機能はQuest 2では提供されません。OVRBodyPoseをBodyPoseController → Source Data Objectフィールドにドラッグします。
これにより、実行時やLinkを使ったUnity Preview中に、ボディトラッキングが骨のPosesを駆動できるようになります。BodyPoseControllerの[Export Asset (アセットをエクスポート)]ボタンはUnity Previewモードで動作します。これはつまり、OVRBodyPoseの実際のボディトラッキングデータから、ボディポーズをエクスポートできるということです。 [BodyPose]オブジェクトを選択し、ヘッドセットを接続してLinkに接続した状態で再生ボタンを押してUnityプレビューを開始します。BodyPoseControllerの[Export Asset (アセットをエクスポート)]ボタンを使って、現在の骨格ポーズをエクスポートします。エクスポートされたデータが、タイムスタンプ付きで生成された/Assets/BodyPoses/フォルダーに表示されます。
注: 「Export Asset (アセットをエクスポート)」は、実行時にはAPKで利用できないUnityエディターの機能です。ボディポーズは、APK実行時ではなく、Unity Previewの間にエクスポートできます。 ボディポーズアセットの名前は、デフォルトのタイムスタンプ付きの名前からポーズを表す名前に変更することが推奨されます。 ボディトラッキングがLink経由で機能するためには、Meta Horizon Linkアプリで開発者実行時機能が有効化されている必要があります。これは、[Settings (設定)] → [Beta (ベータ版)] → [Developer Runtime Features (開発者実行時機能)]で確認することができます。その他のQuest機能がLink経由で正しく動作するには、このユーザーインターフェイスにおける他の設定が必要になることもあります。 (プレビュー時ではなく) Unityエディター内で、生成されたボディポーズアセットファイル を、BodyPoseControllerのSource Data Objectフィールドにドラッグ します。[Refresh T-Pose (Tポーズをリフレッシュ)]、[Refresh Source Data (ソースデータをリフレッシュ)]」の順にクリックすると、2つのポーズ間の骨格のスワップが表示されます。
-
Source Data Objectには、どの
IBodyPoseオブジェクトでも入れることができます。つまり
BodyPoseControllerは、(ポーズの複製のために)別の
BodyPoseControllerからのデータを参照できるということです。または
BodyPoseBoneTransforms (非推奨)や
OVRBodyPoseからのデータを参照することもできます。
BodyPoseにBodyPoseAlignmentDetectorコンポーネントを追加 します。 Pose Aフィールドには、/Assets/BodyPoses/フォルダーから取得した、生成済みのボディポーズファイルをドラッグ&ドロップ します。Pose Bには、このオブジェクト自体をドラッグ&ドロップ して、曖昧性解消ポップアップでBodyPoseControllerコンポーネントを選択 します。BodyPoseオブジェクトを[Skeletal Draw Containers (骨格描画コンテナー)]に ドラッグ&ドロップ します。これにより、骨格のビジュアルが骨格の一致度に基づいて色分けされます。
-
BodyTrackingForFitness シーンは、この
BodyPoseAlignmentDetectorを使ってエクササイズのポーズをカウントするアプリの概念を示すものです。このアプリは、例えば、ユーザーがスクワットをしているかどうかを検出するために使用することができます。
比較に基づいて呼び出すカスタムアクションを設定する BodyPoseAlignmentDetectorは、さまざまな目的に拡張できる柔軟なインターフェイスを提供します。
Pose Eventsの
コールバック は、「Pose A」と「Pose B」の一致度に基づいて、カスタムアクションを自動的にトリガーすることができます。このアクションは、他のすべての
Unityイベント と同様、ロジックやエフェクトをトリガーできます。
- `OnCompliance` triggers once each time all the bone poses comply.
- `OnDeficiency` triggers once each time at least one bone no longer complies.
- `OnCompliantBoneCount` triggers once each time the number of complying bones changes.
一致度(適合度)は、Alignment Wiggle Room構成エントリーによって定義されます。
- The `Maximum Angle Delta` field determines how closely two bones need to align to count as compliant.
- The `Width` field determines how much margin there is between compliant and deficient. For example, if the `Left Arm Upper` must be 30 degrees aligned with a width of 4 degrees, then compliance will trigger when the `Left Upper Arm` is aligned within 28 degrees, and fall out of compliance when it exceeds 32 degrees. This overlap prevents flickering compliance.
コンプライアンス角度は、次の2つの方法のうちいずれかで測定できます。
- **Joint Rotation**: compares the local rotation, including the roll of the bone. This alignment detection is mathematically quite simple, but has the drawback of requiring bones to be perfectly rolled in addition to being perfectly angled.
- **Bone Direction**: compares the direction of the bone from the perspective of a specific bone. This method ignores bone roll, requiring a specific bone to be chosen as the arbiter of direction. This method of comparing angles felt better while testing for specific fitness application use cases, but it requires slightly more processing to test.
BodyPoseControllerのBone Poses配列で位置や回転を変更すると、骨格が変わります。このリストの個々の値を変更することは可能ですが、ボディポーズを作成する方法としては推奨されません。BodyPoseBoneTransformsによって作成された変形を修正するか、Questのボディトラッキングされたデータをプレビューモードで読み出し、Export Assetを押して新しいポーズを作成します。
ボディトラッキングされた骨の位置と向き(および長さ)は実行時に決定されます。ただし、Tポーズデータの静的コピーはFullBodySkeletonTPose.csに保存され、エディター内のBodyPoseControllerに適用されます。
特定の骨のポーズをEditorで変更する方法としては、BodyPoseBoneTransforms → BoneTransformsに移動し、リストを表示して希望の骨をクリックする方法が推奨されます。オブジェクトをクリックすると階層が表示されます。階層内の該当する変換をクリックして選択し、変換の回転を変更します。
BodyPoseAlignmentDetectorは、SkeletalDrawContainerが正しく設定されている限り、エディターが表示されている間に、ボディポーズを変えながら骨の色を調整します。
このセクションを完了した開発者は、以下のことができるようになります。
キャリブレーションAPIを効果的に活用できる状況を理解する。 キャリブレーションAPIを応用して、自動検出された高さを具体的な高さでオーバーライドする。 このセクションでは、キャリブレーションAPIを活用するタイミングと、キャリブレーションAPIを使って、アプリ固有のキャリブレーションで自動検出された高さをオーバーライドする方法について説明します。
自動キャリブレーションは、ヘッドセットを装着している人の高さをシステムが判定しようとするプロセスです。高さは、ユーザーが立っているか、しゃがんでいるか、座っているかを検出するために必要です。自動キャリブレーションルーチンは、サービス作成後の最初の10秒以内に実行されるため、サービスをリクエストするときの初期状態が重要になります。サービス起動時に、ユーザーが立っていることがアプリによって確認できることが理想です。座っている場合は、腕を伸ばして、腕を完全に伸ばした状態で直径約0.3メートル(1フィート)の円を描くこともできます。この場合、翼幅によって高さを推定することができます。
ただし、座ったまま腕を伸ばしていない場合など、自動キャリブレーションが十分に機能しない場合があります。アプリがすでに初期化プロセスによって人物の高さを判定していて、その使用を優先するという状況も考えられます。その2つのユースケース向けに、The SuggestBodyTrackingCalibrationOverride()と ResetBodyTrackingCalibration関数を提供しています。これを使って自動キャリブレーションをオーバーライドできます。
OVRBody.csでは、SuggestBodyTrackingCalibrationOverride(float height)を使用してユーザーの高さをオーバーライドできます。高さはメートル単位で指定します。
このセクションでは、ボディトラッキングでよくある問題を解決する方法を詳細に説明します。このセクションを完了すると、以下を理解できるようになります。
プロジェクト関連の一般的なエラーを確認する方法 トラッキングサービスが実行されているかどうかを判断する方法 特によくある現象とその原因 トラブルシューティングを開始するには、
[Edit (編集)] >
[Project Settings (プロジェクト設定)] >
[Meta XR] に示されている警告を確認し、表示された問題を解決します。詳しくは、
Movement SDKのトラブルシューティング をご覧ください。
注: Linkを設定するには、
Link をご覧ください。
adb logcat -s Unityのコマンドで、多くの問題をデバッグできます。それ以外の場合は、以下の解決策を実施してください。
ボディトラッキングのどのサービスがアクティブかを見る 開発中にボディトラッキングがうまくいかない問題に遭遇するかもしれません。これは、ボディトラッキングのアクセス許可が有効になっていないなど、いくつかの問題に起因している可能性があります。ただし、すべてのアクセス許可が設定されているにもかかわらず、サービスが正常に開始されない場合は、次のコマンドを使用してどのサービスがアクティブになっているかをADBで確認することができます。
adb shell dumpsys activity service com.oculus.bodyapiservice.BodyAPIService
ボディトラッキングがアクティブでない場合、このコマンドは以下を返します。
“No services match: com.oculus.bodyapiservice.BodyAPIService”
ボディトラッキングサービスが有効の場合、出力は以下のようになるはずです。
SERVICE com.oculus.bodyapiservice/.BodyApiService 98564e0 pid=17192 user=0
Client:
Begin_BodyApiService
{
"fbs" : true,
"iobt" : false,
"num_updates_counter" : 26693,
"usingEngineV1" : false
}
End_BodyApiService
fbsの行は、ジェネレーティブレッグがアクティブかどうかを示しています。 iobtの行は、IOBTがアクティブかどうかを示しています。 アクティブであるということは、その時点で少なくとも1つのキャラクターがサービスを使っているということです。該当するボディトラッキングサービスを利用して実行されているキャラクターがない場合、ブーリアン値はfalseになります。
IOBTは、推奨されるフィデリティモードであり、APIの要件ではありません。このシステムはシステム全体の性能を管理するために実装されています。開発者は、IOBTが他の機能と組み合わせて実行される各モードをテストし、要求された他のサービスとIOBTとの併用がサポートされることを確認するようにしてください。具体的に、システムが高度に活用された状態(例: パススルーとFast Motion Mode (FMM)またはコントローラーが有効化されている、またはシステムがおおむね高CPU負荷状態にある)で、ボディトラッキングのためにIOBTを有効化することが求められた場合、ボディトラッキングは低フィデリティモードで有効化されます(IOBTなし)。ユーザーには同じ骨格アウトプットが表示されますが、IOBTによって提供されるトラッキング機能の一部は利用できません(例: エルボートラッキング、傾き状態での背骨位置の補正)。
PCではなくQuestデバイス上で実行される場合、ボディトラッキングは、コントローラーでは動作しますが、手では動作しません [Settings (設定)] > [Movement Tracking (Movementトラッキング)] > [Hand Tracking (ジェスチャーコントロール)] で、ジェスチャーコントロールのアクセス許可が、デバイスで有効になっているか確認します。
該当プロジェクトの設定で、[Hand Tracking (ジェスチャーコントロール)] と[Controllers (コントローラー)] が有効になっていることを確認します。
アプリが起動時に[Hand Tracking (ジェスチャーコントロール)] をリクエストすることを確認します。
ボディトラッキングは、HMD上で直接実行されている場合には動作しますが、Link経由で実行すると失敗します データをサポートするUSBケーブルで接続していることを確認します。これは、PC上のMeta Quest Linkアプリでの[Device Settings (デバイスの設定)]の下で、[Link Cable (リンクケーブル)] > [Connect Your Headset (ヘッドセットを接続)] > [Continue (続行)] によりテストできます。
PC上のMeta Quest Linkアプリで[Developer Runtime Features (開発者実行時機能)]が有効になっていることを確認します。そのためには、[Settings (設定)] > [Beta (ベータ版)] > [Developer Runtime Features (開発者実行時機能)] に移動します。
ボディトラッキングが動作していません。コントローラー(またはジェスチャーコントロールを使う場合には手)を使っている場合、コントローラーがトラッキングされていることを確認してください。ゲームコンテキスト外から確認できます。
さらに、デバッグコマンドadb shell dumpsys activity service com.oculus.bodyapiservice.BodyAPIServiceを使って、ボディトラッキングが実行されているかどうか調べます。
ヘッドセットをいったん外してから装着するとボディトラッキングエラーが発生する場合は、ヘッドセットを装着した後にHMDRemountRestartTrackingを使うことによってボディトラッキングを再開することができます。このスクリプトは、ヘッドセットを外して装着した後に、プロジェクトのOVRRuntimeSettings関節セットとトラッキングフィデリティの設定を再度有効にします。
体がバイクのポーズをしているときに上半身は適切だが膝が曲がっている 脚のあるキャラクターでIOBTを使っている場合、2骨IKを使って脚をまっすぐにできます。MovementパッケージのPackages/com.meta.movement/Shared/Prefabs/Character/ArmatureSkinningUpdateGreenに、その例があります。
開発者は、骨格名やブレンドシェイプとそのリターゲティングされたキャラクターとの不一致などの問題をデバッグできるよう、命名規則とOpen XR呼び出しを十分に理解する必要があります。
このセクションの情報には、背景情報を読み手に提供するため、OpenXRインターフェイスへの変更が反映されています。このインターフェイスをUnityで使っている場合、これらのAPIを直接扱うことはないため、次のセクションはスキップすることができます。APIの仕様については、
Movement SDK OpenXRのドキュメント をご覧ください。要約すると、既存のOpenXRボディトラッキング拡張機能では、次の4つの関数が公開されています。
xrCreateBodyTrackerFB - ボディトラッカーを作成する。xrGetBodySkeletonFB - 基準となるT形ポーズの関節セットを取得する。xrLocateBodyJointsFB - 関節の現在の位置情報を取得する。xrDestroyBodyTrackerFB - トラッカーを破壊する。この新しいボディトラッキングの全身拡張機能でもこれらの関数が再利用されていますが、新しい関節セットを使ったトラッカーの作成がサポートされるようになりました。特にXrBodyJointSetFB列挙が拡張されて、新しい値XR_BODY_JOINT_SET_FULL_BODY_METAが追加されています。これにより、下半身全体の関節が必要であることをユーザーが指定できるようになりました(現在の上半身に、新しい下半身関節を追加)。
下半身トラッキングができるトラッカーを作成するには、トラッカー作成時に新しい関節セットを指定します。
XrBodyTrackerCreateInfoFB
createInfo{XR_TYPE_BODY_TRACKER_CREATE_INFO_FB};
createInfo.bodyJointSet = XR_BODY_JOINT_SET_FULL_BODY_META;
XrBodyTrackerFB bodyTracker;
xrCreateBodyTrackerFB(session, &createInfo, &bodyTracker));
関節の位置指定(または関節のデフォルト位置の検出)は、既存のボディトラッキング拡張機能と同じです。この関節セットはXrFullBodyJointMETA列挙と同等になります。同じ70個の上半身関節と追加で14個の下半身関節を持ちます。FullBodyJoint列挙は次のようになります。
typedef enum XrFullBodyJointMETA{
XR_FULL_BODY_JOINT_ROOT_META = 0,
XR_FULL_BODY_JOINT_HIPS_META = 1,
XR_FULL_BODY_JOINT_SPINE_LOWER_META = 2,
XR_FULL_BODY_JOINT_SPINE_MIDDLE_META = 3,
XR_FULL_BODY_JOINT_SPINE_UPPER_META = 4,
XR_FULL_BODY_JOINT_CHEST_META = 5,
XR_FULL_BODY_JOINT_NECK_META = 6,
XR_FULL_BODY_JOINT_HEAD_META = 7,
XR_FULL_BODY_JOINT_LEFT_SHOULDER_META = 8,
XR_FULL_BODY_JOINT_LEFT_SCAPULA_META = 9,
XR_FULL_BODY_JOINT_LEFT_ARM_UPPER_META = 10,
XR_FULL_BODY_JOINT_LEFT_ARM_LOWER_META = 11,
XR_FULL_BODY_JOINT_LEFT_HAND_WRIST_TWIST_META = 12,
XR_FULL_BODY_JOINT_RIGHT_SHOULDER_META = 13,
XR_FULL_BODY_JOINT_RIGHT_SCAPULA_META = 14,
XR_FULL_BODY_JOINT_RIGHT_ARM_UPPER_META = 15,
XR_FULL_BODY_JOINT_RIGHT_ARM_LOWER_META = 16,
XR_FULL_BODY_JOINT_RIGHT_HAND_WRIST_TWIST_META = 17,
XR_FULL_BODY_JOINT_LEFT_HAND_PALM_META = 18,
XR_FULL_BODY_JOINT_LEFT_HAND_WRIST_META = 19,
XR_FULL_BODY_JOINT_LEFT_HAND_THUMB_METACARPAL_META = 20,
XR_FULL_BODY_JOINT_LEFT_HAND_THUMB_PROXIMAL_META = 21,
XR_FULL_BODY_JOINT_LEFT_HAND_THUMB_DISTAL_META = 22,
XR_FULL_BODY_JOINT_LEFT_HAND_THUMB_TIP_META = 23,
XR_FULL_BODY_JOINT_LEFT_HAND_INDEX_METACARPAL_META = 24,
XR_FULL_BODY_JOINT_LEFT_HAND_INDEX_PROXIMAL_META = 25,
XR_FULL_BODY_JOINT_LEFT_HAND_INDEX_INTERMEDIATE_META = 26,
XR_FULL_BODY_JOINT_LEFT_HAND_INDEX_DISTAL_META = 27,
XR_FULL_BODY_JOINT_LEFT_HAND_INDEX_TIP_META = 28,
XR_FULL_BODY_JOINT_LEFT_HAND_MIDDLE_METACARPAL_META = 29,
XR_FULL_BODY_JOINT_LEFT_HAND_MIDDLE_PROXIMAL_META = 30,
XR_FULL_BODY_JOINT_LEFT_HAND_MIDDLE_INTERMEDIATE_META = 31,
XR_FULL_BODY_JOINT_LEFT_HAND_MIDDLE_DISTAL_META = 32,
XR_FULL_BODY_JOINT_LEFT_HAND_MIDDLE_TIP_META = 33,
XR_FULL_BODY_JOINT_LEFT_HAND_RING_METACARPAL_META = 34,
XR_FULL_BODY_JOINT_LEFT_HAND_RING_PROXIMAL_META = 35,
XR_FULL_BODY_JOINT_LEFT_HAND_RING_INTERMEDIATE_META = 36,
XR_FULL_BODY_JOINT_LEFT_HAND_RING_DISTAL_META = 37,
XR_FULL_BODY_JOINT_LEFT_HAND_RING_TIP_META = 38,
XR_FULL_BODY_JOINT_LEFT_HAND_LITTLE_METACARPAL_META = 39,
XR_FULL_BODY_JOINT_LEFT_HAND_LITTLE_PROXIMAL_META = 40,
XR_FULL_BODY_JOINT_LEFT_HAND_LITTLE_INTERMEDIATE_META = 41,
XR_FULL_BODY_JOINT_LEFT_HAND_LITTLE_DISTAL_META = 42,
XR_FULL_BODY_JOINT_LEFT_HAND_LITTLE_TIP_META = 43,
XR_FULL_BODY_JOINT_RIGHT_HAND_PALM_META = 44,
XR_FULL_BODY_JOINT_RIGHT_HAND_WRIST_META = 45,
XR_FULL_BODY_JOINT_RIGHT_HAND_THUMB_METACARPAL_META = 46,
XR_FULL_BODY_JOINT_RIGHT_HAND_THUMB_PROXIMAL_META = 47,
XR_FULL_BODY_JOINT_RIGHT_HAND_THUMB_DISTAL_META = 48,
XR_FULL_BODY_JOINT_RIGHT_HAND_THUMB_TIP_META = 49,
XR_FULL_BODY_JOINT_RIGHT_HAND_INDEX_METACARPAL_META = 50,
XR_FULL_BODY_JOINT_RIGHT_HAND_INDEX_PROXIMAL_META = 51,
XR_FULL_BODY_JOINT_RIGHT_HAND_INDEX_INTERMEDIATE_META = 52,
XR_FULL_BODY_JOINT_RIGHT_HAND_INDEX_DISTAL_META = 53,
XR_FULL_BODY_JOINT_RIGHT_HAND_INDEX_TIP_META = 54,
XR_FULL_BODY_JOINT_RIGHT_HAND_MIDDLE_METACARPAL_META = 55,
XR_FULL_BODY_JOINT_RIGHT_HAND_MIDDLE_PROXIMAL_META = 56,
XR_FULL_BODY_JOINT_RIGHT_HAND_MIDDLE_INTERMEDIATE_META = 57,
XR_FULL_BODY_JOINT_RIGHT_HAND_MIDDLE_DISTAL_META = 58,
XR_FULL_BODY_JOINT_RIGHT_HAND_MIDDLE_TIP_META = 59,
XR_FULL_BODY_JOINT_RIGHT_HAND_RING_METACARPAL_META = 60,
XR_FULL_BODY_JOINT_RIGHT_HAND_RING_PROXIMAL_META = 61,
XR_FULL_BODY_JOINT_RIGHT_HAND_RING_INTERMEDIATE_META = 62,
XR_FULL_BODY_JOINT_RIGHT_HAND_RING_DISTAL_META = 63,
XR_FULL_BODY_JOINT_RIGHT_HAND_RING_TIP_META = 64,
XR_FULL_BODY_JOINT_RIGHT_HAND_LITTLE_METACARPAL_META = 65,
XR_FULL_BODY_JOINT_RIGHT_HAND_LITTLE_PROXIMAL_META = 66,
XR_FULL_BODY_JOINT_RIGHT_HAND_LITTLE_INTERMEDIATE_META = 67,
XR_FULL_BODY_JOINT_RIGHT_HAND_LITTLE_DISTAL_META = 68,
XR_FULL_BODY_JOINT_RIGHT_HAND_LITTLE_TIP_META = 69,
// Lower body joints:
XR_FULL_BODY_JOINT_LEFT_UPPER_LEG_META = 70,
XR_FULL_BODY_JOINT_LEFT_LOWER_LEG_META = 71,
XR_FULL_BODY_JOINT_LEFT_FOOT_ANKLE_TWIST_META = 72,
XR_FULL_BODY_JOINT_LEFT_FOOT_ANKLE_META = 73,
XR_FULL_BODY_JOINT_LEFT_FOOT_SUBTALAR_META = 74,
XR_FULL_BODY_JOINT_LEFT_FOOT_TRANSVERSE_META = 75,
XR_FULL_BODY_JOINT_LEFT_FOOT_BALL_META = 76,
XR_FULL_BODY_JOINT_RIGHT_UPPER_LEG_META = 77,
XR_FULL_BODY_JOINT_RIGHT_LOWER_LEG_META = 78,
XR_FULL_BODY_JOINT_RIGHT_FOOT_ANKLE_TWIST_META = 79,
XR_FULL_BODY_JOINT_RIGHT_FOOT_ANKLE_META = 80,
XR_FULL_BODY_JOINT_RIGHT_FOOT_SUBTALAR_META = 81,
XR_FULL_BODY_JOINT_RIGHT_FOOT_TRANSVERSE_META = 82,
XR_FULL_BODY_JOINT_RIGHT_FOOT_BALL_META = 83,
XR_FULL_BODY_JOINT_COUNT_META = 84,
XR_FULL_BODY_JOINT_NONE_META = 85,
XR_FULL_BODY_JOINT_MAX_ENUM_META = 0x7FFFFFFF
} XrFullBodyJointFB;
XrBodyJointLocationFB
jointLocations[XR_FULL_BODY_JOINT_COUNT_META];
XrBodyJointLocationsFB
locations{XR_TYPE_BODY_JOINT_LOCATIONS_FB};
locations.jointCount = XR_FULL_BODY_JOINT_COUNT_META;
locations.jointLocations = locations;
XrBodyJointsLocateInfoFB
locateInfo{XR_TYPE_BODY_JOINTS_LOCATE_INFO_FB};
locateInfo.baseSpace = GetStageSpace();
locateInfo.time = GetPredictedDisplayTime();
xrLocateBodyJointsFB(bodyTracker, &locateInfo, &locations));
このコードの実行後、locations.isActiveがtrueだと仮定すると、jointLocations[XR_FULL_BODY_JOINT_RIGHT_UPPER_LEG_META]は、上腿関節のポーズを表します。
アプリは、新しいボディトラッキング調整拡張機能を利用して、ユーザーの身長に関するオーバーライド値を提供することで、システムが行う自動キャリブレーションをオーバーライドすることができます。
XrBodyTrackerCreateInfoFB
createInfo{XR_TYPE_BODY_TRACKER_CREATE_INFO_FB};
createInfo.bodyJointSet = XR_BODY_JOINT_SET_FULL_BODY_META;
XrBodyTrackerFB bodyTracker;
xrCreateBodyTrackerFB(session, &createInfo, &bodyTracker));
XrBodyTrackingCalibrationInfoMETA calibrationInfo = {XR_TYPE_BODY_TRACKING_CALIBRATION_INFO_META};
calibrationInfo.bodyHeight = 2.5;
xrSuggestBodyTrackingCalibrationMETA(bodyTracker, &calibrationInfo);
このキャリブレーションで使われるオーバーライド用の身長はメートルで指定します。
アプリでは、現在のキャリブレーションステータスをクエリし、現行のボディが適切に調整されているかどうかに基づいて、ボディトラッキングの結果を使うかどうかを判断することもできます。返された骨格を調整している間に、スケールが変わることがあります。
アプリでは、現在のキャリブレーションステータスを判別するために、xrLocateBodyJointsFBを使ってボディポーズをクエリする際に、XrBodyJointLocationsFB構造体の次のポインターを通じて<XrBodyTrackingCalibrationStatusMETAを渡すことができます。
XrBodyJointLocationFB
jointLocations[XR_FULL_BODY_JOINT_COUNT_META];
XrBodyJointLocationsFB
locations{XR_TYPE_BODY_JOINT_LOCATIONS_FB};
locations.jointCount = XR_FULL_BODY_JOINT_COUNT_META;
locations.jointLocations = locations;
XrBodyTrackingCalibrationStatusMETA calibrationStatus = {XR_TYPE_BODY_TRACKING_CALIBRATION_STATUS_META};
Locations.next = &calibrationStatus;
XrBodyJointsLocateInfoFB
locateInfo{XR_TYPE_BODY_JOINTS_LOCATE_INFO_FB};
locateInfo.baseSpace = GetStageSpace();
locateInfo.time = GetPredictedDisplayTime();
xrLocateBodyJointsFB(bodyTracker, &locateInfo, &locations));
if (calibrationStatus.status != XR_BODY_TRACKING_CALIBRATION_STATE_VALID_META) {
// Don’t use the body tracking result
}
typedef enum XrBodyTrackingCalibrationStateMETA {
XR_BODY_TRACKING_CALIBRATION_STATE_VALID_META = 0;
XR_BODY_TRACKING_CALIBRATION_STATE_CALIBRATING_META = 1;
XR_BODY_TRACKING_CALIBRATION_STATE_INVALID_META = 2;
} XrBodyTrackingCalibrationStateMETA;
キャリブレーション結果が有効とは、ポーズを安全に使用できることを意味します。ボディポーズが調整中とは、まだキャリブレーションが実行中であり、ポーズに誤りがある可能性があることを意味します。キャリブレーション結果が無効とは、ポーズを安全に使用できないことを意味します。
開発者には以下が求められます。
互換性を確保できるようにISDKとMSDKを設定する方法を理解する。 Movement SDKを使ってボディトラッキングでシーンをリグし、サンプルのバーチャルオブジェクトをInteraction SDKで操作できるようにする。 Unityパッケージの中に、
MovementISDKIntegrationシーン があります。
[Unity-Movement] >
[Samples~ (サンプル~)] >
[AdvancedSamples (高度なサンプル)] >
[Scenes (シーン)] で見つけることができます。このサンプルは、リターゲティングされたMovement SDK (MSDK)ボディに対して、Interaction SDK (ISDK)の手の動きを適用する方法を示しています。
MSDKを使ってキャラクターに体の動きをリターゲティングしたいと思っている開発者は、このシーンを参考にすることができます。また、このシーンには、ISDKによって提供されるインタラクションを使って仮想オブジェクトを操作するキャラクターもいます。特に、つかむ動作やタッチする動作に制限を使う場合、ISDKはトラッキングされている位置から指の位置を設定し直します。こうすることで、仮想オブジェクト(コップなど)をつかんだり仮想スクリーンを押したりする際にも正しい表示になります。これらは実際の指の位置と異なるため、リターゲティング後のキャラクターの指や肘の位置を調整して、それに対応する新しい仮想位置になるようにすることが必要です。その方法がこのサンプルで示されています。
Interaction SDKのドキュメントとクイックスタートガイドについては、
こちら をご覧ください。
CapsenseをISDKと共に 使い、以下のようにして
OVRHands prefabを組み込んでください。
CapsenseをISDKと共に使えるようにするには、[Controller Driven Hand Poses (コントローラー駆動ハンドポーズ)] (OVRManagerにある)を[Natural (自然)] に設定します。 さらに、OVRCameraRig階層にあるOVRHandPrefabオブジェクトを見つけ、[Show State (状態を表示する)] オプションを[Always (常に)] に設定します。これでコントローラーで手を操作できるようになります。 Interaction SDKとMovement SDKのコンポーネント統合 MovementISDKIntegrationサンプルシーンで使われている[BuildingBlock] Camera Rigオブジェクトを、カットアンドペースト操作によって、またはprefabを作ることによって、そのまま直接コピーすることをおすすめします。直接コピーをするのではなく、プロジェクトでこれらのスクリプトを手動で設定するには、次のようにします。
OVRHandの各インスタンスの[Show State (表示状態)]が、[Always (常時)]に設定されているようにしてください。
各HandGrabVisualの、HandGrabGlowとHandGrabInteractorのコンポーネントを有効にします。
ISDKハンドインタラクターが設定されたら、ISDKハンドの骨がキャラクターにリターゲットされる前に、まずボディの骨格に影響を及ぼす必要があります。各キャラクター上で有効にするには、そのPoseRetargeterコンポーネントに対して以下の手順を実行します。
[Source Processors (ソースプロセッサー)]フィールドに移動します。[+]記号をクリックします。
新しいプロセッサーの[Type (タイプ)]フィールドを[ISDK]に変えます。
[Setup (設定)]をクリックします。プロセッサーでISDKの左右の合成手オブジェクトを検出することを確認します。
これで、ISDKインタラクションに必要な基本コンポーネントを追加できました。
ハンドグラブインタラクション について扱ったチュートリアルなど、いずれかのチュートリアルに進むことも、このサンプルを使い続けることもできます。
制約の調整後もキャラクターに見た目上の問題がある場合は、それを解決するためにモデルやリギングに変更を加えることが必要になることがあります。
キャラクターの高さをさまざまなユーザーの高さに合わせて修正する キャラクターアニメーションが使用されている場合、キャラクターの頂点は通常、そのメッシュの一部の要素に影響を与えます。ただし、ボディトラッキングが、さまざまなユーザーの高さに対応するようメッシュをスケーリングする場合があり、これが視覚的なアーティファクトにつながる可能性があります。これには、手のメッシュが前腕メッシュと切断された状態(伸長)や、膝下のメッシュが膝に圧縮された状態(圧縮)が含まれます。
下の図では、関節の変換が実施されるようにするため、キャラクターの肌の影響が手足の関節と共有されていません。左の画像は、足首の関節からメッシュウェイトがない元のキャラクターを示しています。右の画像は、足首から脛へとウェイトの影響が及んでいることを示しています。
調整されたウェイトの影響により、固定された足首は、下の脛に影響を与える変形と共に動くようになっています。
下の別の例は、太ももから膝の関節に及ぶウェイトの影響を示しています。左の画像は、該当領域にウェイトがない状態を示し、右の画像は、ウェイトの影響が膝から太ももに及んでいることを示しています。
固定された膝は、変形の結果として大腿部と膝に影響を与えながら動くようになっています。
結果の動きを以下のgifに示します。左の例はウェイトに変化を加えていないもの、右の例はウェイトを調整した結果を示しています。
一般的に、関節の影響範囲を少なくとも関節から6インチ以上、上に延ばすことをお勧めします。これにより、伸長や圧縮の際にさらに多くの頂点が影響を受けるようになります。以下の動画では、さまざまな身長や体格に対応できるようウェイトを調節する方法を示しています。