PICO4 での MRTK3 の使用の概要

説明する

このドキュメントは、GitHub オープン ソース プロジェクトPicoMRTK3        の学習概要です

1. MRTK3の使用

        MRTK3は現在パブリックプレビュー版であり、機能がまだ安定していませんが、基本的な使用には問題ありません。詳細については、 「MRTK3」を参照してください

1. パッケージ本体を Unity プロジェクトに追加します

(1) 複合現実機能ツールの利用

        複合現実機能ツールを使用して、MRTK3 パッケージ本体を Unity プロジェクトにインポートします。ツールのダウンロード アドレス:複合現実機能ツール

1) ツールのホームページ 

        このツールはEXEをインストールする必要はありませんので、ダウンロード後、適当なパスに置き、デスクトップにショートカットを作成してください。開いたら、ホームページで「開始」をクリックします。

2) Unity プロジェクトのパスを選択します 

        選択したパスは、アセットを含む Unity プロジェクトのパスです。パスを選択した後、「機能の検出」をクリックします。

3) MRTK3 封入体の選択 

        MRTK3 メニューの右側にある [すべて選択] をクリックして、MRTK3 関連のパッケージをすべて選択します。

        OpenXR プラグインのインポート後、プロジェクト パッケージはエラーを報告するため、当面は OpenXR プラグインをインポートする必要はありません。OpenXR プラグインは、プラットフォーム サポート メニューの下にあります。 

        MRTK3 パッケージ本体を選択した後、「機能の取得」をクリックします。

4) インポート 

        「インポート」をクリックするだけです。インポート後、ツールを終了します。

2. Unity プロジェクトにサンプルを追加する

        MRTK3 は、疎結合された個別の Unity Package Manager パッケージのコレクションで構成されており、サンプル シーンは含まれなくなりました。代わりに、配信する Unity プロジェクトを含む UnityProjects フォルダーを Git リポジトリの最上位に維持します。現在、このフォルダーには MRTKDevTemplate プロジェクトが含まれています。このプロジェクトにはすべてのサンプル シーンが含まれており、推奨される最適な設定に一致するように構成されています。

(1) Microsoft Mixed Reality Github ページにアクセスします

        アドレス: MixedRealityToolkit-Unity

(2) mrtk3 ブランチを選択します 

        直結入口:mrtk3

(3) 圧縮パッケージをクローンまたはダウンロードします

        git を使用してプロジェクトのクローンを作成するか、圧縮パッケージを直接ダウンロードします。 

(4) Unityプロジェクトにリソースをコピー

        ダウンロードした圧縮パッケージを解凍した後、UnityProjects -->MRTKDevTemplate -->Assets を開き、内部の Analyzers、Audio、BuildAssets、Editor、Example Assets、Prefabs、Profiles、Scenes、Scripts フォルダーを Unity プロジェクトの Assets パスにコピーします。もちろん、管理を容易にするために、Assets パスの下に MRTKSamples という名前のフォルダーを作成し、上記のフォルダーを MRTKSamples フォルダーの下にコピーすることもできます。

2. PICOプラットフォームへの適応

1.PICO SDKの設定

詳細については、PICO ドキュメント センター        を参照してください

(1) PICO Unity Integration SDKのインポート

1) SDKのダウンロード

PICO SDK ダウンロード センター        に移動して、SDK の最新バージョンをダウンロードします。

2) ダウンロードしたSDK圧縮パッケージを解凍します。

        Unity プロジェクトの Assets と同じパスに PICOUnityIntegrationSDK という名前のフォルダーを作成し、ダウンロードした圧縮パッケージをこのフォルダーにコピーして解凍します。Unityプロジェクトに配置する理由は、後でUnityパッケージマネージャーからSDKをインポートする際にSDKのパスがバインドされるためで、バージョン管理時にSDKを失わないようにするため、SDKをUnityプロジェクトに配置するのが最も安全です。 Unityプロジェクト。

        解凍後、package.json ファイルを含むフォルダーが得られます。これは後続のインポートに使用されます。

3) Unity Package ManagerでSDKをインポートする 

        図に示すように、「+」記号をクリックし、もう一度「ディスクからパッケージを追加...」をクリックします。

4) package.json ファイルを選択してインポートします。 

5) システム設定を入力し、XR Interaction Toolkit をアップグレードします。 

        このプロジェクトで使用されている Unity のバージョンは 2021.3.20f1c1 であるため、SDK をインポートすると、入力システムの設定と XR Interaction Toolkit のアップグレードを求めるウィンドウが自動的にポップアップ表示されます。Unity の以前のバージョン (2019.4.x など) の場合は、パッケージ マネージャーに移動して XR Interaction Toolkit を自分でアップグレードし、ポップアップ ウィンドウのプロンプトに従って設定する必要があります。

        ここで、「はい」をクリックし、その後に表示されるポップアップウィンドウで「バックアップを作成しました。続行!」をクリックします。その後、Unity が再起動され、再起動が完了したら以降の設定を続行します。 

6) 「適用」をクリックします 

        [適用] をクリックした後、Unity がコンパイルされたら、もう一度 [閉じる] をクリックしてウィンドウを閉じます。

(2) プロジェクト構成

1) PICO XR プラグインを有効にする

        [プロジェクト設定] ウィンドウで、[XR プラグイン管理] --> [Android 設定] アイコンをクリックし、PICO をチェックします。 

2) Android プラットフォームのその他の設定

        会社名、製品名、バージョン、その他の設定の項目が含まれます。 

2. MRTK3はPICOに適応します

(1) オープンソース プロジェクトをクローンまたはダウンロードする

        プロジェクトアドレス: PicoMRTK3

(2) リソースのコピー

        ダウンロードしたプロジェクトを解凍した後、そのアセットを開き、Scripts パスの下にある PicoMRTK3Support フォルダーを Unity プロジェクトの Scripts パスにコピーします。

(3) スクリプト定義シンボルの設定

        [プロジェクト設定] --> [プレーヤー] --> [その他の設定] --> [スクリプト コンパイル] で設定し、PICO_INSTALL と MRTK3_INSTALL を追加します。 

        追加が完了したら、「適用」をクリックし、Unity がコンパイルされたら、後続の構成を実行します。

(4) MRTK3の設定

        「プロジェクト設定」-->「MRTK3」で設定します。

1) 設定ファイルの設定

        デフォルトの構成ファイルを選択するだけです。

2) MRTK サブシステムの設定

① アクセシビリティサブシステムの設定

        [MRTK Accessibility Subsystem] にチェックを入れて、設定アセットを構成します。デフォルトでは、チェックおよび構成されていますが、設定されていない場合は、手動でセットアップし、デフォルトを選択するように資産を設定できます。 

②HandsAggregatorSubsystemの設定

        Pico MRTK Hands Aggregator Subsystem を確認し、設定資産を構成します。デフォルトを選択するようにアセットを設定します。

③ ハンズサブシステムの設定

        Pico Hands API のサブシステムを確認します。 

(5) シーン設定

        MRTK サンプルの「HandInteractionExamples」シーンをコピーし、それに基づいて設定できます。コピーしたシーンで、エラーを報告したプレハブを削除することに注意してください。 

1) PXR_Manager コンポーネントを追加します

        PXR_Manager コンポーネントを MRTK XR Rig オブジェクトに追加し、Hand Tracking をチェックします。 

2) 左手と右手を設定する

①ハンドモデルプレハブ作成

        「パッケージ」-->「PICO Integration」-->「アセット」-->「リソース」-->「プレハブ」を開き、HandLeft と HandRight をシーンの階層にドラッグし、プレハブのバインドを解除します。

        左手を例として、PicoMRTKHandVisualizer スクリプト コンポーネントを HandLeft オブジェクトに追加し、関連するパラメーターを構成します。 

        上記のパラメータのほとんどはオブジェクト自体のサブノードであり、5 本の指のノードを 1 つずつドラッグするだけです。

        オブジェクトの下の l_handMesh ノードを選択し、下の図に示すように、そのマテリアルを Packages --> MRTK Input --> Visualizers --> RiggedHandVisualizer のパスにある 3 つのマテリアルに置き換えます。 

        設定後、Assets配下のカスタムパスに作成されたPrefabsフォルダにHandLeftオブジェクトをドラッグしてプレハブ化します。

        同様に、HandRight プレハブを作成します。

②左手と右手の構成

        MRTK XR Rig の下の MRTK LeftHand Controller を選択し、作成した左手プレハブを Model Prefab にドラッグし、MRTK XR Rig の下の Camera Offset オブジェクトを Model Parent にドラッグします。

        同様に右手も設定します。 

3) MRTK3のスクリプトを変更します。

① ArticulatedHandControllerを修正する

        このスクリプトは、MRTK XR リグの下の MRTK LeftHand コントローラー オブジェクトと MRTK RightHand コントローラー オブジェクトにマウントされます。主にUpdateInputメソッドの修正と条件付きコンパイル命令の追加であり、修正後のメソッドコードは以下の通りです。

/// <inheritdoc />
protected override void UpdateInput(XRControllerState controllerState)
{
    base.UpdateInput(controllerState);

    using (UpdateTrackingInputPerfMarker.Auto())
{
    if (controllerState == null)
    return;

    // Cast to expose hand state.
    ArticulatedHandControllerState handControllerState = controllerState as ArticulatedHandControllerState;

    // If we still don't have an aggregator, then don't update selects.
    if (XRSubsystemHelpers.HandsAggregator == null) { return; }

    bool gotPinchData = XRSubsystemHelpers.HandsAggregator.TryGetPinchProgress(
    handNode,
    out bool isPinchReady,
    out bool isPinching,
    out float pinchAmount
);

    // If we got pinch data, write it into our select interaction state.
    if (gotPinchData)
{
    // Workaround for missing select actions on devices without interaction profiles
    // for hands, such as Varjo and Quest. Should be removed once we have universal
    // hand interaction profile(s) across vendors.

    // Debounce the polyfill pinch action value.
    bool isPinched = pinchAmount >= (pinchedLastFrame ? 0.9f : 1.0f);
    #if !PICO_INSTALL
    // Inject our own polyfilled state into the Select state if no other control is bound.
    if (!selectAction.action.HasAnyControls())
{
    controllerState.selectInteractionState.active = isPinched;
    controllerState.selectInteractionState.activatedThisFrame = isPinched && !pinchedLastFrame;
    controllerState.selectInteractionState.deactivatedThisFrame = !isPinched && pinchedLastFrame;
}

    if (!selectActionValue.action.HasAnyControls())
{
    controllerState.selectInteractionState.value = pinchAmount;
}

    // Also make sure we update the UI press state.
    if (!uiPressAction.action.HasAnyControls())
{
    controllerState.uiPressInteractionState.active = isPinched;
    controllerState.uiPressInteractionState.activatedThisFrame = isPinched && !pinchedLastFrame;
    controllerState.uiPressInteractionState.deactivatedThisFrame = !isPinched && pinchedLastFrame;
}

    if (!uiPressActionValue.action.HasAnyControls())
{
    controllerState.uiPressInteractionState.value = pinchAmount;
}

    pinchedLastFrame = isPinched;
    #else
    // Debounced.

    controllerState.selectInteractionState.active = isPinched;
    controllerState.selectInteractionState.activatedThisFrame = isPinched && !pinchedLastFrame;
    controllerState.selectInteractionState.deactivatedThisFrame = !isPinched && pinchedLastFrame;
    controllerState.selectInteractionState.value = pinchAmount;


    controllerState.uiPressInteractionState.active = isPinched;
    controllerState.uiPressInteractionState.activatedThisFrame = isPinched && !pinchedLastFrame;
    controllerState.uiPressInteractionState.deactivatedThisFrame = !isPinched && pinchedLastFrame;
    controllerState.uiPressInteractionState.value = pinchAmount;

    pinchedLastFrame = isPinched;
    #endif
    }

    handControllerState.PinchSelectReady = isPinchReady;
}
}
②HandConstraintPalmUpを修正する

        このスクリプトは HandMenu オブジェクトにマウントされます。PICO SDKでは左手と右手が逆になっているため、スクリプト内のローカル変数dotProductの値を以下のように変更する必要があります。

float dotProduct = Vector3.Dot(hand == XRNode.LeftHand ? -palmPose.Up : palmPose.Up, Camera.main.transform.forward);

3. PICO4システムのハンドモデルアップグレード異常問題について

        PICO4 システムを 5.7.1 にアップグレードした後、手のモデルの位置が逆転し、関節点が歪んでいますが、これは PICO によるジェスチャ認識用の手モデルの標準化が原因である可能性があります。解決策は、SDK を PICO SDK の最新バージョンにアップグレードすることです。この記事では最新バージョン 2.3.0 を使用します。

1.左手と右手を再構成する

        「パッケージ」-->「PICO Integration」-->「アセット」-->「リソース」-->「プレハブ」を開き、HandLeft と HandRight をシーンの階層にドラッグし、プレハブのバインドを解除します。

        左手を例として、PicoMRTKHandVisualizer スクリプト コンポーネントを HandLeft オブジェクトに追加し、関連するパラメーターを構成します。元の PXR_Hand スクリプト コンポーネントを削除し、子オブジェクト RayPose を非表示にすることを忘れないように注意してください。

         上図からわかるように、PICO ではハンドモデルの関節点の名前が標準化されているため、対応する位置にドラッグするだけで済みます。

        その他の設定は、上記2-2-(5)-2)の対応する設定と同様です。

        同様に、HandRight プレハブを作成します。

2.PicoMRTKHandVisualizerを変更する

        主にUpdateで手の関節点を更新するコードを以下のように修正します。

if (i == (int) HandJoint.JointWrist)
{
      riggedVisualJointsArray[i].localPosition =
                            handJointLocations.jointLocations[i].pose.Position.ToVector3();
      riggedVisualJointsArray[i].localRotation =
                            handJointLocations.jointLocations[i].pose.Orientation.ToQuat();
}
else
{
      //riggedVisualJointsArray[i].localRotation =
      //    handJointLocations.jointLocations[i].pose.Orientation.ToQuat();
      UnityEngine.Pose parentPose = UnityEngine.Pose.identity;

      if (i == (int)HandJoint.JointPalm ||
          i == (int)HandJoint.JointThumbMetacarpal ||
          i == (int)HandJoint.JointIndexMetacarpal ||
          i == (int)HandJoint.JointMiddleMetacarpal ||
          i == (int)HandJoint.JointRingMetacarpal ||
          i == (int)HandJoint.JointLittleMetacarpal)
      {
          parentPose = new UnityEngine.Pose(handJointLocations.jointLocations[1].pose.Position.ToVector3(), handJointLocations.jointLocations[1].pose.Orientation.ToQuat());
      }
      else
      {
          parentPose = new UnityEngine.Pose(handJointLocations.jointLocations[i - 1].pose.Position.ToVector3(), handJointLocations.jointLocations[i - 1].pose.Orientation.ToQuat());
      }

      var inverseParentRotation = Quaternion.Inverse(parentPose.rotation);
      riggedVisualJointsArray[i].localRotation = inverseParentRotation * handJointLocations.jointLocations[i].pose.Orientation.ToQuat();
}

3. HandConstraintPalmUp を復元する

        このスクリプトは HandMenu オブジェクトにマウントされます。新しいバージョンの PICO SDK では、左手と右手が正常に最適化されるため、以下に示すように、スクリプト内のローカル変数 dotProduct の値を復元する必要があります。

float dotProduct = Vector3.Dot(palmPose.Up, Camera.main.transform.forward);

4. まだ問題はある

        上記の設定後、ハンドモデルは正常に表示され、インタラクションも問題ありません。

        ただし、左手の光線は依然として反転されており、光線を表示するには左手のひらを上に向ける必要がありますが、これは近距離での相互作用には影響しません。この分野で問題を発見した小さなパートナーがいらっしゃいましたら、コメント欄にメッセージを残してください。ありがとうございます。

おすすめ

転載: blog.csdn.net/qq_40364278/article/details/131943651