- 1、本文档共2页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
浅谈Unity-Rigidbody碰撞穿透
⾸先,说说碰撞的条件:1.rigidbody (刚体),⼀般⽤在主动移动的物体上,⽐如⾓⾊。2.collider ,碰撞
器,⼀般⽤于受⼒物体上,⽐如障碍块。
物理的碰撞当然是基于物理检测计算,⽽这个计算是消耗cpu和gpu的,那么,碰撞穿透是什么⿁?
发⽣概率即触发⽅式:
1.刚体速度⾜够快,被撞物体的collider⾜够薄。
2.刚体速度在⼀定的v ,被撞物体也在⼀定的速度v (被撞物体可移动)。
3.暂时未发现的其他情况。
在分析这两种(3种)情况之前,先了解下⼀个刚体(rigidbody )属性参数:Collision Detection (碰撞检
测):
它有三种选项:Discrete (离散),Continuous (连续),Continuous Dynamic (动态连续),我们参考下
官⽅的解释:
该属性⽤于控制避免⾼速运动的游戏对象穿过其他的对象⽽未发⽣碰撞,有三项可供选择
Discrete :离散碰撞器。该模式与场景中其他的所有碰撞体进⾏碰撞检测。该项为默认值。
Continuous :连续碰撞检测。该模式⽤于检测与动态碰撞体(带有Rididbody)的碰撞,使⽤连续碰撞检
测模式来检测与⽹格碰撞体(不带ridigbody )碰撞。(添加⼀句原⽂翻译漏了),Rigidbody设置为连续
动态碰撞检测模式将使⽤连续碰撞来检测。其他刚体会采⽤离散碰撞模式。此模式适⽤于那些需要与采
⽤连续动态检测的对象相碰撞的对象。这对物理性能会有很⼤影响,如果不需要对快速运动对象进⾏碰
撞检测,就使⽤离散碰撞检测模式。
Continuous Dynamic :连续动态碰撞检测模式,该模式⽤于检测与采⽤连续碰撞撞模式或连续
动态碰撞模式对象的碰撞,也可⽤于检测没有rigidbody的静态⽹格碰撞体。对于与之碰撞的其他对象可
采⽤离散碰撞检测。动态连续碰撞检测模式也可⽤于检测快速运动的游戏物体。
翻译就是这样的理解并不难:后⾯两项就是为了⽤来能够检测到快速运动的物体不⾄于
你的void OnCollisionEnter(Collision hit)函数检测不到,⽽⾄于⼀个为Continuous Dynamic的刚体和⼀个
Discrete的刚体碰撞,前者会使⽤使⽤Continous (连续)碰撞,后
者离散碰撞
再来总结下:当使⽤默认的离散式碰撞检测时,如果前⼀桢时对象在墙这⼀⾯,下⼀桢时对象已到到了
墙另⼀⾯,那么碰撞检测算法将检测不到碰撞的发⽣,你可以将该对象的碰撞检测属性设置为
Continuous ,这时碰撞检测算法将会防⽌对象穿过所有的静态碰撞体,设置为Continuous Dynamic将还会
防⽌穿过其他也设置为Continuous或者Continuous Dynamic的刚体。
这就很好理解,如果我们的主⾓在运动中碰到的都是静态collider ,那么使⽤离散检测是可以满⾜的。如
果我们在游戏中,主⾓将会碰撞到动态的collider ,那么检测模式应该选择连续或者连续动态检测。这样
可以很好的避免穿透现象。
然后,你以为这样就⾼枕勿忧了么?在实际的项⽬中,我们可能会发现,我们刚体上已经选择了连续检
测甚⾄连续动态检测,依旧会有穿透问题,这就是我上⾯列举的两条(3条),被碰撞体的碰撞器太
薄,被碰撞体的速度太快。这样依旧会导致穿透,那么原理是什么?我们知道unity中有fixedupdate ,
update这些更新⽅法,⽽这些更新中,都是有时间间隔更新的,更新的时候是⽤基础速度*时间,很有可
能这个结果计算出来的时候车已经冲过了被碰撞体,就导致了我们的⾓⾊穿透,或者卡在被碰撞器的⾥
⾯。
so ,知道了这些,我们在项⽬中就知道如何规避这些“bug”了。
文档评论(0)