问题 I. .camera 锚点实际上是位于物理 iPad/iPhone 摄像头所在的位置,还是位于更靠后的位置(可能是用户通常拿着 iPad/iPhone 的位置) ?
回答我
在 RealityKit 和 ARKit 框架中,ARCamera 与其他实体(节点)一样具有 pivot point,它位于镜头连接到相机机身的位置(在 bayonet 等级)。这个枢轴可以拴AnchorEntity(.camera)。换句话说,虚拟相机和现实世界的相机的轴心点大致在同一个地方。
因此,如果将 RealityKit 的 AnchorEntity 附加到相机的枢轴上,则将其放置在相机卡口所在的坐标上。而且这个AnchorEntity(.camera)会被自动跟踪,不需要实现session(_:didUpdate:)方法。
但是,如果将 ARKit 的 ARAnchor 附加到相机的枢轴上,您必须实现 session(_:didUpdate:) 方法来不断更新每个 ARFrame 的锚点的位置和方向。
问题二。如何让AnchorEntity(.camera) 的子实体随着 iPad/相机在真实空间中移动?
答案二
如果您想以 60 fps(当 ARCamera 移动和旋转时)在RealityKits 中不断更新模型的位置,您需要使用以下方法:
import ARKit
import RealityKit
class ViewController: UIViewController {
@IBOutlet var arView: ARView!
override func viewDidLoad() {
super.viewDidLoad()
let box = MeshResource.generateBox(size: 0.25)
let material = SimpleMaterial(color: .systemPink, isMetallic: true)
let boxEntity = ModelEntity(mesh: box, materials: [material])
let cameraAnchor = AnchorEntity(.camera) // ARCamera anchor
cameraAnchor.addChild(boxEntity)
arView.scene.addAnchor(cameraAnchor)
boxEntity.transform.translation = [0, 0,-1] // Box offset 1 m
}
}
...或者您可以在session(_:didUpdate:) 方法中实现ARKits currentFrame 属性:
extension ViewController: ARSessionDelegate {
func session(_ session: ARSession, didUpdate anchors: [ARAnchor]) {
guard let transform = arView.session.currentFrame?.camera.transform
else { return }
let arkitAnchor = ARAnchor(transform: transform)
let anchor = AnchorEntity(anchor: arkitAnchor)
anchor.addChild(boxEntity)
arView.scene.addAnchor(anchor)
}
}
class ViewController: UIViewController {
@IBOutlet var arView: ARView!
var boxEntity = ModelEntity(...)
override func viewDidLoad() {
super.viewDidLoad()
arView.session.delegate = self // Session's delegate
}
}