在 Unity (AR Foundation) 应用中执行光线投射

执行光线投射或点击测试,以确定 3D 对象在场景中的正确位置。正确的放置位置可确保 AR 内容以适当的(表观)尺寸呈现。

命中结果类型

一个命中测试可以产生四种不同类型的命中结果,如下表所示。

命中结果类型 说明 方向 使用场景 方法调用
深度 使用整个场景中的深度信息来确定点的正确深度和方向 垂直于 3D 表面 将虚拟对象放置在任意表面(不仅仅是地面和墙壁) 必须启用 Depth 才能使用此功能。

ARRaycastManager.Raycast(Vector2 screenPoint, List<ARRaycastHit> hitResults, TrackableType trackableTypes TrackableType.Depth)
飞机 点击水平和/或垂直表面,以确定某个点的正确深度和方向 垂直于 3D 表面 使用平面的完整几何图形将对象放置在平面(地板或墙壁)上。需要立即调整比例。Depth 点击测试的后备 ARRaycastManager.Raycast(Vector2 screenPoint, List<ARRaycastHit> hitResults, TrackableType trackableTypes TrackableType.PlaneWithinPolygon)
特征点 依赖用户点按点周围的视觉特征来确定点的正确位置和方向 垂直于 3D 表面 将物体放在任意表面(不仅仅是地面和墙壁) ARRaycastManager.Raycast(Vector2 screenPoint, List<ARRaycastHit> hitResults, TrackableType trackableTypes TrackableType.FeaturePoint)
永久性 Raycast(即时放置) 占用屏幕空间来放置内容。最初使用应用提供的估算深度。可立即运行,但一旦 ARCore 能够确定实际场景几何形状,姿势和实际深度就会发生变化 +Y 指向上,与重力相反 使用平面的完整几何图形将对象放置在平面(地板或墙壁)上,此时快速放置至关重要,并且体验可以容忍未知的初始深度和缩放 ARRaycastManager.AddRaycast(Vector2 screenPoint, float estimatedDistance)

执行标准光线透射

调用 ARRaycastManager.Raycast(Vector2, List<ARRaycastHit>, TrackableType) 以执行光线投射(命中测试)。ARRaycastManager 支持所有 TrackableType

var touch = Input.GetTouch(0);
if (touch.phase != TouchPhase.Began)
    return;

// Raycast against planes and feature points.
const TrackableType trackableTypes =
    TrackableType.FeaturePoint |
    TrackableType.PlaneWithinPolygon;
List<ARRaycastHit> hits = new List<ARRaycastHit>();
// Perform the raycast.
if (raycastManager.Raycast(touch.position, hits, trackableTypes))
{
    // Raycast hits are sorted by distance, so the first one will be the closest hit.
    var hit = hits[0];
    // Do something with hit.
}

使用任意射线和方向进行光线投射

光线投射通常被视为来自设备或设备相机的光线,但您可以使用 Raycast(Ray, List<ARRaycastHit>, TrackableType) 在现实世界空间坐标中使用任意射线(而不是屏幕空间点)进行光线投射。

使用 ARRaycastHit 创建锚点

获得光线投射命中后,使用 GameObject.AddComponent<ARAnchor> 创建一个 Anchor,然后将其作为组件添加到 GameObject,并使用光线投射命中作为输入。ARAnchor 组件会持续更新游戏对象的 Transform,以便游戏对象仍然附加到命中结果的底层 Trackable

永久性光线透射(即时放置)

永久性光线投射使用屏幕位置以及与表面的估算距离作为输入,创建新的 ARRaycast 以在场景中放置 AR 内容。在 ARCore 中,这称为 Instant Placement

调用 ARRaycastManager.AddRaycast() 可创建一个 ARRaycast,在您调用 ARRaycastManager.RemoveRaycast() 或停用 ARRaycastManager 之前,该 ARRaycast 会一直自动更新。

最初,ARRaycast 的距离将是在 AddRaycast() 调用中提供的距离。在 ARCore 绘制局部几何图形并找到相交平面后,该距离将更新为实际距离。距离的变化会影响表观的“大小”大小或感知大小。

后续步骤