You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RealityKit中ARView射线检测返回0结果,需额外配置吗?

解决RealityKit射线检测结果为空的问题

你遇到的results数组为空的问题,核心原因是ARView的会话配置未启用平面检测,或是设备还未完成环境平面扫描。以下是具体解决步骤:

1. 必须启用平面检测配置

在初始化ARView并启动会话时,需要给ARWorldTrackingConfiguration设置planeDetection属性,ARKit才会检测环境中的平面,射线检测才能匹配到.estimatedPlane目标:

let configuration = ARWorldTrackingConfiguration()
// 按需选择水平/垂直平面检测,也可同时启用
configuration.planeDetection = [.horizontal, .vertical]
// 启动AR会话
arView.session.run(configuration)

如果是自定义ARView子类,要确保在初始化或视图生命周期方法(如viewDidLoad)中完成上述配置并启动会话。

2. 等待平面扫描完成

刚启动AR会话时,ARKit需要几秒时间扫描环境生成平面数据,这段时间内调用射线检测会返回空结果。可以监听AR会话代理方法session(_:didAdd:),待该方法触发(表示已检测到平面)后,再执行射线检测操作。

3. 检查射线检测参数合理性

  • from: self.center:确认该点是ARView的屏幕中心点,也可显式写为CGPoint(x: bounds.midX, y: bounds.midY),避免视图布局问题导致坐标错误。
  • allowing: .estimatedPlane:该参数允许检测ARKit预估的平面,但前提是已开启平面检测,否则这个目标类型不会返回任何结果。

附:代码中的小问题修正

你代码里修改simd_float4x4缩放的方式有误,simd_float4x4不能直接赋值SCNVector3,需用simd矩阵函数处理:

guard let resultTransform = results.first?.worldTransform else { return nil }
// 创建缩放为1的矩阵
let scaleMatrix = simd_float4x4(diagonal: SIMD4<Float>(1, 1, 1, 1))
// 将缩放应用到原变换矩阵
let finalTransform = resultTransform * scaleMatrix
return finalTransform

内容的提问来源于stack exchange,提问作者narner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 07:41:29