Действительно ли якорь .camera
расположен именно там, где расположена физическая камера iPad / iPhone, или он расположен дальше назад (возможно, там, где пользователь обычно держит iPad / iPhone)?
Ответ I
В платформах RealityKit и ARKit ARCamera имеет pivot point
, как и другие объекты (узлы), и находится в точке, где прикреплен объектив к корпусу камеры (на уровне отсек onet). Этот стержень может быть привязан AnchorEntity(.camera)
. Другими словами, виртуальная камера и камера реального мира имеют эту точку поворота примерно в одном месте. Таким образом, если вы присоединяете AnchorEntity к этому стержню, а затем модель к этому AnchorEntity, вы помещаете его в координаты, где отсек камеры onet расположен в определенный момент времени (в определенном отдельном кадре, а не для последовательности кадров) .
Как заставить дочерний объект 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
}
}