У меня есть структура, состоящая из сварных корпусов.
Я прикладываю импульсы / силы, чтобы перемещать конструкцию, но замечаю, что структура движется не совсем ровно. Он начинает двигаться в направлении вектора, а затем медленно поворачивается, в конце концов, вращаясь по кругу.
Проблема решена Вот
Похоже, проблема в том, что силу нужно приложить к центру масс. Однако я не уверен, как получить центр масс из структуры, которая сварена вместе.
У меня есть центр масс каждого тела в структуре, но они все в центре. Есть ли способ вычислить центр масс для сложной сварной конструкции?
Это так же просто, как взять взвешенную сумму мировых координат центра масс каждого объекта.
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
Тогда используйте Void ApplyLinearImpulse(const b2Vec2& impulse, const b2Vec2& point);
:
b2Vec2 centreOfMass = GetWorldCentreOfMass(bodies);
for (b2Body &body : bodies) {
body.ApplyLinearImpulse(impulse, centreOfMass);
}
Других решений пока нет …