执行光线投射或点击测试,以确定 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 绘制局部几何图形并找到相交平面后,该距离将更新为实际距离。距离的变化会影响表观的“大小”大小或感知大小。
后续步骤
- 使用 Unity 的 AR Foundation 创建 AR 游戏 Codelab。