Как создать неправильную форму шара? - PullRequest
3 голосов
/ 10 апреля 2010

Какие алгоритмы будут генерировать случайные "шарики слизи", подобные тем, которые есть в World of Goo . Я использую Обработка , но подойдет любой общий алгоритм.

Полагаю, все сводится к тому, как "случайным образом" делать шары, которые бывают круглыми, но не идеально круглыми и выглядят реалистично?

Заранее спасибо!

Ответы [ 4 ]

2 голосов
/ 12 апреля 2010

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

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

1 голос
/ 10 апреля 2010

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

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

0 голосов
/ 19 октября 2010

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

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

0 голосов
/ 19 октября 2010

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

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

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

1) Выберите случайную вершину V_i, выберите случайный вектор T, примените этот вектор как перемещение (перемещение) к 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, но теперь вы моделируете пружинные связи между всеми соседними вершинами и итеративно перемещаете все вершины, основываясь на силах, созданных растянутыми пружинами.

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

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

Просто некоторые грубые идеи, не проверенные ...

...