关于ios:SceneKit:在SCNView中特定位置查找节点的原生方法?如果没有,使用字典将位置映射到节点吗?

SceneKit: native way to find node at certain position in SCNView? If not, use a dictionary to map positions to nodes?

SceneKit是否有本机方式在SCNView中的给定位置(例如(0,0,0))处找到节点?

假定SCNView包含一个SCNNode,该SCNNode充当其他SCNNode的层。有没有一种本机的方法可以找到该层内特定位置的所有节点?

阅读类文档,似乎唯一的选择是创建并维护一个自定义数据结构,以将位置映射到节点。

但是希望有一些本机,因为这似乎是一个常见问题。

如果需要自定义数据结构,那么字典是否是在Swift中维护10K节点上的制表符的最有效方法?


节点符合SCNBoundingVolume,因此您可以大致了解节点是否"包含"原点。您还可以将-[SCNNode
- hitTestWithSegmentFromPoint:toPoint:options:]
与其他选项一起使用以优化搜索。


尽管我从未尝试过,但看起来SCNPhysicsWorld可以帮助您做到这一点。您要跟踪或查询的每个节点上都需要一个物理主体。

您可以在目标点放置不可见的主体,然后等待碰撞委托回调。

还有convexSweepTestWithShape(_ shape: SCNPhysicsShape,
fromTransform from: SCNMatrix4,
toTransform to: SCNMatrix4,
options options: [String : AnyObject]?) -> [SCNPhysicsContact]

另一种方法是将SCNSceneRenderer的nodesInsideFrustumWithPointOfView函数与正射SCNCamera配合使用,以便获得矩形或立方体的平截头体。

通常,对于SceneKit,请检查所有适用的协议引用。许多常见的调用是基于协议而不是类。