【Unity】AR Foundationを使って平面にオブジェクトを置く

前回はAR Foundationを使ってオブジェクトを空間上に置いてみました。 今回は平面検出を行って平面にオブジェクトを置いてみようと思います。

※この記事はAR Foundationが導入されカメラプレビューが表示されていることを前提としています。そこまで準備できていない場合は以下の前回の記事を参考にしてください。

https://crossbridge.biz/use-ar-foundation/

平面検出

ヒエラルキー上の AR Session Origin を選択肢して、 AR Plane Manager を Add Component します。

次にヒエラルキー上でコンテキストメニューを表示させ XR -> AR Default Plane を選択して作成します。そして作成した AR Default Plane をPrefab化します。

AR Plane Manager の Plane Prefab に今Prefab化したものをセットします。

これでビルドしてみましょう。平面が検出され表示されます

特徴点を表示させる

AR Foundationで簡単に平面検出ができましたが特徴点の表示も簡単にできます。

特徴点を表示させるにはまずヒエラルキー上の AR Session Origin を選択肢して、 AR Point Cloud Manager を Add Component します。

次にヒエラルキー上でコンテキストメニューを表示させ XR -> AR Default Point Cloud を選択して作成します。そして作成した AR Default Point Cloud をPrefab化します。

AR Cloud Point Manager の Point Cloud Prefab に今Prefab化したものをセットします。

これでビルドしてみましょう。先程の平面に加えて特徴点が表示されるようになりました。

平面にオブジェクトを置く

検出され表示されている平面をタップしたらその場所にオブジェクトが置かれるようにしてみます。 AR Foundation で Raycast を行うには ARRaycast Manager を使います。

ARRaycast Manager を前述のAR Plane Manager、AR Point Cloud Manager と同様に AR Session Origin に Add Component します。

次にスクリプトを用意します。ここでは ARRaycast.cs というファイル名で作成しています。

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.ARFoundation;
using UnityEngine.XR.ARSubsystems;
public class ARRaycast : MonoBehaviour
{
private ARRaycastManager m_RaycastManager;
private List<ARRaycastHit> hitResults = new List<ARRaycastHit>();
[SerializeField] private GameObject objectPrefab;
void Start()
{
m_RaycastManager = GetComponent<ARRaycastManager>();
}
void Update()
{
if (Input.touchCount > 0)
{
Touch touch = Input.GetTouch(0);
if (touch.phase == TouchPhase.Began)
{
if (m_RaycastManager.Raycast(
touch.position,
hitResults,
TrackableType.PlaneWithinPolygon
))
{
Pose hitPose = hitResults[0].pose;
Instantiate(
objectPrefab,
hitPose.position,
hitPose.rotation
);
}
}
}
}
}
view raw ARRaycast.cs hosted with ❤ by GitHub

作成したスクリプトを AR Session Origin に Add Component します。Object Prefab には表示させたいオブジェクトの Prefab を指定してください。

ビルドして実行してみましょう。検出された平面をタップしたらオブジェクトが置かれます。

このように AR Foundation を使うことで簡単に平面検出を行うことができます。