".camera AnchorEntity" 位于何处?

5
当我将一个子对象添加到我的AnchorEntity(.camera)时,似乎这个子对象会出现在我的相机后面(也就是说,只有当我转过身去时,我才能看到这个子对象)。我还尝试直接将网格添加到我的Anchor上,但不幸的是,ARKit/RealityKit无法在你位于其中时渲染网格(因为它围绕着相机居中,理论上始终如此。然而,它也可能总是位于屏幕后面[用户所在的位置],我永远看不到它)。
另外,奇怪的是,即使将翻译变换设置为(0,0,0),子实体仍然无法随相机AnchorEntity移动。
我的两个问题是:
  1. .camera Anchor实际上是位于物理iPad/相机位置的吗?或者它位于更远的地方(也许是用户通常拿着iPad的地方)?

  2. 如何让一个AnchorEntity(.camera)的子实体在真实空间中随iPad/相机的移动而移动

1个回答

10

第一个问题的答案

在RealityKit和ARKit框架中,ARCamera节点像其他实体(节点)一样具有枢轴点,它位于镜头连接到相机机身的点上(在卡口级别)。这个枢轴可以绑定AnchorEntity(.camera)。换句话说,虚拟相机和现实世界相机的枢轴点大约在同一位置。

因此,如果将RealityKit的AnchorEntity附加到相机的枢轴上,则将其放置在相机卡口所在的坐标处。而且,这个AnchorEntity(.camera)将自动跟踪,无需实现session(_:didUpdate:)方法。

但是,如果将ARKit的ARAnchor附加到相机的枢轴上,则必须实现session(_:didUpdate:)方法,以便为每个ARFrame不断更新该锚点的位置和方向。

enter image description here

第二个问题的答案

如果您想在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)        // ARCamera anchor
        cameraAnchor.addChild(boxEntity)
        arView.scene.addAnchor(cameraAnchor)
        
        boxEntity.transform.translation = [0, 0,-0.5]   // Box offset 0.5 m
    }
}

或者你可以在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)            // add to session

        let anchor = AnchorEntity(anchor: arkitAnchor)
        anchor.addChild(boxEntity)
        arView.scene.addAnchor(anchor)                     // add to scene
    }
}

class ViewController: UIViewController {

    @IBOutlet var arView: ARView!
    var boxEntity = ModelEntity(...)

    override func viewDidLoad() {
        super.viewDidLoad()
        arView.session.delegate = self                 // Session's delegate
    }
}

如何保存ARCamera姿态的信息,请参考下篇文章


目前我创建了一个自定义实体,实现了 HasAnchoring 接口,并将其固定在 .camera。这样做是否更好,还是应该使用 session(_:didUpdate:) 方法? - Eric Wang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接