本日はアニメや映画などのファンタジー世界をHoloLensの力を使って再現していきます。
今回1990年代(筆者のうまれる前ですが)からのヒット作で今年映画最新作で一通りの幕を閉じたエヴァンゲリオンシリーズの世界からATフィールドをHoloLensで再現します。
〇ATフィールドとは?
エヴァンゲリオンシリーズの世界観は、設定のすべてが公開されてるわけではなく、視聴者による考察やゲーム等を含む外伝作品での設定補間によってはじめて理解できるものが多く、ここでの説明も一般的に呼ばれているものになります。
ATフィールドとは、作品に登場する巨人エヴァンゲリオンおよび敵の使徒が使用する防御シールドです。
作品中では『心の壁』とも呼ばれ物語にかかわる根幹な設定です。 様々な描写がされていますが、多くは銃弾やレーザーなどの攻撃を防ぐシールドとして描画されています。
昨日はHoloLensでこのATフィールドのShaderを作成しました。


今回はHoloLens実機で見ていきます。
〇ATフィールドを実機で再現する
①scene上にPlaneを配置します。

②プロジェクトウィンドウで新規のマテリアルを作成し昨日作成したATフィールドShadeGraphをD&Dして、マテリアルのShaderをATフィールドに設定します。

この作業によってUnity上でATフィールドが再現できました。
〇手からATフィールドを展開する。
エヴァンゲリオンシリーズ劇中ではATフィールドを手をかざすことで展開する描写が多くあります。
今回はHoloLens 2のHandTrackingを使用して手からATフィールドを展開します。
①空のオブジェクトを作成し子オブジェクトとしてATフィールドのPlaneを配置します。

②空のオブジェクト(ここでは[RightATField]と名付けています。)に以下のコンポーネントをアタッチします。

・ATFieldコンポーネント※
・SolverHandlerコンポーネント
・HandBoundsコンポーネント
・HandConstraintコンポーネント
ここではHandMenuと同じ処理を行い[HandConstraint]コンポーネントによって手に連動するようにしています。
ここで作成したATFieldコンポーネントは筆者の作成したスクリプトで次の様になります。
using System.Collections.Generic;
using UnityEngine;
using Microsoft.MixedReality.Toolkit.Utilities;
using Microsoft.MixedReality.Toolkit.Input;
public class ATField : MonoBehaviour
{
[SerializeField]
GameObject ATFields;
[SerializeField]
AudioClip sounds;
[SerializeField]
private Handedness handType;
public bool activate=false;
[SerializeField] private float distance;
public Transform head;
// Update is called once per frame
void Update()
{
if (activate)
{
float dis = Vector3.Distance(CameraCache.Main.transform.position,this.transform.position);
Debug.Log(dis);
if (dis>distance)
{
ATFields.SetActive(true);
}
else
{
ATFields.SetActive(false);
}
}
}
public void active()
{
activate = true;
}
public void deactive()
{
activate = false;
}
}
〇SolverHandler
[SolverHandler]コンポーネントの設定は次のようになります。

[TrackedTargetType]に[HandJoint]に設定しています。これによってHandTrackingのJointを指定します。
次に[TrackedHandness]はどの手を補足するかという設定ですが、[Right]を指定しました。これによって右手をトラッキングするようになります。
〇HandConstraint
[HandConstraint]コンポーネントは手を検知した際どのように挙動を行うかを設定します。今回は以下のように設定しました。

[OnFirstHandDetected]は手を検知した際に呼ばれるイベントです。
今回は[ATField]コンポーネントの[active()]を呼び出します。
これによって[ATField]の Bool型変数[activate]がtrueとなります。
これによって[ATField]のUpdate関数ないの処理が行われます。
if (activate)
{
float dis = Vector3.Distance(CameraCache.Main.transform.position,this.transform.position);
Debug.Log(dis);
if (dis>distance)
{
ATFields.SetActive(true);
}
else
{
ATFields.SetActive(false);
}
}
ここでは頭(メインカメラ)と手の位置がある程度開いている場合、ATフィールドのPlaneが表示されます。
以上がUnityでの作業になります。
〇実機で確認
実記では次の様になります。
手を前に出すことでATフィールドが展開されます。