本日はHoloLensアプリでの実験枠です。
先日のHoloLens Meetup Val.20で「SpatialMeshでエフェクトを作ってみた」ことをLTで登壇しました。
今回はこの登壇で行った内容を発展させた表現を行ってみます。
〇SR_TrianglesShaderとは?
MRTK バージョン2.3(19年冬リリース)で実験的にリリースされたShaderです。
HoloLensの空間認識機能SpatialAwarenessで周囲の環境をスキャンしそれに合うように生成したSpatialMeshに用いられるマテリアルで定期的にパルスが走る表現が行うことができます。

このShaderは過去の記事でも何度か使用してきました。
〇SR_TrianglesShaderを応用する。
SR_TrianglesShaderには多くのパラメータが使用でき様々な表現を行うことができます。
今回はこの中のPulseOriginというパラメータを使用していきます。

このパラメーターはパルスの発生する波源の座標を設定することができます。
HoloLensMeetup Val.20では、パルスの値を固定しPulseOriginの値とオブジェクトの値を対応させることでエフェクトとして使用しました。
今回はこれを応用してキャラクターの位置からパルスが走るようにします。
次のようなスクリプトを作成しました。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Microsoft.MixedReality.Toolkit;
using Microsoft.MixedReality.Toolkit.SpatialAwareness;
public class SpatialPulseTarget : MonoBehaviour
{
//TargetMaterial
[SerializeField] Material _spatialMaterial;
public bool isOriginuse;
// Start is called before the first frame update
void Start()
{
if(_spatialMaterial == null)
{
var access = CoreServices.SpatialAwarenessSystem as IMixedRealityDataProviderAccess;
// Get the first Mesh Observer available, generally we have only one registered
var observer = access.GetDataProvider<IMixedRealitySpatialAwarenessMeshObserver>();
// Change the VisivleMaterial to new material.
_spatialMaterial = observer.VisibleMaterial;
}
}
// Update is called once per frame
void Update()
{
if (isOriginuse)
{
PulseOrigin();
}
}
public void PulseOrigin()
{
Vector3 pos = this.gameObject.transform.position;
_spatialMaterial.SetVector("_Pulse_Origin_", pos);
}
}
スタート関数ではMRTKオブジェクトからMaterialを取得しています。
PulseOrigin関数で自分自身のオブジェクトの座標を取得し、マテリアルのPulseOriginの値に代入しています。
このスクリプトをゲームオブジェクトにアタッチします。
今回はキャラクターにアタッチしました。
〇実機で確認
実機で確認すると次のようになります。
キャラクターの足元からパルスが走るようになります。