【问题标题】:Where is the .camera AnchorEntity located?.camera AnchorEntity 位于何处?
【发布时间】:2020-06-09 11:59:09
【问题描述】:

将孩子添加到我的AnchorEntity(.camera) 时,看起来孩子好像在我的相机后面产卵(这意味着我只能在转身时看到我的孩子)。我也尝试直接向我的 Anchor 添加网格,但不幸的是,当您在其中时,ARKit / RealityKit 不会渲染网格(因为它以相机为中心,理论上总是如此。但是,它也可能是情况下它总是位于屏幕后面[用户所在的位置],而我永远看不到它)。

此外,奇怪的是,尽管将平移变换设置为 (0,0,0),但子实体并未随相机 AnchorEntity 移动。

我的两个问题是:

  1. .camera 锚点实际上是位于物理 iPad/相机所在的位置,还是位于更靠后的位置(可能是用户通常握住 iPad 的位置)?

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

【问题讨论】:

    标签: swift augmented-reality arkit realitykit


    【解决方案1】:

    问题 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
        }
    }
    

    【讨论】:

    • 当前,我创建了一个自定义实体来实现 HasAnchoring,而不是持续运行会话(:didUpdate:),锚定到 .camera。这是首选还是我应该使用 session(:didUpdate:)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-30
    • 1970-01-01
    • 1970-01-01
    • 2022-08-22
    • 1970-01-01
    • 2016-09-28
    • 2014-08-06
    相关资源
    最近更新 更多