Как получить угол и расстояние между камерой и положением изображения объекта Позиция в Аркыт? - PullRequest
0 голосов
/ 24 сентября 2018

Работа над приложением AR, где мне нужно поместить объект в ARImageAnchor, как только изображение будет отслежено, а 3D-модель размещена, тогда она не должна двигаться вместе с привязкой изображения, она должна просто следовать за углом камеры на iPhone и заданным расстоянием от привязки.

Пробная партия кода.

func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
    let node = SCNNode()
    if let imageAnchor = anchor as? ARImageAnchor {
            self.mainNode.simdTransform = anchor.transform
            self.sceneView.scene.rootNode.addChildNode(self.mainNode)
}

Еще одна попытка:

func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
    let node = SCNNode()
    if let imageAnchor = anchor as? ARImageAnchor {
            guard let pointOfView = self.sceneView.pointOfView else { return }
            let transform = pointOfView.transform
            self.mainNode.transform = transform
self.sceneView.scene.rootNode.addChildNode(self.mainNode)

}

func renderer(_ renderer: SCNSceneRenderer, willRenderScene scene: SCNScene, atTime time: TimeInterval) {
    guard let pointOfView = self.sceneView.pointOfView else { return }
    let transform = pointOfView.transform


let translationMatrix = SCNMatrix4Translate(transform, 1.0 , -0.5, -3.0)
}

Невозможно понять, как получить расстояние и уголмежду преобразованием pointOfView и Anchor.tranform.Любая помощь будет очень признательна.Заранее спасибо.

1 Ответ

0 голосов
/ 24 сентября 2018

Вам необходимо использовать преобразование камеры и / или eulerAngle:

let cameraTransform = self.sceneView.session.currentFrame.camera.transform
let cameraEulerAngle = self.sceneView.session.currentFrame.camera.eulerAngle

cameraTransform - это матрица 4x4. Если вам нужны одиночные координаты, вам нужно получить третий столбец:

let x = cameraTransform.columns.3.x
let y = cameraTransform.columns.3.y
let x = cameraTransform.columns.3.z

Это координаты трех осей.

cameraEulerAngle - это матрица 3x3, и вы можете получить:

  • Шаг (x вращение)
  • Yaw (вращение y)
  • Roll (вращение по оси z)

let angleX = cameraEulerAngle.x
let angleY = cameraEulerAngle.y
let angleZ = cameraEulerAngle.z

Если вы хотите, чтобы узел располагался перед камерой,вам нужно использовать координаты X, Y камеры и указать значение Z, которое является расстоянием (в метрах) от камеры.Обратите внимание, что вам нужно добавить смещение по координатам оси, основанное на повороте камеры, если вы хотите быть более точным.

Вы можете получить больше информации здесь и здесь (ARCamera)

...