Я создал серию вращающихся астероидов вокруг центральной точки, используя дистанционное соединение с каждым астероидом и затем применяя тангенциальную силу, чтобы заставить их "кружиться" вокруг центра.
Вы можете заменить дистанционное соединение надействительная сила указывает на центр вихря.Вы также можете медленно уменьшить расстояние в стыке расстояний, чтобы элементы были «спиральными». Я собираюсь пойти на это, поскольку это дает вам больший контроль над скоростью, с которой элементы перемещаются в вихрь.
Я называю "myBodyA" телом, которое является центром вихря.
Из Руководства Box2d:
b2DistanceJointDef jointDef;
jointDef.Initialize(myBodyA, myBodyB, worldAnchorOnBodyA, worldAnchorOnBodyB); jointDef.collideConnected = true;
world->CreateJoint(&jointDef);
Вам придется приложить некоторую силу к своему телу (давайтескажем, это был myBodyB), чтобы заставить его двигаться в правильном направлении, чтобы он вращался вокруг myBodyA.Это потребует математики.
То, что вы хотите сделать, это вычислить вектор, который указывает перпендикулярно вектору, указывающему от myBodyB к myBodyA.Вы можете сделать это, найдя вектор из myBodyB в myBodyA, нормализовав его, взяв его перекос (поворот на PI / 2), а затем используя его как направление силы.Что-то вроде:
// Calculate Tangent Vector
b2Vec2 radius = myBodyB.GetPosition()-myBodyA.GetPosition();
b2Vec2 tangent = radius.Skew();
tangent.Normalize();
// Apply some force along tangent
myBodyB.ApplyForceToCenter(body->GetMass()*acceleration*vTangent);
Если вы прочитаете это правильно, вы увидите F = m * a * tangentVector;то есть вы прикладываете силу в направлении касательной.Я считаю, что он будет вращаться по часовой стрелке (если я правильно сделал математику).В любом случае, отрицательная сила будет перемещать его в противоположном направлении.
Чтобы остановить вращение тела, вы можете использовать SetLinearDamping (dampingValue) для него.Поэтому, пока вы применяете силу, она будет продолжать вращаться.Если вы прекратите применять силу, она должна аккуратно остановиться.Вы можете контролировать скорость увеличения / уменьшения с помощью значения ускорения и параметров noiseingValue.
Если вы действительно хотите хороший контроль над скоростью, я думаю, вы можете сделать это, чтобы ограничить скорость:
b2Vec2 linVel = myBodyB.GetLinearVelocity();
linVel.Normalize();
linVel *= maxSpeed;
myBodyB.SetLinearVelocity(linVel);
Было ли это полезно?