Как определить, какой childNode находится ближе всего к центру экрана в SceneKit? - PullRequest
0 голосов
/ 08 июня 2019

У меня есть несколько маркеров, размещенных на моей сцене в качестве дочерних узлов в фиксированных положениях узлов в трехмерном мире.Когда я перемещаю телефон, мне нужно определить, какой узел маркера находится ближе всего к центру 2D-экрана, чтобы я мог получить текстовое описание, соответствующее этому узлу, и отобразить его.

Прямо сейчас, в цикле рендеринга, я просто определил расстояние каждого узла от центра экрана в цикле forEach и решу, будет ли это расстояние <150, если это так, получим заголовок и копию этого узла.Тем не менее, это не решает мою проблему, потому что может быть несколько узлов, которые удовлетворяют этому условию.Мне нужно сравнить расстояния от центра по всем узлам и получить тот самый ближайший узел </p>

func renderer(_ renderer: SCNSceneRenderer, willRenderScene scene: SCNScene, atTime time: TimeInterval){

    scene.rootNode.childNodes.filter{ $0.name != nil }.forEach{ node in

        guard let pointOfView = sceneView.pointOfView else { return }
        let isVisible = sceneView.isNode(node, insideFrustumOf: pointOfView)
        if isVisible {

            let nodePos = sceneView.projectPoint(node.position)
            let nodeScreenPos = CGPoint(x: CGFloat(nodePos.x), y: CGFloat(nodePos.y))
            let distance = CGPointDistance(from: nodeScreenPos, to: view.center)

            if distance < 150.0 {
                print("display description of: \(node.name!)")
                guard let title = ar360Experience?.threeSixtyHotspot?[Int(node.name!)!].title else { return }
                guard let copy = ar360Experience?.threeSixtyHotspot?[Int(node.name!)!].copy else { return }
                titleLabel.text = title
                copyLabel.text = copy

                cardView.isHidden = false

            }else {
                cardView.isHidden = true
            }
        }

    }
}

1 Ответ

0 голосов
/ 08 июня 2019

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

Что вы можете сделать, это сохранить данные вашего узла в другом формате, используя что-то вроде GKQuadTree ... https://developer.apple.com/documentation/gameplaykit/gkquadtree

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

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

Таким образом, когда вы запрашиваете узлы, расположенные ближе всего к данной точке, это может быстро устранить большинство узлов.

...