2016-10-16 12 views
12

Я использую физику Matter.js в попытке создать мягкие тела. Я был в состоянии создать тело, как это:2D мягкие тела: гели и формуемые?

matter.js soft body

Однако я не уверен, если это «мягкое тело» Я хочу. Это правда, что это тело не является полностью жестким и имеет такое бодрое чувство, когда оно сталкивается и затягивается. Я искал тело, которое имеет сходство с гелем. Это изображение может визуально помочь объяснить концепцию:

wanted-gelly-body

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

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

Может ли иметь значение.js справиться с этим или я должен изменить физический движок? Какие-нибудь решения для этого?

ПРИМЕЧАНИЕ. Я использую Phaser.js для некоторых игровых компонентов, но физика материи.js для манипуляций с физикой, потому что я считаю, что интегрированная с Phaser физика не может имитировать этот тип сложного тела.

Благодаря

EDIT: Это очень похоже на эту Box2d :roll soft body ball. Мне просто нужно сделать это с помощью js-движка, я думаю. Есть ли?

+2

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

+0

@Rodger Я согласен с тобой по-настоящему. Просто делаю то, что я делаю, просто басистом, создавая новый тип тела, уже определенный в файле matter.js. Я не думал, что это слишком актуально. –

+0

Как только мой друг сделал гели, как на изображении, он создал круговую структуру с узлами и внутри он заполнил разделенные объекты и сохранил пустое пространство для объектов свободно перемещаться. Кольцо, содержащее объекты, имело некоторую эластичность, поэтому его форма легко изменилась. Я не знаю о Matter.js, но я думаю, вы можете сделать что-то подобное. –

ответ

4

Как я уже упоминал в комментариях, я не знаком с фазером или как вы на самом деле реализуете это в рамках Javascript. Моя цель здесь, возможно, дать вам несколько идей по различным способам продолжения, поэтому, надеюсь, вы найдете этот ответ полезным.


Я попытаюсь ответить на этот вопрос:

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

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

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

  1. Точка подключена ко всем остальным точкам, указанным в вашей сетке.
  2. Каждый раз каждый шаг вычисляет силу. Суммарная сила на суставе (или точке) является суммой всех этих парных сил.
  3. Каждое соединение связано с частью тела (то есть оно имеет некоторую массу m), и вы рассчитываете его ускорение с помощью acceleration = force/m. Оттуда мы вычисляем velocity и, наконец, position.

Самая интересная часть вышеприведенных шагов - № 2, так как это значительно повлияет на движение всего тела. Очень распространенный способ его реализации - это как эластичный потенциал , который для определенного distance между двумя точками дает force. Как так:

function elasticPotential(p1, p2) { 
    // Given two positions p1 and p2 we calculate a force between them 
    distance = sqrt(pow(p1.x - p2.x, 2) + pow(p1.y - p2.y, 2) + pow(p1.z - p2.z, 2)); 
    force = force_given_distance(distance); // A popular choice here is for example a spring force 
    return force; 
} 

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

Простой пластичность

Примечания первым здесь, что проблема пластичности является большой темой исследований и во многих случаях далеко не тривиальный. Моя идея такова: если расстояние между двумя связанными точками больше некоторого порога, устранить точки в текущей конфигурации. То есть

for each pair(p1, p2): 
    if distance(p1, p2) > threshold: 
     recalculate_connection(p1, p2) 

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

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


TL; DR: Создать "пластичную" форму с помощью вашего тела перестройки сетки в процессе деформации. Было бы сложно получить точное физическое поведение, но должно быть возможно создать нечто похожее на «гель-подобное».

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

  • Нет связанных вопросов^_^