- 简介
这次我来探究一下step剩下的部分。 - 动量计算,位移计算
void World::Step(float dt)
{
float inv_dt = dt > 0.0f ? 1.0f / dt : 0.0f;
//碰撞检测并获取碰撞信息
BroadPhase();
// Integrate forces.
for (int i = 0; i < (int)bodies.size(); ++i)
{
Body* b = bodies[i];
//质量无穷大作为固定的物体,没有运动特性
if (b->invMass == 0.0f)
continue;
//根据时间和受力情况更新速度和角速度
b->velocity += dt * (gravity + b->invMass * b->force);
b->angularVelocity += dt * b->invI * b->torque;
}
//这里是计算了碰撞时刻的分离轴方向的和其垂直方向的的冲量公式的
//分母部分
for (ArbIter arb = arbiters.begin(); arb != arbiters.end(); ++arb)
{
arb->second.PreStep(inv_dt);
}
for (int i = 0; i < (int)joints.size(); ++i)
{
//暂时不看
joints[i]->PreStep(inv_dt);
}
// Perform iterations
//对每个顶点都有一定次数的迭代,可能模拟的是
//两个物体碰撞时刻发生的形变过程中,速度变化但是位置不变的过程
//现实中两个物体产生碰撞的时候不会立刻分开,而会有一个冲量和速度
//变化的过程,如果没有迭代次数的时候,就是碰撞就立刻分开,没有任何形变
//以及速度变化过程
for (int i = 0; i < iterations; ++i)
{
for (ArbIter arb = arbiters.begin(); arb != arbiters.end(); ++arb)
{
arb->second.ApplyImpulse();
}
for (int j = 0; j < (int)joints.size(); ++j)
{
//暂时不看
joints[j]->ApplyImpulse();
}
}
//这里是根据速度和角速度来更新物体的姿态和位置
for (int i = 0; i < (int)bodies.size(); ++i)
{
Body* b = bodies[i];
b->position += dt * b->velocity;
b->rotation += dt * b->angularVelocity;
b->force.Set(0.0f, 0.0f);
b->torque = 0.0f;
}
}
详细的物理部分计算后面会阅读讲解。