【Physics】一、Rigidbody 刚体

点击访问官网 物理系统刚体概述刚体 (Rigidbody)

1、刚体组件

刚体 (Rigidbody) 使游戏对象的行为方式受物理控制。刚体可以接受力和扭矩,使对象以逼真的方式移动。任何游戏对象都必须包含受重力影响的刚体,行为方式基于施加的作用力(通过脚本),或通过 NVIDIA PhysX 物理引擎与其他对象交互。

在这里插入图片描述

属性功能
Mass对象的质量(默认为千克)。
Drag根据力移动对象时影响对象的空气阻力大小。
0 表示没有空气阻力,无穷大使对象立即停止移动。
Angular Drag根据扭矩旋转对象时影响对象的空气阻力大小。
0 表示没有空气阻力。
请注意,如果直接将对象的 Angular Drag 属性设置为无穷大,无法使对象停止旋转。
Use Gravity如果启用此属性,则对象将受重力影响。
Is Kinematic如果启用此选项,则对象将不会被物理引擎驱动,只能通过__变换 (Transform)__ 对其进行操作。
对于移动平台,或者如果要动画化附加了 HingeJoint 的刚体,此属性将非常有用。
Interpolate仅当在刚体运动中看到急动时才尝试使用提供的选项之一。
None不应用插值。
Interpolate根据前一帧的变换来平滑变换。
Extrapolate根据下一帧的估计变换来平滑变换。
Collision Detection用于防止快速移动的对象穿过其他对象而不检测碰撞。
Discrete对场景中的所有其他碰撞体使用离散碰撞检测。
其他碰撞体在测试碰撞时会使用离散碰撞检测。
用于正常碰撞(这是默认值)。
Continuous对动态碰撞体(具有刚体)使用离散碰撞检测,并对静态碰撞体(没有刚体)使用基于扫掠的连续碰撞检测。
设置为__连续动态 (Continuous Dynamic)__ 的刚体将在测试与该刚体的碰撞时使用连续碰撞检测。
其他刚体将使用离散碰撞检测。
用于__连续动态 (Continuous Dynamic)__ 检测需要碰撞的对象。
(此属性对物理性能有很大影响,如果没有快速对象的碰撞问题,请将其保留为 Discrete 设置)
Continuous Dynamic对设置为__连续 (Continuous)__ 和__连续动态 (Continuous Dynamic)__ 碰撞的游戏对象使用基于扫掠的连续碰撞检测。
还将对静态碰撞体(没有刚体)使用连续碰撞检测。
对于所有其他碰撞体,使用离散碰撞检测。
用于快速移动的对象。
Continuous Speculative对刚体和碰撞体使用推测性连续碰撞检测。
这也是可以设置运动物体的唯一 CCD 模式。
该方法通常比基于扫掠的连续碰撞检测的成本更低。
Constraints对刚体运动的限制:
Freeze Position有选择地停止刚体沿世界 X、Y 和 Z 轴的移动。
Freeze Rotation有选择地停止刚体围绕局部 X、Y 和 Z 轴旋转。
Info显示刚体信息。

2、刚体脚本

点击访问官网 Rigidbody Class

2.1、获取刚体

Rigidbody rb;

void Start()
{
    rb = transform.GetComponent<Rigidbody>();
}

2.2、添加力

  • 向刚体添加力(在中心):AddForce(方向大小,力类型)
/**
 * enum ForceMode
 *  Force:使用刚体的质量向刚体添加连续力   F = m · a  
 *  Acceleration:将连续加速度添加到刚体,忽略其质量  v = a · t
 *  Impulse:使用刚体的质量向刚体添加即时力脉冲   I = F · t = m · a · t = m · v
 *  VelocityChange:将即时速度变化添加到刚体,忽略其质量 
 */
rb.AddForce(new Vector3(0, 0, 1), ForceMode.VelocityChange); // 共 4 个重载

// 上面那句力模型为 VelocityChange 时与下面这句对速度直接赋值效果完全一毛一样
rb.velocity = new Vector3(0, 0, 1);
  • 在 position 处施加力。这将向对象施加扭矩和力:AddForceAtPosition(方向大小,施加力的位置,力类型)
// 共 2 个重载
rb.AddForceAtPosition(new Vector3(0, 1, 0), forcePosition.position, ForceMode.Impulse);
  • 向模拟爆炸效果的刚体施加力:AddExplosionForce(爆炸力,爆炸中心,爆炸半径,...)
// 共3个重载
rb.AddExplosionForce(100, forcePosition.position, 3);

2.3、Move

  • 将刚体运动到 position:MovePosition(position)
rb.MovePosition(target.position);
  • 将刚体旋转到 rotation:MoveRotation(rotation)
rb.MoveRotation(target.rotation);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

纯纯的小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值