Установка угловой скорости для 2d группы частиц

У меня есть 2-я группа частиц, для которой я бы хотел установить угловую скорость, чтобы частицы вращались вокруг центра своей группы.

Я нашел этот метод, чтобы получить угловую скорость группы, и я попытался инвертировать логику, чтобы фактически установить угловую групповую скорость.

В своих попытках я оставляю большую часть логики нетронутой, получая групповую массу, групповой центр и групповую линейную скорость таким же образом. Но похоже, что большинство моих проб и ошибок не приводят к ожидаемым результатам.

Если у вас есть какие-либо знания о том, как я должен справиться с этой логической инверсией, от получения угловой скорости до ее установки, я хотел бы услышать, что вы хотите сказать.

getParticleGroupAngularVelocity()
{
particleCount = 30;
particleMass = 1.5;
particleGroupMass = 0;
particleGroupInertia = 0;
particleGroupAngularVelocity = 0;

particleGroupCenter = vector(0, 0);
particleGroupLinearVelocity = vector(0, 0);

for (i = 0; i < particleCount; i++)
{
    particleGroupMass += particleMass;
    particleGroupCenter += particleMass * particles[i].position;
    particleGroupLinearVelocity += particleMass * particles[i].velocity;
}

if (particleGroupMass > 0)
{
    particleGroupCenter *= 1 / particleGroupMass;
    particleGroupLinearVelocity *= 1 / particleGroupMass;
}

for (i = 0; i < particleCount; i++)
{
    pos = particles[i].position - particleGroupCenter;
    vel = particles[i].velocity - particleGroupLinearVelocity;
    particleGroupInertia += particleMass * (pos.x * pos.x + pos.y * pos.y);
    particleGroupAngularVelocity += particleMass * (pos.x * vel.y - pos.y * vel.x);
}

if (particleGroupInertia > 0)
{
    particleGroupAngularVelocity *= 1 / particleGroupInertia;
}

return particleGroupAngularVelocity;
}

person Claudia    schedule 12.05.2014    source источник
comment
У вас есть группа частиц, и вы хотите изменить скорости некоторых или всех частиц, чтобы дать группе желаемую групповую угловую скорость (я использую этот термин в широком смысле в том же смысле, что и этот код), сохраняя при этом групповая линейная скорость такая же, верно? Есть ли у вас другие условия? Я спрашиваю, потому что есть много способов сделать это.   -  person Beta    schedule 12.05.2014
comment
Я хочу иметь возможность изменять скорость всех частиц, сохраняя при этом линейную скорость групп. Итак, если группа частиц движется с постоянной скоростью по осям x и / или y, я хотел бы иметь возможность заставить группу частиц вращаться вокруг своего центра, не влияя на их другие движения.   -  person Claudia    schedule 12.05.2014
comment
Что касается других условий, я не могу думать о других условиях. Но тогда мне также может не хватать некоторого понимания этого предмета.   -  person Claudia    schedule 12.05.2014


Ответы (1)


Хорошо, это должно сработать.

for (i = 0; i < particleCount; i++)
{
    pos = particles[i].position - particleGroupCenter;
    vel.x = - particleGroupAngularVelocity * pos.y;
    vel.y =   particleGroupAngularVelocity * pos.x;
    particles[i].velocity = vel + particleGroupLinearVelocity;
}

Это сохранит линейную скорость группы. Отдельным частицам будут заданы скорости, как если бы они все были погружены в один и тот же лист стекла, вращающийся вокруг центра группы. (Удерживать их на этих орбитах - чья-то проблема.)

person Beta    schedule 12.05.2014
comment
Отлично, работает! Большое спасибо, Бета. Только один вопрос, чтобы устранить любые сомнения. В исходном коде есть регулировка скорости в зависимости от инерции. В предлагаемом вами решении инерция не влияет на скорость частиц. Что послужило бы для этого поводом? Еще раз спасибо, Бета! - person Claudia; 12.05.2014
comment
@Claudia: это решение сохранит линейный импульс, но не угловой момент. (Сохранить в физическом смысле, а не изменять.) Исходный код измерял угловой момент, затем делился на момент инерции, чтобы получить particleGroupAngularVelocity; этот код замораживает частицы относительно друг друга, а затем раскручивает всю группу. - person Beta; 13.05.2014
comment
Понятно. Спасибо за подробный ответ и объяснение. - person Claudia; 13.05.2014