У меня есть несколько маркеров, размещенных на моей сцене в качестве дочерних узлов в фиксированных положениях узлов в трехмерном мире.Когда я перемещаю телефон, мне нужно определить, какой узел маркера находится ближе всего к центру 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
}
}
}
}