Rigidbody刚体组件详解

【组件界面】

【作用】

有刚体组件的物体受物理引擎控制,表现得像物理世界中的物体,例如受重力作用、受摩擦力推力等各种力作用、遇到墙会停下来不能穿过去。在Unity中,若某物体不带有碰撞器,仍会被穿过。碰撞器的作用在于检测空间中的两个物体是否发生重叠,刚体的作用在于使得物体表现出物理效果。

【属性】

  • Mass:质量,单位为kg,建议发生碰撞的两个物体的质量差小于100倍。(物理世界中每个物体都有质量)
  • Drag:空气阻力,0表示没有阻力,无限大则物体立即停止运动。(物理世界中的物体在空气中运动会受到空气阻力)
  • Angular Drag:角阻力,物体在旋转时受到的扭力(阻力),0表示没有扭力,无穷大物体不能使物体停止旋转。(物理世界中的物体在旋转时会受到空气阻力)
  • Use Gravity:是否使用重力,使用时物体受到重力影响(物理世界中的物体都受重力,在设计游戏时会遇到希望物体在某条件下受重力)
  • Is Kinematic:是否设为运动学刚体,如果是,物体不会受物理引擎控制(可以影响其他刚体,但不被其他刚体影响),只能通过直接设置Transform来操作它的,一般用来实现移动平台,或者带有HingeJoint的动画刚体。例如,我们希望通过脚本控制角色,但又希望触发器能检测到角色(角色和物体触碰时物体要表现出物理效果),可以将角色设置为运动学刚体。
  • Interpolate:插值,若物体在运动时抖动可以尝试修改该值。
    • None:表示不用插值
    • Interpolate:基于前一帧中物体的Transform来平滑当前帧物体的Transform
    • Extrapolate:基于预测的下一帧物体的Transform来平滑当前帧物体的Transform
  • Collision Detection:碰撞检测方式,用于防止物体移动速度过快而来不及进行碰撞检测而导致物体穿模。(例如用离散碰撞检测时,上一帧在屋外,下一帧在屋内,检测不到碰撞,而物体已经穿墙)
    • Discrete:离散碰撞检测,默认值。该物体和其他物体都使用该方式进行碰撞检测
    • Continuous:连续碰撞检测。同有刚体、碰撞器的物体碰撞时,用离散碰撞检测;同无刚体、有碰撞器的物体碰撞时,用基于扫描的连续碰撞检测。影响性能,慎用。
    • Continuous Dynamic:连续动态碰撞检测。同刚体设为连续碰撞检测、连续动态碰撞检测的物体碰撞时,用基于扫描的连续碰撞检测;同无刚体、有碰撞器的物体碰撞时,用连续碰撞检测;同其他物体碰撞时使用离散碰撞检测。一般用于快速移动的物体。
    • Continuous Speculative:连续预测碰撞检测,只能为运动学刚体设置为该模式或离散碰撞检测模式。比其他连续碰撞检测模式耗费少
  • Constraints:刚体运动的约束,可以约束物体的World Position或Local Rotation不改变

【注意】

  • 用推力和扭力改变物体的Position和Rotation时,不要再直接操作物体的Transform
  • 使用AddForce而物体不动可能是物体太重了,减小Mass
  • 物体的大小会影响碰撞计算,如果需要使用物理引擎,最好按照物体真实比例来建模
  • AddForce和Velocity在Mass很小时效果可能相同。当物体质量很大时,施加同样的力时物体移动变慢,甚至不动,而给定同样的速度时,物体移动速度不变。在物理中,有力会产生加速度,加速度引起速度变化,速度变化引起位置变化。因此,AddForce会使得物体速度越来越快,而Velocity使得物体速度恒定。
  • 使用Rigidbody.AddForce(1,0,0)或者Rigidbody.velocity=new Vector(1,0,0)想使得Cube水平移动,而Cube滚动起来,是因为Cube还受重力作用,两个方向的力会使得Cube滚起来。要水平移动,有三种方法:一是计算大小合适的力以抵消重力,二是不勾选Use Gravity,三是勾选Freeze Rotation。
  • 要在FixedUpdate中使用velocity和AddForce,其本质仍是不停地改变transform,改变极为快速微小,使得人眼看起来是在连续运动。

【特性】 

  • 睡眠:物体移动或旋转过低时,会进入睡眠模式,停止移动。物体被碰撞或受力时会被唤醒,也可通过WakeUp函数显式唤醒游戏对象。
  • 父子化:当带有刚体的物体的父物体通过Transform移动时,该物体会随着父物体移动,但同时还会受重力影响而下落。
  • 复合碰撞体:对于形状复杂的物体,这个物体可能由多个带有碰撞器的子物体组成,将这个物体设置为一个空物体的子物体,给空物体挂在刚体组件,则这个物体会成为刚体。

【拓展-连续碰撞检测】

连续碰撞检测分为基于扫描的连续碰撞检测和基于推测的连续碰撞检测。

基于扫描的连续碰撞检测(Sweep-based CCD)采用撞击时间算法。基于当前的速度和移动方向计算可能的碰撞所需时间,在到达该时间时停止运动。具体会分为多个子步骤执行:计算TOI,计算当前速度,重新扫描。这会导致使用多个CPU周期。

因为其是基于线性扫描的,所以会忽略物体的角运动。当物体旋转过快时,同样会穿过某些物体。

已启用 Continuous Dynamic 属性的细杆游戏对象。绕轴心点快速旋转时,此杆不会与球体接触。

基于推测的连续碰撞检测(Speculative CCD)采用AABB算法,可以检测出物体线性运动和角运动可能产生的碰撞,成本通常低于前者,因为只在碰撞检测阶段(而不在求解和积分阶段)计算触点。

但因为会计算所有可能的触点,会把原来不会产生碰撞的触点也算出来,导致产生幽灵碰撞(ghost collision)

在 c0 处产生的幽灵碰撞导致球体错误地向上跳跃,而不是笔直向前移动

同时,如果物体在距离碰撞处很近,受到巨大能量时,也会产生穿过物体的现象,因为碰撞处刚好不在盒子空间内。(此处不理解,请去了解AABB算法)

具有扩大的 AABB 的球体使用推测性 CCD,此算法仅在碰撞检测阶段计算触点,因此可能会发生穿过事件

【参考】

https://docs.unity3d.com/Manual/class-Rigidbody.html

Unity - Manual: Continuous collision detection (CCD) (unity3d.com)

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值