Двухмерные физические движки с твердым телом в C ++ - PullRequest
8 голосов
/ 17 июля 2010

Я пытаюсь поэкспериментировать с движками 2D физики в C ++. Пока что, похоже, самым популярным является Box2D. К сожалению, Box2D - это жесткий физический движок, и это не поможет мне с тем, что я хочу попробовать.

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

Теперь я попытался придумать способы сделать это в Box2D, используя только твердые тела, но всегда есть недостатки:

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

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

Ответы [ 4 ]

3 голосов
/ 26 июля 2010

Существует несколько пакетов / двигателей, которые поддерживают деформируемые / мягкие тела. Если вы хотите что-то бесплатно, вы можете, например, проверить Phyz , SOFA или Bullet .

Подробный список wikipedia . Большинство из них основаны на 3D, но вы можете адаптировать их к 2D модели, настроив сцену в виде плоскости.

Удачного кодирования!

1 голос
/ 25 февраля 2011

Я думаю, Dax Phyz имеет как 2D, так и мягкие тела.

1 голос
/ 22 июля 2010

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

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

Этот метод было бы довольно просто реализовать, хотя он не был бы "мягким телом", которое могло бы быть тем, что вы ищете. http://chriscavanagh.wordpress.com/2008/06/24/silverlight-soft-body-physics/ представляется реализацией, которая выдает исходный код, который вы, возможно, захотите изучить.

0 голосов
/ 20 июля 2010

Я не знаю, как лучше, но здесь , ближе к концу страницы код "пружин".

...