arrays - 如何确定SceneKit中哪个childNode最接近屏幕中心?

标签 arrays swift scenekit child-nodes

我在场景中放置了一堆标记作为 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
            }
        }

    }
}

最佳答案

有多种方法可以做到这一点。就像迭代所有节点来找到它们的距离一样。但正如你所说,这变得低效。

您可以做的是使用 GKQuadTree 之类的东西以不同的格式存储节点数据... https://developer.apple.com/documentation/gameplaykit/gkquadtree

这是一个 GameplayKit,它可以让您更快地迭代数据集,以便找到最接近中心的节点。

它的工作原理是将区域分解为四个(因此是四边形)部分,并将节点存储到其中一个存储该部分矩形的部分中。然后,它将这四个部分中的每一部分分解为另外四个部分,依此类推。

因此,当您询问最接近给定点的节点时,它可以快速消除大多数节点。

关于arrays - 如何确定SceneKit中哪个childNode最接近屏幕中心?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56508640/

相关文章:

java - 合并循环中的冗余信息

javascript - 检查一行数组值中的 3 个是否相同

ios - 如何创建逼真的 .scn 文件?

javascript - 如何比较两条不同路径的点(点数组)

javascript - 如何使用 ES2016 在不同条件下过滤数组?

ios - 将 UIWebView 添加到 MKPinAnnotationView.detailCalloutAccessoryView

swift - 如何从Swift中的BLE Peripheral特性写回调中提取数据?

ios - 禁用文本字段中的字母字符(我的部分代码不会执行)

video - iOS10 + SceneKit : render a video with custom shader

ios - 从 SceneKit 导出 USDZ 会导致模型变暗