刚体参数
刚体
- 刚体是在任何力的作用下,体积和形状都不发生改变的物体,是一种理想模型。
- 添加Rigidbody组件可以使物体具备物理属性,使其运动符合物理规律。
- 通过刚体控制物体移动,多用于2D游戏,空洞骑士就是用的刚体驱动?
- 3D游戏有很多细节问题,上楼梯,容易卡在障碍物中等,不适于直接用刚体驱动。应该用[[角色控制器]]。
质心(重心)
- 如果受力的方向通过了该物体的质心,物体就不会获得角速度。 如果受力的方向错过了质心,那么物体就会有旋转的趋势。质心到受力线的距离越远,旋转的趋势就越强。
1
2
// 设置centerOfMass就可以指定重心了(本地坐标系)
rigid.centerOfMass = new Vector3(0, -1, 0);
质量 Mass
- 刚体的质量越大,越难改变其运动状态(移动+旋转)。
线性阻尼 Drag
- 阻尼可以使物体慢慢停下来。
角阻尼 Angular Drag
- 角阻尼可以使刚体慢慢的停止旋转。
- 角阻尼越大,物体越不容易转动。
冲量
- 冲量 = 力 * 时间
Is Kinematic
- kinematic - 运动学刚体。
- 勾选此项,物体由动力学刚体变为运动学刚体。
- 动力学刚体自身会受到力,碰撞,或者关节的影响。
- 运动学刚体自身不受力,碰撞,或者关节的控制,完全由动画或者代码([[Transform]], [[Unity-NavMesh]])驱动。但运动学刚体可以通过碰撞或者关节影响其他刚体的运动。
- 简言之,两者的区别就是本身的运动会不会受到力的影响。
Collision Detection
Discrete
Continuous
- 高速飞行物体的路径在空间中是一些离散的点,连续碰撞检测方式会通过这些路径点之间的连线检查是否碰撞到物体。
使用刚体控制物体的移动
给物体施加力
- 力作用在物体上会产生加速度,加速度会引起速度的变化。
- 用力控制物体运动的思路在牛顿力学的框架下。
AddForce (Force) -默认
- 使用 AddForce 施加力就是从物体的质心位置施加力。
- Force 模式,向刚体施加连续的力(意味着物体受到force参数的力,时间为一帧的时间(0.02s))。
- 考虑其质量,即同样的力施加在越重的物体上产生的加速度越小。
1
2
3
4
5
6
7
8
9
10
11
12
private float force = 3f;
private void FixedUpdate()
{
float horz = Input.GetAxis("Horizontal");
float vert = Input.GetAxis("Vertical");
Vector3 moveDirection = new Vector3(horz, 0, vert);
moveDirection = moveDirection.normalized;
// 力的持续时间为一个物理帧间隔(默认0.02秒)
rigidbody.AddForce(moveDirection * force);
// 约束速度的最大值
rigidbody.velocity = new Vector3(Vector3.ClampMagnitude(rigidbody.velocity, 5f));)
}
AddForce (Impulse)
- Impulse 模式,向刚体施加瞬时的力(相当于物体瞬间获得受到force参数的力影响一秒钟时间的效果),考虑其质量,即同样的力施加在越重的物体上产生的加速度越小。
- 一般用于爆炸等效果。
1
rigidbody.AddForce(moveDirection * force, ForceMode.Impulse);
AddForceAtPosition
- 第二个参数为施加力的位置,以世界坐标表示,非相对坐标。
- 如果位置不同于质心,会使刚体产生旋转的效果。
1
rigid.AddForceAtPosition(force, position, mode);
直接改变velocity
- 瞬间给物体一个恒定的速度,将物体提升至该速度。
- 直接修改速度,可以跳过加速度引起速度变化的步骤,对速度进行控制。
1
2
3
4
5
6
7
8
private float speed = 10f;
private void FixedUpdate()
{
float horz = Input.GetAxis("Horizontal");
float vert = Input.GetAxis("Vertical");
Vector3 moveDelta = new Vector3(horz, 0, vert);
rigidbody.velocity = speed * moveDelta;
}
实现二段跳
1
2
3
4
5
6
7
8
9
10
private void Update()
{
if (Input.GetButtonDown("Jump"))
{
// 在跳跃时先将角色的纵向速度直接设置为0
rigid.velocity = new Vector3(rigid.velocity.x, 0, rigid.velocity.z);
// 然后再施加垂直跳跃力
rigid.AddForce(new Vector3(0, 100, 0));
}
}
使用刚体控制物体的旋转
角速度 angularVelocity
- 可以直接修改刚体的角速度让刚体旋转。
- 角速度的三个分量分别代表沿x轴、y轴和z轴的旋转速度。
- 单位=弧度/秒。
1
2
3
4
5
6
7
private void Update()
{
if (Input.GetKeyDown(KeyCode.R))
{
rigid.angularVelocity = new Vector3(0, 60, 0);
}
}