夜風のMixedReality

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

MRDL Surfacesを学ぶ Valumeコンポーネントその①

本日はMRDLのSurfaceを学んでいきます。

〇MRDLとは? f:id:Holomoto-Sumire:20210529150852j:plain

〇Volumeシーン

〇Volumeコンポーネント

Volumeシーンは[Smoke]と呼ばれるプレファブで構成されています。

[Somke]オブジェクトには[Volume]コンポーネントがアタッチされており、これがコアなコンポーネントになります。

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

[Volume]コンポーネントは[HandSurface]を継承したクラスで、[HandSurface]クラスは[FingerSurface]クラスを継承しています。

#pragma warning disable 0649 // For serialized fields
using Microsoft.MixedReality.Toolkit.Utilities;
using System;
using System.Collections.Generic;
using UnityEngine;

public class Volume : HandSurface
{
...
}

[HandSurface]クラス、[FingerSurface]クラスはそれぞれユーザーのHandTracking情報を取得、保持するクラスになります。

[Volume]コンポーネントのinspector上に表示されるプロパティのうち赤枠部分が[FingerSurface]クラスによるものです。

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

また以下の赤枠部は[HandSurface]クラスによるものです。

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

〇Update関数

  private void Update()
    {
        if (!Initialized)
            return;

        if (drawConnections)
            DrawConnections();

        UpdateImpacts();
    }

  Update関数では[drawConnetions]の値がTrueであれば[DrawConnections()]関数が実行されます。

 また[UpdateInpacts()]関数が実行されます。

 [drawConnections()]は初期状態でfalseになっています。

[SerializeField]
    private bool drawConnections = false;

これは[Valume]クラス内で動的にTrueにされることはなく、Privateの型であるため外部から参照されることはなく、どうやらデバッグ用の機能のようです。

〇UpdateImpacts()

 private void UpdateImpacts()
    {
        UpdateVolumeImpacts(gen0);
        UpdateVolumeImpacts(gen1);
        UpdateVolumeImpacts(gen2);
        UpdateVolumeImpacts(gen3);

        for (int i = 0; i < fingerTips.Length; i++)
        {
            FingerTip ft = fingerTips[i];

            if (fingers[i].gameObject.activeSelf)
            {
                Color impactColor = fingerImpactGradient.Evaluate(ft.ImpactIntensity);
                ft.Block.SetColor("_EmissiveColor", ft.BaseColor + impactColor);
                ft.Renderer.SetPropertyBlock(ft.Block);
                ft.ImpactIntensity = Mathf.Clamp01(ft.ImpactIntensity - (Time.deltaTime * fingerImpactFadeTime));
                fingerTips[i] = ft;
            }
        }
    }

[UpdateImpacts]では最初に[gen]を引数に持つ[UpdateVolumeImpacts(gen)]関数が実行されます。

[gen]はChunk型の配列です。

 private Chunk[] gen0 = new Chunk[0];
    private Chunk[] gen1 = new Chunk[0];
    private Chunk[] gen2 = new Chunk[0];
    private Chunk[] gen3 = new Chunk[0];

Chunkは次で定義されています。

 private struct Chunk
    {
        public float Diameter { get { return Radius * 2; } }

        public int Parent;
        public int Generation;
        public float Radius;
        public Vector3 TargetPoint;
        public Vector3 TargetDir;
        public Rigidbody RigidBody;
        public ChunkImpacts Impacts;
        public Renderer Renderer;
        internal MaterialPropertyBlock Block;
    }

長くなってしまったので続きはまた後日見ていきます。