swift .camera定位实体位于何处?

ycl3bljg  于 2023-01-29  发布在  Swift
关注(0)|答案(1)|浏览(117)

AnchorEntity(.camera)添加子对象时,看起来好像子对象在我的摄像头后面生成(意思是我只能在转过身的时候看到我的孩子)。我也试过直接给我的锚添加一个网格,但不幸的是ARKit / RealityKit不能在你在里面的时候渲染网格(因为它是以摄像头为中心的,理论上总是这样。然而,它也可能总是位于屏幕后面(用户所在的地方),而我永远看不到它)。
此外,奇怪的是,尽管将平移变换设置为(0,0,0),子实体也不随相机AnchorEntity移动。
我的两个问题是:
1..camera锚实际上是位于实体iPad /摄像头所在的位置,还是位于更靠后的位置(可能是用户通常持有iPad的位置)?
1.如何让AnchorEntity(.camera)的子实体随着iPad /相机在真实的空间中的移动而移动?

nwsw7zdq

nwsw7zdq1#

问题I..camera锚实际上是位于实体iPad / iPhone摄像头所在的位置,还是位于更靠后的位置(可能是用户通常握持iPad / iPhone的位置)?

第一个问题的答案

在RealityKit和ARKit框架中,ARCamera和其他实体(节点)一样有一个**pivot point,它位于透镜和相机机身的连接点(在卡口**水平)。这个枢轴可以连接AnchorEntity(.camera)。换句话说,虚拟相机和现实世界相机的枢轴点大约在同一个地方。
因此,如果将RealityKit的AnchorEntity附加到摄像机的枢轴上,则将其放置到摄像机卡口所在的坐标上,并且该AnchorEntity(.camera)将被自动跟踪,而无需实现session(_:didUpdate:)方法。
但是,如果将ARKit的ARAnchor连接到摄像机的枢轴,则必须实现session(_:didUpdate:)方法,以便不断更新每个ARFrame的锚点位置和方向。

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

第二个问题的答案

如果要以RealityKit s为单位以60 fps的速度不断更新模型的位置(当ARCamera移动和旋转时),则需要使用以下方法:

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

相关问题