Я некоторое время работал над моделированием твердого тела и до сих пор не знаю, как решить эту проблему. (Я использую дискретное обнаружение столкновений и использую LCP для определения импульса каждой точки контакта.)
Представьте неподвижную чашу (полушарие с центром в точке С) и частицу на краю чаши. Частица скатывается по поверхности внутрь чаши. И на каком-то временном шаге должна быть точка контакта A, и решатель LCP выдаст результирующий импульс, делающий скорость частицы перпендикулярной вектору CA. Но после обновления одного временного шага частица немного перемещается по этой скорости и фактически выходит из чаши, и еще через несколько временных шагов все становится хуже. Когда я использовал куб вместо частицы, куб мог проникнуть в чашу и погрузиться в нее.
Так есть ли способ избежать этого? Импульсный метод не идеален, и после реакции на столкновение все еще может быть проникновение. Мне нужно как-то скорректировать проникновение, но просто перемещать объект по нормали к поверхности в точке контакта — не лучшая идея, потому что это может привести к новым проникновениям.
Редактировать:
Проблема не в том, что чаша слишком тонкая, а в том, что временной шаг слишком велик. Причина в том, что интеграл Эйлера дает многоугольник вместо круга. И мы не можем просто изменить положение этих двух объектов, потому что, если с другой стороны есть третий объект, у объектов 2 и 3 может быть новое проникновение. Я думаю, что одним из способов является добавление некоторой силы упругости в зависимости от глубины проникновения, но это недостаточно аккуратно.
Спасибо, это хорошая идея, чтобы просмотреть исходный код Bullet, работая над ним.