本日はMRTK調査枠です
MRTKではHoloLens 2を含むHandTrackingに対応しているデバイスでHandTrackingによる手のメッシュ(HandMesh)を可視化ことができます。
今回はHandMeshのマテリアルを動的に変更できないトラブルがあってしばらく積んでしまったので、これを解消していきます。
〇トラブルの詳細
MRTKのInputProfilerのArticulated Hand Tracking、HandMeshPrefabに指定した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があります。
これらはMRTKのInputProfilerからArticulated Hand Tracking のHandMeshPrefabに指定したオブジェクトのMeshRendererに指定されているマテリアルが適応されるようになっています。
しかしながらエディタ上やLeapMotion(UltraLeap)などのPCビルドの場合ここで指定したマテリアルが参照されないことがありました。
それどころかOpenXRProfileなど一部のProfileの場合エディタ上でメッシュ自体が表示されないという問題があります。
〇原因と解消
原因はArticulated HandTrackingのHandMesh Prefabで定義されたメッシュのマテリアルではなくControllerプロファイルのGlobal Right(Left) Hand Visualizerに実装されているプレファブのマテリアルが使用されていました。
OpenXRControllerMappingProfileでは上図のようにHandSkeletonプレファブが指定されています。
この場合HandMeshを有効化していてもメッシュが表示されることはありません。
多くのプロファイラではRiggedHandLeftおよびRiggedHandRightが指定されています。
RiggedHandLeftプレファブのRiggedHand VisualizerコンポーネントにはHandMaterialの変数があり、ここに指定されているマテリアルがHandMeshのレンダリング時に使用されています。
そのためこのHandMaterialを任意のマテリアルに変更することで手の描画に使用されるマテリアルを変更することができます。
このあたりの使用は非常にわかりにくいと感じたところもあり、見たところドキュメントも整備されていないように感じたためMRTKにイシューとして問題を報告しています。