Моделирование физики, гарантирующее, что круги не пересекаются - PullRequest
2 голосов
/ 31 октября 2011

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

ТакЯ подумал, что найти вектор нормали между двумя окружностями в точке контакта и добавить векторы положения в этом направлении - это то, что мне нужно сделать в принципе, и, к счастью, у меня был похожий алгоритм для обработки изменений скорости из-за столкновений, поэтому яадаптировал это так:

Vector2 normal = orgA.getCenterPosition() - orgB.getCenterPosition();
Vector2 tangent = new Vector2((normal.Y * -1), normal.X);

float diff = (orgA.getRadius() + orgB.getRadius()) - normal.Length();

normal.Normalize();

float PAn = Vector2.Dot(normal, orgA.position);
float PAt = Vector2.Dot(tangent, orgA.position);

PAn += diff;

float PBn = Vector2.Dot(normal, orgB.position);
float PBt = Vector2.Dot(tangent, orgB.position);

PBn -= diff;

Vector2 PA = (PAn * normal) + (PAt * tangent);
Vector2 PB = (PBn * normal) + (PBt * tangent);

orgA.position = PA;
orgB.position = PB;

Проблема в том, что когда я запускаю симуляцию, и два шара встречаются, все сводится с ума, и они внезапно разлетаются по всему магазину.

Кто-нибудь может увидеть недостаток в моем алгоритме?Я посмотрел на него, и я до сих пор не могу найти причину этого.

1 Ответ

0 голосов
/ 14 апреля 2013

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

Я не удивлен, но попробуйте поместить цикл в цикл ... должно выглядеть примерно так:

if ( diff < (orb radius))
{
Vector2 PA = (PAn * normal) + (PAt * tangent);
Vector2 PB = (PBn * normal) + (PBt * tangent);

orgA.position = PA;
orgB.position = PB;
}

что-то в этом роде ... Я очень надеюсь, что это немного поможет: /

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

Еще лучше, сделайте bool, такой как isCollided, и убедитесь, что вы переключаете это true / false в соответствии с этим утверждением

надеюсь, что мне поможет пример проекта столкновения, если вы хотите, я могу отправить его вам, samerhachem@hotmail.com

...