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

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

命中结果类型

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

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

ARRaycastManager.Raycast(Vector2 screenPoint, List<ARRaycastHit> hitResults, TrackableType trackableTypes TrackableType.Depth)
飞机 敲击水平和/或垂直表面,以确定点的正确深度和方向 与 3D 表面垂直 使用平面的完整几何图形将对象放置在平面(地板或墙壁)上。需要立即更正体重。深度点击测试的回退 ARRaycastManager.Raycast(Vector2 screenPoint, List<ARRaycastHit> hitResults, TrackableType trackableTypes TrackableType.PlaneWithinPolygon)
特征点 依靠用户点按点周围的视觉特征来确定点的正确位置和方向 与 3D 表面垂直 将对象放在任意表面上(不仅限于地板和墙壁) ARRaycastManager.Raycast(Vector2 screenPoint, List<ARRaycastHit> hitResults, TrackableType trackableTypes TrackableType.FeaturePoint)
Persistent 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 中,这称为即时放置

调用 ARRaycastManager.AddRaycast() 以创建持续自动更新的 ARRaycast,直到您调用 ARRaycastManager.RemoveRaycast() 或停用 ARRaycastManager

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

后续步骤