AR による平面上へのオブジェクトの配置

Tutorial

Beginner

+10XP

35 mins

Unity Technologies

AR による平面上へのオブジェクトの配置

本チュートリアルでは、AR foundation の平面検出を利用し、タップジェスチャーで水平方向の平面上にオブジェクトを配置する方法を学びます。

Resources

Languages available:

1. 概要

このチュートリアルでは、AR Foundation の平面検出を使ってオブジェクトを平面上に配置する方法を理解します。さらに、タップ・ジェスチャーを使ってオブジェクトをインスタンス化する方法も学びます。また、検出された平面上にタップでオブジェクトを配置する機能を持つ AR アプリを作成します。

2. 平面検出の有効化

AR foundation で平面検出を可能にする方法を学びます。

1. Hierarchy に移動し、AR Session Origin オブジェクトをダブルクリックします。

2. Plane Manager コンポーネントを追加します (画像 1)

3. Detection Mode のドロップダウンメニューで Horizontal を選択します (画像 2)。最初に Nothing をクリックしてから、Horizontal に設定する必要があるかもしれません。

4. Manager が水平方向の平面を検出するようになりました。

3. 平面の可視化

平面検出を有効にした後、Prefab オブジェクトを使って平面を可視化する方法を紹介します。

1. Scene ビューで、コンテキストメニューから GameObject > XR > AR Default Plane の順に選択して、AR Default Plane オブジェクトを作成します (画像 3)。

2. AR Default Plane をプレハブとして保存します。

3. AR Default Plane プレハブを AR Plane Manager の Plane プレハブフィールドにドラッグアンドドロップします (画像 4)

4. シーン内の AR Default Plane ゲームオブジェクトを削除します。

5. 結果:水平方向の平面の検出 (画像 5)

4. 平面上にキューブを配置する

AR Raycast Manager と AR Reference Point Manager を使用して、ユーザーが画面をタップしたときにキューブを平面上に配置することができます。基準点を使用することで、アプリケーションのトラッキング精度が向上し、通常、AR コンテンツを作成する際のベストプラクティスとして使用されます。

1. AR Session Origin に AR Raycast Manager を追加します

2. AR Session Origin に AR Reference Point Manager を追加します

3. 新しい C# スクリプトを作成し、名前を TapToPlace とします

4. TapToPlace C# スクリプトを AR セッションオリジンに追加します

a. このスクリプトは、レイキャスティングとタッチ検出を使用して、ユーザーが携帯電話の画面上でタップした場所に応じてキューブを平面上に配置します。

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.ARFoundation;
using UnityEngine.XR.ARSubsystems;

public class TapToPlace : MonoBehaviour
{
    //Remove all reference points created
    public void RemoveAllReferencePoints()
    {
        foreach (var referencePoint in m_ReferencePoint)
        {
            m_ReferencePointManager.RemoveReferencePoint(referencePoint);
        }
        m_ReferencePoint.Clear();
    }


    void Awake()
    {
        m_RaycastManager = GetComponent<ARRaycastManager>();
        m_ReferencePointManager = GetComponent<ARReferencePointManager>();
        m_PlaneManager = GetComponent<ARPlaneManager>();
        m_ReferencePoint = new List<ARReferencePoint>();
    }


    bool TryGetTouchPosition(out Vector2 touchPosition)
    {
        if (Input.touchCount > 0)
        {
            touchPosition = Input.GetTouch(0).position;
            return true;
        }

        touchPosition = default;
        return false;
    }

    void Update()
    {
        if (!TryGetTouchPosition(out Vector2 touchPosition))
            return;

        if (m_RaycastManager.Raycast(touchPosition, s_Hits, TrackableType.PlaneWithinPolygon))
        {
            // Raycast hits are sorted by distance, so the first one
            // will be the closest hit.
            var hitPose = s_Hits[0].pose;
            TrackableId planeId = s_Hits[0].trackableId; //get the ID of the plane hit by the raycast
            var referencePoint = m_ReferencePointManager.AttachReferencePoint(m_PlaneManager.GetPlane(planeId), hitPose);
            if (referencePoint != null)
            {
                RemoveAllReferencePoints();
                m_ReferencePoint.Add(referencePoint);
            }
        }
    }

    static List<ARRaycastHit> s_Hits = new List<ARRaycastHit>();

    ARRaycastManager m_RaycastManager;
    ARReferencePointManager m_ReferencePointManager;
    List<ARReferencePoint> m_ReferencePoint; 
    ARPlaneManager m_PlaneManager;

}

4. 空のゲームオブジェクトを作成します (画像 6)。

5. キューブを作成します。スケールと位置を変更して、平面上にリアルに収まるようにしましょう (画像 7) 。

6. Inspector でキューブの scale をすべての次元で 0.5 に設定します

7. キューブの position を y 次元で 0.5 に設定します

8. 空のゲームオブジェクトの下にキューブをドラッグして親にします (画像 8)

9. キューブのプレハブを作成し、親となるゲームオブジェクトをスクリプトコンポーネントのフィールドにドラッグします (画像 9)

11. プロジェクトをビルドして実行します。キューブをインスタンス化するには、必ずスクリーンをタップしてください!

12. 結果、以下のようになります (画像 10):

5. まとめ

このチュートリアルでは、AR Foundation プロジェクトに平面検出、基準点、タッチジェスチャーの機能を追加しました。このプロジェクトは、ユーザーがさまざまなユースケースに合わせてプロジェクトをカスタマイズするための足がかりとなります。

Complete this Tutorial