![見出し画像](https://assets.st-note.com/production/uploads/images/29175752/rectangle_large_type_2_d0bea69ab110274c7bb7677ad7ce7ead.png?width=1200)
【Magic Leap】オクルージョンの実装方法
まずはこちらのデモをご覧ください。
現在、UI/UX の研究を兼ねて作成中の Magic Leap のお絵かきアプリです。
ボタンを押すとオクルージョンのオン/オフができるように実装していて、手にもオクルージョンをかけています。
「Meshing」というサンプルシーンが Magic Leap SDK 内に用意されているのですが、今回は最低限の機能に絞って実装したので、その流れを note に書き起こそうと思います。
バージョン情報
・Unity 2019.2.21f1
・Lumin OS v0.98.10
・Lumin SDK 0.24.1
・OS Windows10
空間のオクルージョン
まずは空間のオクルージョン処理の下準備です。
MLSpatialMapper という Prefab を Hierarchy に配置します。
そして、Prefab を解除し、Scale を (5,5,5) に変更します。
合わせて、Mesh Parent という空のオブジェクトを生成しアタッチします。
次に、MLSpatialMapper の子のオブジェクトである Original を下記画像のように設定します。
今回のように、遮蔽物として使うだけであれば MeshCollider は削除してしまって問題ありません。
MeshRenderer に関してですが、オクルージョンをオフの状態からはじめる実装の場合は enable のチェックを外しておきます。
手のオクルージョン
手のオクルージョンに関しては HandMesh という Prefab を Hierarchy に配置するだけです。
ちなみに手のオクルージョンに関しては Editor 上で実機の検証が可能な ZeroIteration には対応していないので、ビルドして検証するしかないです。
コード
まずは全文です。
using UnityEngine;
using UnityEngine.Experimental.XR;
using UnityEngine.XR.MagicLeap;
public class OcclusionFunction : MonoBehaviour
{
[SerializeField] private MLSpatialMapper _mlSpatialMapper;
[SerializeField] private Transform _meshParent;
private bool isOcclusion;
private void Start()
{
//メッシュが追加された際のコールバック登録
_mlSpatialMapper.meshAdded += HandleOnMeshReady;
}
/// <summary>
/// メッシュのIDから新しく生成したメッシュの設定を更新
/// </summary>
/// <param name="meshId">生成されたメッシュのID</param>
private void HandleOnMeshReady(TrackableId meshId)
{
if (_mlSpatialMapper.meshIdToGameObjectMap.ContainsKey(meshId))
{
_mlSpatialMapper.meshIdToGameObjectMap[meshId].GetComponent<MeshRenderer>().enabled = isOcclusion;
}
}
/// <summary>
/// 認識したマップのメッシュを変更 Buttonの押下イベントにInspectorで登録
/// </summary>
public void OcclusionOnOff()
{
//既存の平面メッシュをオンオフ切り替え
foreach (Transform child in _meshParent)
{
MeshRenderer childMesh = child.GetComponent<MeshRenderer>();
childMesh.enabled = !isOcclusion;
}
isOcclusion = !isOcclusion;
Debug.Log("Occlusion:" + isOcclusion);
}
}
やっていることとしては非常にシンプルです。
OcclusionOnOff の中で生成されたメッシュ全てを foreach で1つずつ enable を切り替えてます。
meshAdded
空間のメッシュは認識でき次第、順次生成される仕組みになっているので、新しく生成される Prefab の情報を切り替える必要があります。
そこで、MLSpatialMapper の meshAdded というコールバックを利用します。
生成されるたびに、生成されたメッシュIDのオブジェクトを検索し
設定を更新しています。
おわりに
今回は物理的な干渉はないオクルージョンだけの平面を生成し、利用してみました。
MLSpatialMapper を利用すればMR空間上のオブジェクトを物理的に現実空間とインタラクションさせることも