执行raycast或碰撞测试,以确定 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)
|
永久性光线投放(免安装展示位置) | 使用屏幕空间放置内容。最初使用应用提供的估算深度。可立即使用,但一旦 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>
创建一个锚点,并将其作为组件添加到 GameObject
,使用射线检测命中作为输入。ARAnchor
组件将不断更新游戏对象的 Transform
,以便游戏对象保持与底层 Trackable
的附加状态,以获取碰撞结果。
永久性射线投射(即时放置)
永久性光线投射会使用屏幕位置和与表面的估算距离作为输入,以创建新的 ARRaycast
来在场景中放置 AR 内容。在 ARCore 中,这称为即时放置。
调用 ARRaycastManager.AddRaycast()
可创建一个 ARRaycast
,该 ARRaycast
会在您调用 ARRaycastManager.RemoveRaycast()
或停用 ARRaycastManager
之前继续自动更新。
最初,ARRaycast
的距离将是 AddRaycast()
调用中提供的距离。ARCore 映射本地几何图形并找到相交平面后,距离会更新为实际距离。距离的变化可能会影响物体的表面“尺寸”或感知尺度。
后续步骤
- 完成使用 Unity 的 AR Foundation 创建 AR 游戏 Codelab。