刚体动力学
物理引擎是一个计算机程序模拟牛顿力学模型.
前提
- 经典(牛顿)力学: 假设物体足够大, 不会产生量子效应(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: 运动刚体, 零质量, 可以设置速度, 不会受到重力的影响, 但是可以设置速度来进行移动.