ARFoundation入门——持续射线投射(Android)

开发环境

Unity:2021.1.14flc1
导入Package:
AR Foundation:4.1.7
ARCore XR Plugin:4.1.7

持续射线投射案例

制作一个随着镜头移动的位于屏幕中心的平面

ARFoundation持续射线投射

步骤

注意要提前配置好AR Raycast Manager才可以使用
可以参考ARFoundation入门——AR射线检测(Android)

  1. 在AR场景中创建一个Plane,这里平面不要设置太大,影响观察,我设置的Scale是(0.01,0.01,0.01)请添加图片描述

  2. 在AR Session Oringin中创建脚本:

public class MonoBehaviour_01 : MonoBehaviour
{
    public GameObject defaultPrefab;
    private ARRaycastManager raycastManager;
    private List<ARRaycastHit> hits = new List<ARRaycastHit>();
    public Transform target;
    // Start is called before the first frame update
    void Start()
    {
        raycastManager = GetComponent<ARRaycastManager>();
        
    }

    // Update is called once per frame
    void Update()
    {
        if (raycastManager.Raycast(new Vector2(Screen.width / 2, Screen.height / 2), hits, TrackableType.PlaneWithinPolygon))
        {
            hits.Sort((x,y)=>x.distance.CompareTo(y.distance));//排序用于获取与最近平面的交叉点
            target.position = hits[0].pose.position;
            target.rotation = hits[0].pose.rotation;
        }
    }
}
  1. 将Plane拖入到AR Session Oringin 脚本控件的 Target中

一些说明

对ARFoundation的使用学习可以参考unity官网的文档:http://docs.unity3d.com/Packages/com.unity.xr.arfoundation@4.1/manual/index.html。也可以到ARCore的官网:https://developers.google.cn/ar对这部分SDK的功能和环境配置有个更好的了解。
(两个网站的中文翻译我觉得都挺令人头疼的,看不懂的部分地方建议可以用英文文档理解一下。)

### ARFoundation射线检测的实现 在 ARFoundation 中,`ARRaycastManager` 是用于执行射线投射的核心组件。为了使射线投射正常工作,在 `AR Session Origin` 对象上需添加 `AR Raycast Manager` 脚本[^2]。 #### 射线投射的具体实现方式如下: 创建并配置好 `ARRaycastManager` 后,可以调用其 `Raycast` 方法来执行射线投射操作。此方法接受屏幕坐标作为输入参数,并返回一系列命中结果 (`List<ARRaycastHit>`)。如果存在有效的追踪对象(例如已识别的平面),则列表中会包含至少一个元素;否则为空。 下面是一个完整的 C# 代码片段展示如何利用 `ARRaycastManager` 来实现在检测到的平面上放置物体的功能: ```csharp using UnityEngine; using UnityEngine.XR.ARFoundation; public class PlaceObjectOnPlane : MonoBehaviour { public GameObject cubePrefab; // 预制件资源 private ARRaycastManager _raycastManager; void Start() { _raycastManager = GetComponent<ARRaycastManager>(); } void Update() { Vector2 screenCenter = new Vector2(Screen.width / 2, Screen.height / 2); if (_raycastManager.Raycast(screenCenter, Hits, TrackableType.PlaneWithinPolygon)) { Pose hitPose = Hits[0].pose; Instantiate(cubePrefab, hitPose.position, hitPose.rotation); } } static List<ARRaycastHit> Hits = new List<ARRaycastHit>(); } ``` 这段脚本会在每一帧尝试从屏幕中心位置发射一条射线,并检查是否有任何被标记为 “Plane Within Polygon” 类型的目标被捕获。如果有匹配的结果,则获取第一个命中的姿态信息(`hitPose`) 并据此实例化一个新的游戏对象于该处[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值