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

如何在RealityKit中持续更新SIMD3世界位置?

解决RealityKit中定时放置对象位置不随相机更新的问题

你的问题核心是固定使用了静态的世界坐标,没有基于当前相机的实时位置计算新的放置点。要让对象始终出现在相机前方的相对位置,需要获取相机的实时世界变换,再推导目标位置。

修改步骤

  • 获取当前ARView中相机的世界变换矩阵
  • 基于相机位置和朝向,计算相对相机的目标世界坐标
  • 用新坐标创建AnchorEntity

修改后的代码

@objc func updateTimer(){
    if secondsPassed < 1 {
        // 获取相机的世界变换
        guard let cameraTransform = arView.cameraTransform else { return }
        
        // 计算相对于相机前方的位置:z轴负方向是相机前方,这里保持原距离-0.4,y轴-0.25
        let offset = SIMD3<Float>(0, -0.25, -0.4)
        // 将相对偏移转换为世界坐标,确保对象跟随相机朝向
        let targetPosition = cameraTransform.translation + cameraTransform.rotation * offset
        
        let anchor = AnchorEntity(world: targetPosition)
        let box = ModelEntity(mesh: .generateBox(size: 0.04), 
                              materials: [SimpleMaterial(color: .red, isMetallic: false)])
        anchor.addChild(box)
        arView.scene.addAnchor(anchor)
        
        secondsPassed += 1
    } else if secondsPassed < 5 {
        secondsPassed += 1
    } else {
        secondsPassed = 0
        arView.scene.anchors.removeAll()
    }
}

关键说明

  • arView.cameraTransform:获取相机当前的世界空间变换,包含位置(translation)和旋转(rotation)信息
  • cameraTransform.rotation * offset:将相对相机的偏移量转换为世界空间方向,确保对象始终在相机前方的对应位置,不会因为相机移动而固定在初始世界点
  • 若需要随机位置,可在基础偏移上叠加随机值,示例:
    let randomOffset = SIMD3<Float>(Float.random(in: -0.1...0.1), 
                                    Float.random(in: -0.1...0.1), 
                                    0)
    let targetPosition = cameraTransform.translation + cameraTransform.rotation * (offset + randomOffset)
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 18:55:20