Где находится .camera AnchorEntity? - PullRequest
1 голос
/ 25 февраля 2020

Когда я добавляю ребенка к моему AnchorEntity(.camera), создается впечатление, что ребенок появляется за моей камерой (то есть я вижу своего ребенка только тогда, когда я оборачиваюсь). Я также попытался добавить me sh к своему Anchor напрямую, но, к сожалению, ARKit / RealityKit не рендерит me sh, когда вы находитесь внутри него (что, поскольку оно сосредоточено вокруг камеры, теоретически всегда так. , это также может быть случай, когда он всегда находится за экраном [где пользователь], и я никогда не смогу его увидеть).

Кроме того, как ни странно, дочерняя сущность не перемещается с камерой AnchorEntity, несмотря на установку преобразования преобразования в (0,0,0).

Мои два вопроса:

  1. Является ли привязка .camera на самом деле там, где физический iPad / камера расположена или находится дальше назад (возможно, там, где пользователь обычно держал бы iPad)?

  2. Как заставить дочерний объект AnchorEntity (.camera) перемещать как iPad / камера движется в реальном пространстве?

1 Ответ

1 голос
/ 26 февраля 2020

Действительно ли якорь .camera расположен именно там, где расположена физическая камера iPad / iPhone, или он расположен дальше назад (возможно, там, где пользователь обычно держит iPad / iPhone)?

Ответ I

В платформах RealityKit и ARKit ARCamera имеет pivot point, как и другие объекты (узлы), и находится в точке, где прикреплен объектив к корпусу камеры (на уровне отсек onet). Этот стержень может быть привязан AnchorEntity(.camera). Другими словами, виртуальная камера и камера реального мира имеют эту точку поворота примерно в одном месте. Таким образом, если вы присоединяете AnchorEntity к этому стержню, а затем модель к этому AnchorEntity, вы помещаете его в координаты, где отсек камеры onet расположен в определенный момент времени (в определенном отдельном кадре, а не для последовательности кадров) .

enter image description here

Как заставить дочерний объект AnchorEntity(.camera) перемещаться при перемещении iPad / камеры в реальном пространстве?

Ответ II

Если вы хотите постоянно обновлять позицию модели за RealityKit с при 60 кадрах в секунду (когда 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,-1]    // Box offset 1 m
    }
}

... Или вы можете реализовать свойство ARKit s currentFrame внутри сеанса (_: didUpdate:) метод:

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