SCNNode не привязывается к координатам реального мира - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть простой SCNNode, который я хочу разместить в реальной позиции, узел соответствует ориентиру с известными координатами. Я хочу, чтобы SCNNode оставался на своем месте, однако он имеет тенденцию двигаться вместе с камерой. Я не могу использовать обнаружение самолета или проверку удара, чтобы поместить узел в реальный мир, я могу использовать только координаты реального мира. Мое текущее решение создает ARanchor с использованием преобразования мира SCNNodes.

showNode(node: Node, location: convertedPoint)
let anchor = ARAnchor(transform: Node.simdWorldTransform)
self.sceneView.session.add(anchor: anchor)

Я думал, что этого будет достаточно для привязки узла. Есть ли решение для закрепления узла без использования определения плоскости или проверки попадания?

Спасибо

1 Ответ

0 голосов
/ 19 февраля 2020

Во-первых, даже если вы стабилизируете свой узел с помощью якоря, он никогда не будет идеальным, просто лучше.

Однако, хотя ARAnchor создается в координатах, которые вы ему сообщаете, но узел вы хотите, чтобы стабилизация фактически не помещалась в этот якорь.

Вам необходимо реализовать функцию renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) в вашем ARSCNViewDelegate и вернуть целевой узел, который вы хотите стабилизировать с помощью якоря (Альтернативно, Вы можете добавить свой узел в качестве дочернего узла созданного по умолчанию узла привязки, реализовав функцию renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor)).

Если ваш объект nodeToBeStabilized доступен как свойство в ViewController, то очень глупая реализация может быть как то так:

extension WAViewController: ARSCNViewDelegate, ARSessionDelegate {
    func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
        return nodeToBeStabilized
    }
}
...