ARFoundation丨(三)放置AR物体

提示:选中右侧目录,可快速找到所需内容

本系列博客地址:传送门

 

一、效果展示

B站地址:传送门

ARFoundation丨放置与AR测量

 

 

二、基础配置

根据这篇博客,完成项目的初始配置。

传送门

 

 

三、放置实现

实现思路:

  1. 确定放置点
  2. 将预制体放到放置点上

 

方法:

将下方代码放在任意场景物体上,赋值要展现的预制体即可。

该脚本:

  • 先通过 ARFoundation 自带的 ARRaycastManager 组件发射射线,检测碰撞到的第一个平面。与该平面接触到的点,就是碰撞点。
  • 再实例化预制体,将该预制体放置到碰撞点上。完成操作。

 

代码:

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

public class Skode_SetObj : MonoBehaviour
{
    #region Public Parameters

    [Tooltip("要放置的预制体")]
    public GameObject objPrefab;

    /// 
    /// 已经实例化、摆放在场景中的预制体
    /// 
    [HideInInspector]
    public GameObject spawnedObject;

    #endregion


    #region Private Parameters

    List hits = new List();
    Vector3 screenCenter = new Vector3(Screen.width * 0.5f, Screen.height * 0.5f, 0);
    ARRaycastManager arRaycastManager;

    #endregion


    #region MonoBehaviour CallBacks

    private void Start()
    {
        arRaycastManager = FindObjectOfType();
    }

    #endregion


    #region Public Methods

    //将该方法绑定在放置按钮上即可。
    public void Skode_SetTarget()
    {
        if (arRaycastManager.Raycast(screenCenter, hits, TrackableType.PlaneWithinPolygon))
        {
            // 列表中元素是按命中的距离排序的,所以第一个命中的距离是最近的。
            var hitPose = hits[0].pose;

            if (spawnedObject == null && JudgeIsHorizontal(hitPose))
            {
                spawnedObject = Instantiate(objPrefab, hitPose.position, hitPose.rotation);
            }
        }
    }

    #endregion


    #region Private Methods

    /// 
    /// 判断该平面是水平面还是竖直面
    /// 
    bool JudgeIsHorizontal(Pose target)
    {
        bool value = true;

        if (Mathf.Abs(target.rotation.eulerAngles.x) > 20 || Mathf.Abs(target.rotation.eulerAngles.z) > 20)
            value = false;

        return value;
    }

    #endregion
}

 

 

感谢您阅读到最后

我是SKODE

你可能感兴趣的:(ARFoundation)