2016-11-02 3 views
2

Я использую Phaser.js и его физику p2, чтобы имитировать то, что «жидкие тела». Вы можете видеть в примере this, что создается своеобразное жидкое тело (кредиты Джону Уотсону). Единственное возможное взаимодействие - с движением мыши.Сделайте многочастное «жидкое тело» как одно тело

Я заметил некоторые интересные свойства, которые могли бы, вероятно, помочь мне получить то, что я притворяюсь, которые реституция, гравитация и затухания. Все они включены в показанный пример.

// Add a force that slows down the droplet over time 
    droplet.body.damping = 0.3; 

// Add bounciness and gravity 
    this.game.physics.p2.restitution = 0.8; 
    this.game.physics.p2.gravity.y = 250; 

После некоторых исследований и отражения я пришел к выводу, что тело я ищу должно быть более единым, чем, например, тело, что означает, что, в определенных пределах, сила, с направлением от центра тела (в центре + - верх тела) следует применять ко всем «малым телам», которые делают тело. Я полагаю, что после достижения этого, даже если я переведу все тело с помощью курсоров, он будет двигаться вместе. Целом токсикорезистентность Я хочу это форма тела сваи типа (меньше масса на верхней части и больше массы на нижней части): basic illustration

Единственный путь для тела, чтобы терять массу должно быть внешняя сила, приложенная к тело, которое превосходит силу сопротивления, которая удерживает тело единым.

Даже после того, как researcing долгое время я, кажется очень потерял в этом вопросе ...

  • Должен ли я буквально выбрать p2 сил (я считаю, что существует)?
  • Должен ли я использовать пружины для подключения всех небольших тел? (springs)
  • Как бы я всегда получал «центр тела»?

Спасибо.

ответ

1

Отказ от ответственности: Я не использовал Phaser.js, поэтому я не могу помочь вам с каркасом. Однако я попытаюсь поделиться некоторыми своими идеями по проблеме, и, надеюсь, это поможет вам.

Я недавно написал this ответ относительно пластичности (который может вас заинтересовать), но то, что вы хотите, немного отличается.


Моделирование

Во-первых, давайте поговорим о моделировании вы показали. Вы пишете «жидкие тела», но из того, что я вижу в примере кода, нет ничего жидкого - это чистое моделирование частиц с «обманутыми» физическими особенностями, которые исходят из (1) автоматического затухания частиц и (2) restitution что в нормальном смысле означает, насколько эластично столкновение с объектом (например, значение 0.8 в этом случае означает, что 20% кинетической энергии теряется при каждом столкновении). Таким образом, в основном у нас есть моделирование частиц с большим демпфированием.

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

Ваши вопросы

Должен ли я буквально выбрать p2 сил (я считаю, что существует)?

Я действительно не уверен, что это значит, но я предполагаю, что это Phaser.

Должен ли я использовать пружины для соединения всех мелких тел? (пружины)

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

x_cm Если это положение (вектор) до центра масс, а x[i] позиция частицы i, то одним из примеров может быть:

F(i) = F_constant*(x_cm - x[i]) 

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

Как бы я всегда получал «центр тела»?

Центр массы тела является прямым для расчета. В псевдокоде это выглядит следующим образом:

var x_cm 
var total_mass = 0 
for each particle p: 
    total_mass += p.mass() 
    x_cm += p.mass()*p.position() 
x_cm /= total_mass 

Формулы трудно отобразить хорошо здесь, но это так же, как описано на wikipedia.


Другая возможность

Этот ответ уже давно, но только отделочный мысль. С моей точки зрения, похоже, что вы хотите что-то похожее на песок (т. Е. Это моделирование частиц, похожее на то, которое вы показали, но оно тоже сваливается). Обычным способом моделирования песка является точная симуляция, как и вы, но с добавлением трения к частицам. Если это возможно сделать с Phaser, я не знаю, но я бы ожидал, что это будет легко сделать.


EDIT: В последнем предложении была опечатка. Имитировать песок с Phaser, добавив трения к примеру моделирования, должно быть легко.

+0

Эй. Прошло уже некоторое время с тех пор, как вы ответили. Это был отличный ответ. У меня не было возможности спросить, чего я хочу до сих пор. Ну, я понял вашу логику (я не профессионал в физике, но я думаю, что понял). Одна из трудностей, с которыми я сталкиваюсь, заключается в том, чтобы перевести это на код ... Это не имеет особого отношения к самому вопросу, но, поскольку вы ответили на него очень хорошо, я думал, что вы можете привести меня куда-нибудь. Как вы манипулируете физическими силами при программировании, например ... Я бы предположил, что кто-то уже выполнил эту работу, и я бы с ней взаимодействовал?Я не уверен, достаточно ли я достаточно ясен – DigitalEvolution

+1

@ Tojó Посмотрите на функцию GameState.prototype.update в своей ссылке. Там вы видите, что они меняют «dropple.body.velocity». Чтобы перейти от силы к скорости, помните, что 'F = m * a' и' a = v * Δt' -> 'v = F/(m * Δt)'. То есть, если вы вычислите некоторую силу F, вы найдете соответствующее изменение скорости путем деления силы на массу частицы и время с момента последнего обновления. – pingul

Смежные вопросы