夜風のMixedReality

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

HoloLensでSR_TrianglesShaderを応用する。

本日はHoloLensアプリでの実験枠です。

先日のHoloLens Meetup Val.20で「SpatialMeshでエフェクトを作ってみた」ことをLTで登壇しました。

redhologerbera.hatenablog.com

今回はこの登壇で行った内容を発展させた表現を行ってみます。

〇SR_TrianglesShaderとは?

 MRTK バージョン2.3(19年冬リリース)で実験的にリリースされたShaderです。

HoloLensの空間認識機能SpatialAwarenessで周囲の環境をスキャンしそれに合うように生成したSpatialMeshに用いられるマテリアルで定期的にパルスが走る表現が行うことができます。

f:id:Holomoto-Sumire:20200719222020g:plain

このShaderは過去の記事でも何度か使用してきました。

redhologerbera.hatenablog.com

redhologerbera.hatenablog.com

redhologerbera.hatenablog.com

redhologerbera.hatenablog.com

redhologerbera.hatenablog.com

〇SR_TrianglesShaderを応用する。

SR_TrianglesShaderには多くのパラメータが使用でき様々な表現を行うことができます。

今回はこの中のPulseOriginというパラメータを使用していきます。

f:id:Holomoto-Sumire:20200728173804j:plain

このパラメーターはパルスの発生する波源の座標を設定することができます。

HoloLensMeetup Val.20では、パルスの値を固定しPulseOriginの値とオブジェクトの値を対応させることでエフェクトとして使用しました。  

redhologerbera.hatenablog.com

今回はこれを応用してキャラクターの位置からパルスが走るようにします。

次のようなスクリプトを作成しました。

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の値に代入しています。

このスクリプトをゲームオブジェクトにアタッチします。

今回はキャラクターにアタッチしました。

〇実機で確認

実機で確認すると次のようになります。

キャラクターの足元からパルスが走るようになります。

www.youtube.com