我在场景中放置了一堆标记作为 3D 世界中固定节点位置的子节点。当我移动手机时,我需要确定哪个标记节点最接近 2D 屏幕中心,因此我可以获取与该节点对应的文本描述并显示它。
现在,在渲染循环中,我刚刚在 forEach 循环中确定了每个节点与屏幕中心的距离,并确定该距离是否小于 150,如果是,则获取该节点的标题和副本。但是,这并不能解决我的问题,因为可能有多个节点满足该条件。我需要比较所有节点到中心的距离,并得到最接近的一个节点
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
}
}
}
}