深入理解Unity的碰撞检测机制

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入理解Unity的碰撞检测机制相关的知识,希望对你有一定的参考价值。

参考技术A 原文链接: http://www.manew.com/thread-102595-1-1.html

碰撞检测,就是检测两个物体是否相交,如果物体非常规则,比如球体,直接检测圆心距离是否小于半径和即可,计算量十分小,但是,如果物体不规则,比如一个角色,进行十分细致的碰撞检测就会变的十分困难,这时候,我们一般会用简单几何体去逼近复杂网格

为了解决这个 问题 ,unity里使用了空间划分技术,目前主流的划分技术有BSP,BHV,八叉树,四叉树

首先选定一个面作为根节点(一般会选两侧物体数量大致相同的面),然后遍历物体,如果物体在此面正面,将其加入到左子节点,如果在反面,加入到右子节点,如果和此面相交,加入左右两个子节点,之后,将左右子节点作为新的根节点进行递归,
构建完成后,在检测时,只要检测同一叶子节点的所有物体就行了

这里注意,检测物体位于哪面一般使用长方体来进行近似的,大家用unity的时候可能也注意到,gameobject有width和height两个属性,这两个属性很可能是用来进行划分的

这两个其实原理相同,上面是四叉树,类比到3d空间就是八叉树

这时,我们可以发现,如果碰撞体位移了,或者碰撞网格改变了,树的结构也会随之变化,这里我猜测,unity内部会有静态和动态两种树,静态树时预先计算好的,而动态树则会在有物体位移时重新计算,而动态树很可能也有相关优化,比如子物体多的物体会单独维护一个树,再将其作为动态树的子树
而这里有个问题,物体位移时树是会改变的,碰撞不会出现问题。但碰撞网格在运行时改变的话,碰撞会失效,如果我们动态生成一个物体,为其加入网格碰撞器,那么,它仍然不会有碰撞检测,可能是由于树没有更新,也有可能逼近算法没有执行,解决办法是,生成物体后,调用Setactive(false),然后Setactive(true)
在OnEnable里,会调用函数生成对网格进行碰撞检测所需的信息

接下来说一下连续碰撞检测的问题,上图说明了不同collisiondectection的物体是否进行连续检测

以上是关于深入理解Unity的碰撞检测机制的主要内容,如果未能解决你的问题,请参考以下文章

Unity 碰撞检测与触发检测

unity碰撞检测(碰撞器,触发器)

unity3d碰撞器检测碰撞跟触发器检测碰撞哪个好些

Unity 3D 碰撞检测

Unity入门碰撞检测与触发检测

unity3d 怎么检测碰撞?比如主角碰撞到物体之后销毁被撞到的物体