第一个问题的答案
在RealityKit和ARKit框架中,ARCamera节点像其他实体(节点)一样具有枢轴点
,它位于镜头连接到相机机身的点上(在卡口级别)。这个枢轴可以绑定AnchorEntity(.camera)
。换句话说,虚拟相机和现实世界相机的枢轴点大约在同一位置。
因此,如果将RealityKit的AnchorEntity附加到相机的枢轴上,则将其放置在相机卡口所在的坐标处。而且,这个AnchorEntity(.camera)将自动跟踪,无需实现session(_:didUpdate:)
方法。
但是,如果将ARKit的ARAnchor附加到相机的枢轴上,则必须实现session(_:didUpdate:)
方法,以便为每个ARFrame不断更新该锚点的位置和方向。
第二个问题的答案
如果您想在RealityKit
中以60 fps(当AR相机移动和旋转时)不断更新模型的位置,您需要使用以下方法:
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)
cameraAnchor.addChild(boxEntity)
arView.scene.addAnchor(cameraAnchor)
boxEntity.transform.translation = [0, 0,-0.5]
}
}
或者你可以在session(_:didUpdate:)代理方法中使用ARKit的伟大老朋友.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)
arView.session.add(anchor: arkitAnchor)
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
}
}
如何保存ARCamera姿态的信息,请参考下篇文章。