我有一个 2 SCNNode 彼此相邻(1 个大盒子和 1 个小盒子)。
我旋转它的父母,以便相机中的小盒子有时不再可见,是否可以知道小盒子何时不可见,因为它在大盒子后面?
我目前的结构
Scene - RootNode - SCNNode (camera) - SCNNode (parent) - SCNNode (Big box) - SCNNode (Small box)
您正在寻找的是遮挡测试,并不是 SceneKit 提供的 API。在一般情况下,这是一个很大的问题。
但是,由于你只是在使用盒子,所以有很好的方法来伪造它。如果小盒子隐藏在大盒子后面,那么从相机位置到每个小盒子的八个角落的线将与大盒子相交。
所以:
在包含两者(根节点)的节点的坐标系中获取摄像机和每个角的位置。对于方框角,您可以获取方框节点的位置并进行数学运算以获得角点,或使用SCNBoundingVolume协议。您可能需要使用一些SCNNode坐标转换方法来获取同一空间中的所有点。
SCNBoundingVolume
SCNNode
对于每个角,使用hitTestWithSegmentFromPoint:toPoint:options:方法进行射线测试。
如果所有八个命中测试都返回大盒子,则小盒子完全隐藏在大盒子后面。
1 回答
您正在寻找的是遮挡测试,并不是 SceneKit 提供的 API。在一般情况下,这是一个很大的问题。
但是,由于你只是在使用盒子,所以有很好的方法来伪造它。如果小盒子隐藏在大盒子后面,那么从相机位置到每个小盒子的八个角落的线将与大盒子相交。
所以:
在包含两者(根节点)的节点的坐标系中获取摄像机和每个角的位置。对于方框角,您可以获取方框节点的位置并进行数学运算以获得角点,或使用
SCNBoundingVolume
协议。您可能需要使用一些SCNNode
坐标转换方法来获取同一空间中的所有点。对于每个角,使用hitTestWithSegmentFromPoint:toPoint:options:方法进行射线测试。
如果所有八个命中测试都返回大盒子,则小盒子完全隐藏在大盒子后面。