跳转至

刚体动力学

物理引擎是一个计算机程序模拟牛顿力学模型.

前提

  • 经典(牛顿)力学: 假设物体足够大, 不会产生量子效应(quantum effect). 且物体速度足够低, 不会产生相对论效应(relativistic effect).
  • 刚体: 物体是完美的固体, 不会发生形变.

牛顿运动定律 (Newton's laws of motion)

以下是三条运动定律的通俗表示, 并非原始表述.

  • 牛顿第一运动定律 (惯性定律): 任何物体都要保持匀速直线运动或静止状态, 直到外力迫使它改变运动状态为止.
  • 牛顿第二运动定律: 物体加速度的大小与合外力成正比, 与物体质量成反比.
  • 牛顿第三运动定律: 相互作用的两个物体之间的作用力和反作用力总是大小相等, 方向相反, 作用在同一条直线上.

刚体 (Rigid body)

刚体是指在运动或受力的过程中, 其形状/大小和内部各点的相对位置都保持不变的物体. 刚体只是一种理想化的模型, 实际上不存在绝对刚体.
但是, 许多物体在受力时只产生微小的形变, 可以忽略其影响. 把物体视为刚体可以大大简化计算量.

线性动力学 (Linear dynamics)

  • 直线运动: \(F = am\).
  • 旋转运动: \(\tau = I\alpha\).

线性速度和加速度

struct Rigidbody
{
  Vector2 linear_velocity;
  float   angular_velocity;

  Vector2 force;
  float   torque;

  Vector2 position;
  float   rotation;

  float mass = 1.0f;
  float I; // 转动惯量
}
class PhysicsSystem
{
public:
  void update(float dt)
  {
    for(auto& body : bodies_)
    {
      body.linear_velocity  += (body.force / body.mass + gravity_) * dt; // 计算加速度, 由 F = am 可得 a = F / m
      body.angular_velocity += body.I * torque;

      body.position += body.linear_velocity * dt;
      body.rotation += angular_velocity * dt;

      body.force  = Vector3::zero;
      body.torque = 0;
    }
  }

private:
  std::vector<Rigidbody> bodies_;
  Vector2                gravity_ = Vector2(0.f, 9.81f); // 重力加速度
}

力及动量

  • Static: 静态刚体, 零质量, 零速度, 即不会受到重力或速度影响, 但是可以设置位置来进行移动.
  • Dynamic: 动态刚体, 有质量, 可以设置速度, 会受到重力影响.
  • Kinematic: 运动刚体, 零质量, 可以设置速度, 不会受到重力的影响, 但是可以设置速度来进行移动.

评论