夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

MRTKでハンドメッシュに任意のマテリアルを指定できない問題の解消

本日はMRTK調査枠です

MRTKではHoloLens 2を含むHandTrackingに対応しているデバイスでHandTrackingによる手のメッシュ(HandMesh)を可視化ことができます。

今回はHandMeshのマテリアルを動的に変更できないトラブルがあってしばらく積んでしまったので、これを解消していきます。

〇トラブルの詳細

MRTKのInputProfilerのArticulated Hand TrackingHandMeshPrefabに指定したHandMeshPrefabに参照されているマテリアルがHandMeshに反映されることがなく手のメッシュを変更できないトラブルがありました。

対象となるプラットフォームはエディタ上とPCです。

HoloLens 2実機ではデフォルトで指定されているHandTrianglesShaderが適応されていました。

 

〇環境

・Widnows 10 PC

・Unity 2021.2.3f1(LTS)

・MixedRealtiy Toolkit v2.7.3(以下MRTK)

またMRTKの5/20日時点最新のDevelopmentブランチ

〇MRTKのHandMesh

HoloLensでは現実世界にデジタル情報をオーバーレイする都合上、光の当たり方による問題でユーザーがオブジェクトとの距離感を把握できずに、ボタン等のっ近距離にあるオブジェクトとの捜査に支障が出る場合があります。(ずっとボタンの奥を押そうとしている)

HandMeshはこのような場合を含めユーザーにHandTrackingが行われている状態を示すことでUXの向上だけでなく、オブジェクトがつかめるのかそれともTrackingLostして使うことができないのかを明示してくれます。

〇HandMeshのマテリアル

MRTKではHandMeshに使用するためのいくつかのマテリアルが提供されています。

 代表的な例ではHandTrianglesShaderがあります。

redhologerbera.hatenablog.com

 これらはMRTKのInputProfilerからArticulated Hand Tracking HandMeshPrefabに指定したオブジェクトのMeshRendererに指定されているマテリアルが適応されるようになっています。

しかしながらエディタ上やLeapMotion(UltraLeap)などのPCビルドの場合ここで指定したマテリアルが参照されないことがありました。

 それどころかOpenXRProfileなど一部のProfileの場合エディタ上でメッシュ自体が表示されないという問題があります。

〇原因と解消

原因はArticulated HandTrackingHandMesh Prefabで定義されたメッシュのマテリアルではなくControllerプロファイルのGlobal Right(Left) Hand Visualizerに実装されているプレファブのマテリアルが使用されていました。

OpenXRControllerMappingProfileでは上図のようにHandSkeletonプレファブが指定されています。

この場合HandMeshを有効化していてもメッシュが表示されることはありません。

多くのプロファイラではRiggedHandLeftおよびRiggedHandRightが指定されています。

RiggedHandLeftプレファブのRiggedHand VisualizerコンポーネントにはHandMaterialの変数があり、ここに指定されているマテリアルがHandMeshのレンダリング時に使用されています。

そのためこのHandMaterialを任意のマテリアルに変更することで手の描画に使用されるマテリアルを変更することができます。

 このあたりの使用は非常にわかりにくいと感じたところもあり、見たところドキュメントも整備されていないように感じたためMRTKにイシューとして問題を報告しています。

github.com