如何在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
相关产品推荐
相关产品推荐

