如何检查节点是否被光线击中?

时间:2014-12-20 19:21:39

标签: ios scenekit

目前我有一个灯,一个飞机和一个立方体,还有另一个节点,我想检查它是否被光线击中。我想检查整个节点本身是不是被光线击中了。节点是单个元素,而不是层次结构。

1 个答案:

答案 0 :(得分:3)

照明是GPU上发生的事情。即使您在自己的引擎中直接使用OpenGL或类似工具,找到有关照明结果的内容也不是非常简单或有效的事情。

那就是说,根据你想知道的确切内容(以及你需要了解它的频率),有一些可能有用的近似值。

  • 对于聚光灯,请调用视图的isNodeInsideFrustum:withPointOfView:方法,为第一个参数传递您想知道的节点,并将聚光灯作为第二个参数传递给节点。这告诉您节点的边界框的任何部分是否在该区域中"看到"通过光(但如果其间有任何其他节点遮挡光线则不会)。

  • 根据节点position(或其边界框的角落)的距离,检查attenuationEndDistance灯光。

  • 使用hitTestWithSegmentFromPoint:toPoint:options:检查从灯光开始并在节点(其position或边界框角落)结束的光线。如果命中测试找到节点,则灯可以到达它(模衰减)。如果命中测试首先找到另一个节点,那么您关心的节点至少部分处于阴影中。

尝试使用这些技巧的变体或组合可能会让您获得正在寻找的东西或足够接近的东西。但要注意:测试有一个CPU时间成本,所以你可能不想每帧都做一个(或几个)。