2010-04-09 9 views
4

Какие алгоритмы будут генерировать случайные «шарики с заблуждением», как в World of Goo. Я использую Proccesing, но любой универсальный алгоритм.Как создать неправильную форму шара?

Я предполагаю, что это сводится к тому, как «случайным образом» создавать шары, которые являются круглыми, но не идеально круглыми, и все еще выглядят реалистичными?

Заранее благодарен!

ответ

1

Не уверен, что это то, что вы ищете, поскольку я не могу смотреть на этот сайт с работы. :)

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

+0

Спасибо за ответ. Но я думаю, что это больше, чем разнообразные эллипсы, потому что некоторые из шариков кажутся асимметричными для меня. – tomato

2

То, что делает объекты реалистичным Мира Goo не является их формой, но тот факт, что поведение объектов (более или менее) реалистичная симуляция 2D физики, особенно

  • изгиба, растяжения , сжатие (elastic deformation)
  • нарушения из-за stress
  • и все выше при правильном моделировании dynamics, с не воспринимаемое не ярлыки

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

0

Как говорится в неразумии, World of Goo - это не столько форма, сколько физическое моделирование.

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

Некоторые идеи:

1) Выберите случайную вершину V_i, выбрали случайный вектор Т, применить этот вектор в качестве перевода (перемещения) в V_i, применять T для всех остальных вершин v_J тоже, но уменьшенные в зависимости от «расстояния» от V_i (где расстояние может быть абсолютным различием между j и i или фактическим геометрическим расстоянием от V_j до V_i). Для коэффициента масштабирования вы можете использовать любую функцию f, которая равна 1 для f (0) и уменьшается для увеличения расстояний (в основном радиальная базисная функция).

for each V_j 
    V_j = scalingFactor(distance(V_i, V_j)) * translationVector + V_j 

2) Вы двигаетесь V_i как в 1, но теперь вы имитировать весеннюю связь между всеми neigbouring вершинами и итеративно переместить все вершины на основе сил, созданных натяжных пружинами.

3) Для более круглых форм вы можете сделать 1) или 2) на контрольных точках кривой B-сплайна.

Остерегайтесь самопересечений при слишком большом перемещении вершин.

Только некоторые приблизительные идеи, не проверенные ...

0

Может быть Метаданные (wiki) - это то, с чего начать, но я не уверен.

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