タイトル通りですが、HoloLens 2のHandTrackingで表示されるメッシュのマテリアルをHoloLens 2実機内でシュミュレーションして自身のアプリケーションにあったHandMeshの表現を行えるツールを作りました。
〇作ったもの
GitHubに公開している部分はこれの一部になります。
〇作成経緯
HoloLens 2を触ってオブジェクトとの距離感に関してつかみにくいということに気が付きました。
具体的にはボタンなどのUIやオブジェクトをつかもうとしてもボタンに手が届いていなかったり、ボタンの奥で押そうとしていたりといった仮想のオブジェクトならではの距離感がつかめない現象が起こりました。(ほかの人でデモを行っていても2人に一人はボタンが押せない)
これはHoloLensで表示される仮想のオブジェクトと現実のオブジェクトとで光の当たり方が違うことが原因として考えられます。
この距離感をユーザーに知覚させるうえでユーザーの手のメッシュの表示は重要な要素になります。これがあることでユーザーはオブジェクトとの距離感を手のメッシュで計り感覚的に調整することができます。
しかし常に手のメッシュが表示されていてはMixedRealityのコンテンツの体験に支障をきたすことがあります。(要するに目障り)
そこでHandTrianglesShaderが用意されています。
このShaderは定期的にpulseが流れるようにメッシュの表示、非表示が切り替わることでユーザーのHandMeshを常に表示することなくビジュアルとUXの両立を行うことができます。
HandTrianglesShaderには調整できるパラメータが多く用意されており、Unity内でマテリアルを作成することはもちろんできますが、実機との見え方で差が生まれることがあります。
そこで今回HoloLens 2実機内でHandMeshのマテリアルのパラメーターをスライダーで変化させ、その変化を自分の手で確認できるようにしました。
〇PinchSlider
今回はMRTKに同梱されているUIの一つのPinchSliderを用いてMaterialのパラメータを変更できるようにしています。
PinchSliderの使い方は以前の記事で紹介しています。
using Microsoft.MixedReality.Toolkit.UI; ... public void hoge(SliderEventDeta deta){ float value = deta.NewValue; ... }
というようにスクリプト側でメソッドを用意しPinchSliderコンポーネントのEvents/On Value Updated(SliderEventData)でhogeを呼び出します。
これでPinchSliderのデータを使用することができます。
〇HandTrianglesShaderのパラメータをスライダーで変化させる
Material _handMaterial; //Intensity public void Intensity(SliderEventData data) { TMP_Text text = GameObject.Find("Intensity").GetComponentInChildren<TMP_Text>(); float value = data.NewValue *5f; text.text = "Intensity ="+value; _handMaterial.SetFloat("_Intensity_",value); }
SliderEventDataの値を一度valueに置き換えパラメータに応じて定数をかけてRangeを調整します。
Textはスライダーの値を表示するためのものでスライダーオブジェクトを取得し子オブジェクトにあるTextを取得します。
_handMaterial.SetFloat("変更したいパラメータ名",value);
でパラメータを変更しています。
最後に_handMaterialはHandMeshのプレファブであるArticulatedHandMeshのマテリアルと同一にしています。
これで実機内で動的にマテリアルのパラメータを変更してHandMeshの変化を見ることができます。
〇公開先
今回作成したツール(の一部)はこちらで公開しています。