我正在开发一款将对象拖放到盒子中的游戏,但我不知道检测我的对象是否在盒子中的最好,最有效的方法是什么。

我对碰撞器非常清楚,我正在使用BoxColliders和触发器来确定我的对象是否正在触摸盒子,但是我想检测出我的对象的瞬间(为了简单起见,我们可以假设它是球形的,但稍后会是一个网格)完全在我的盒子触发器/对撞机内。

我读过有关“碰撞机”的“包含”方法的信息,但是IIRC他们只是检查该碰撞机内是否有单个点,但我有兴趣知道整个对象是否在碰撞机内。

在此先感谢大家。

最佳答案

简短答案:如果想要100%的准确性,您的算法将永远不会比O(| V |)(最坏的情况)好,其中V = {网格中的所有顶点},这意味着您将对每个对象运行.Collides()如果发现容器外的顶点,则折断顶点。

更长的答案:存在几种分割网格表面的方法,示例包括:KD-TreesOcTrees。这些超出了SO答案的范围,无法提供完整的实现,建议您查看Wiki页面以获取详细信息。

您可以使用这些方法将网格划分为较小的顶点集。为了加快算法的运行速度,您将从分割树的根开始,然后测试该节点是否包含在您的容器框中。继续遍历这棵树,直到找到未包含在盒子中的节点。这将使您的“包含”测试失败更快,但是如果您的盒子包含网格,最终您将结束对每个顶点的测试。

警告:如果您的网格物体是动画的,则此解决方案不起作用。在这种情况下,最好的选择是使用 ARM ,脚,腿等周围的边界,并使用该信息来剔除Contains()测试。同样,如果网格完全位于盒子内部,您将不得不测试每个顶点。

关于unity3d - 如何检测我的物体完全在盒子里?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13101775/

10-13 06:41