Движок Box2D используется для симуляции физики в двумерном пространстве. Из фигур он поддерживает сферу (круг), бокс (прямоугольник) и выпуклый полигон (с внутренними углами больше 1-10 градусов, иначе будет падение с ошибкой).
Что же делать, если надо нарисовать этот полигон от руки и скормить Box2D, чтоб он не рухнул?
Можно нарисовать составной полигон в виде множества сфер и боксов. Так, например, сделана фигура танка для демки движка NeoAxis Game Engine (этот движок трехмерный, но проблемы с физикой такие же)
Но у меня такой возможности не было, поэтому я скармливал физике предварительно триангулированный полигон, алгоритм решения очень простой:
- берем нарисованный полигон
- разбиваем его на треугольники (этот процесс называется триангуляция, в интернете можно найти множество решений этой задачи)
- (опционально) склеиваем получившиеся треугольники в выпуклые полигоны
Третий пункт — это просто оптимизация. Делать его необязательно, реализуется простым перебором всех треугольников.
- находим два треугольника со смежной стороной (две точки должны быть общими)
- сливаем их в один полигон
- проверяем на выпуклость (внутренние углы должны быть меньше 180)
И еще один момент: если угол между сторонами полигона равен 180 градусам, можно удалить точку, общую для обеих сторон.