焊接体的Box2d中心质量

Box2d center mass of welded bodies?

本文关键字:Box2d      更新时间:2023-10-16

我有一个由焊接体组成的结构。

我施加脉冲/力来移动结构,但我注意到结构并没有完全直线移动。它开始向矢量的方向移动,然后慢慢转动,最终绕圈。

问题在这里得到解决

看来问题在于力需要施加到质心上。但是,我不确定如何从焊接在一起的结构中获得质心。

我有结构中每个物体的质心,但它们都在中心。有没有办法计算复杂焊接结构的质心?

它就像取每个物体质心的世界坐标的加权和一样简单。

b2Vec2 GetWorldCentreOfMass(std::vector<b2Body> *bodies) {
    // Compute total mass
    float32 totalMass = 0.f;
    for (b2Body &body : bodies) {
        totalMass += body.GetMass();
    }
    // Compute centre of mass
    b2Vec2 centreOfMass(0.f,0.f);
    for (b2Body &body : bodies) {
        b2Vec2 r = body.GetWorldCenter();
        float32 m = body.GetMass();
        centreOfMass += m*r / totalMass;
    }
    return centreOfMass;
}

请参阅:https://en.wikipedia.org/wiki/Center_of_mass#A_system_of_particles

然后使用无效ApplyLinearImpulse(const b2Vec2& impulse, const b2Vec2& point);

b2Vec2 centreOfMass = GetWorldCentreOfMass(bodies);
for (b2Body &body : bodies) {
    body.ApplyLinearImpulse(impulse, centreOfMass);
}