|
离散式的碰撞检测中,帧与帧之间是独立的,因此会遇到题主所述的问题,即碰撞体上一个帧没撞上墙,而下一个帧穿过了墙,该物体本身在任意一个帧独立来看都是不知道自己会撞墙的(物理学中管这个叫量子隧穿效应)。
连续式的碰撞检测则可以避免这一点。
原理和题主所述是一样的,就是射线检测法(Ray-casting)。当然额外的计算量也意味着额外的系统负担。
对于Unity引擎而言,是可以直接解决这个问题的。
Unity的Rigidbody里有个Collision Detection的碰撞检测属性。
该属性有三个选项:Discrete(离散), Continuous(连续), Continuous Dynamic(动态连续)。
官方Manual里的解释如下:Collision DetectionUsed to prevent fast moving objects from passing through other objects without detecting collisions.
- Discrete: Use Discreet collision detection against all other colliders in the scene. Other colliders will use Discreet collision detection when testing for collision against it. Used for normal collisions (This is the default value).
-Continuous: Use Discrete collision detection against dynamic colliders (with a rigidbody) and continuous collision detection against static MeshColliders (without a rigidbody). Rigidbodies set to Continuous Dynamic will use continuous collision detection when testing for collision against this rigidbody. Other rigidbodies will use Discreet Collision detection. Used for objects which the Continuous Dynamic detection needs to collide with. (This has a big impact on physics performance, leave it set to Discrete, if you don’t have issues with collisions of fast objects)
-Continuous Dynamic: Use continuous collision detection against objects set to Continuous and Continuous Dynamic Collision. It will also use continuous collision detection against static MeshColliders (without a rigidbody). For all other colliders it uses discreet collision detection. Used for fast moving objects. Unity - Manual: Rigidbody
其中的Discreet一词应为笔误,实为Discrete(Discreet意为慎重,两者意思相差很大)。整个Manual里没有第二处用到Discreet的地方,也没有任何官方说明提到该词。
翻译过来基本上就是
碰撞检测属性:用于防止快速移动的物体穿过其他物体而不触发碰撞检测。
离散(Discrete):
- 碰撞体在遇到本场景其他碰撞体时使用离散式碰撞检测(Discrete)。
- 其他碰撞体在遇到它时会使用离散式碰撞检测(Discrete)。
- 用于正常碰撞。(这是默认值)
连续(Continuous):
- 碰撞体在遇到其他动态碰撞体(即包含rigidbody)使用离散式碰撞检测(Discrete),在遇到静态MechColliders(即不含rigidbody)时使用连续式碰撞检测(Continuous)。
- 设为动态连续(Continuous Dynamic)的碰撞体在遇到该物体时使用连续式碰撞检测(Continuous), 其他碰撞体在遇到该物体时使用离散式碰撞检测(Discrete)。
- 用于设定被动态连续(Continuous Dynamic)的物体所碰撞的物体。(会影响物理引擎的性能表现。如果你没有快速运动物体的碰撞问题,就乖乖设为离散吧)
动态连续(Continuous Dynamic):
- 碰撞体在遇到其他设为连续(Continuous)或动态连续(Continuous Dynamic)的物体时使用连续式碰撞检测(Continuous)。在遇到静态MeshColliders(即不含rigidbody)时也使用连续式的碰撞检测。遇到其他碰撞体则使用离散式碰撞检测(Discrete)。
- 用于快速运动的物体。
理成一个碰撞检测属性与碰撞检测方式的对应表格就是:
如果你有一个快速运动的小球,它会穿过一个静态的墙,那么将球设为Continuous即可解决问题。
但如果你有多个这样的小球,它们之间则依旧会遇到互相穿过对方的问题,那么将球都设为Continuous Dynamic更好。
所以遇到题主的问题时,将快速运动的物体设为Continuous/Continuous Dynamic即可。
理论上你可以设定所有物体为Continuous Dynamic,然而这样的物体数量一旦增加起来,对性能会有很大的影响。 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|