Уроки Unity: создание файтинга, основанного на физике

Практические советы по созданию ключевых аспектов системы.

Разработчик Луис Бермудес, ранее работавший в EA, Disney и Roblox Corporation, опубликовал в своём блоге на Medium текст, в котором расписал ключевые аспекты создания физической системы в файтинге. Также автор описал практические способы реализации этого в Unity.

Уроки Unity: создание файтинга, основанного на физике

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

Уроки Unity: создание файтинга, основанного на физике

Кроме того, голова будет поворачиваться в том же направлении, в котором был совершён удар. В этом конкретном случае лицо будет вращаться вокруг вертикальной оси Y. Голова в конечном итоге достигнет предела вращения, как показано на рисунке ниже.

Уроки Unity: создание файтинга, основанного на физике

В конце концов, голова постарается вернуться в своё первоначальное положение, как показано на следующем рисунке.

Уроки Unity: создание файтинга, основанного на физике

В дополнение к вращению по вертикальной оси, есть также вращение по горизонтальной оси. Для повторения: сила удара будет перенесена на голову, и она будет вращаться в том же направлении, что и направление удара. В этом конкретном случае голова повернётся вокруг горизонтальной оси X (или Z). В конечном итоге голова достигнет предела вращения, как показано на рисунке ниже.

Уроки Unity: создание файтинга, основанного на физике

Также голова постарается вернуться в своё первоначальное положение, как показано на следующем рисунке.

Уроки Unity: создание файтинга, основанного на физике

После разъяснения можно объединить обе особенности. Сначала нужно сделать один поворот, а затем следующий для каждого временного шага — больше усложнять не нужно.

Вот простой код, который делает именно это:

void FixedUpdate() { Vector3 ySpringTorque = getTorsionalSpringTorque (Vector3(0,1,0), Vector3(0,1,0)); Vector3 xSpringTorque = getTorsionalSpringTorque (Vector3(1,0,0), Vector3(1,0,0)); rigidBody.applyTorque(ySpringTorque); rigidBody.applyTorque(xSpringTorque); }

Моделирование и реализация

Как уже упоминалось, после каждого вращения голова возвращается в состояние покоя. Это можно смоделировать с помощью крутящего момента. Уравнение крутящего момента выглядит следующим образом:

T = q * r * a1 + p * w * a2

T — крутящий момент, q — константа жёсткости, r — расстояние от требуемого вращения в градусах, p — константа затухания силы, а w — разница между текущей угловой скоростью и требуемой угловой скоростью. Также a1 — это ось вращения, a2 — это ось вращения для угловой скорости. Части уравнения a1 и a2 не обязательно являются одним и тем же вектором оси вращения. Кроме того, если затухание силы не нужно, тогда p равна нулю, и выражение упрощается до:

T = q * r * a1

Следующая функция вычисляет требуемый крутящий момент, чтобы применить его к игровому объекту (например, к голове).

Vector3 getTorsionalSpringTorque (Vector3 axisOfRotation, Vector3 axisOfAngularVelocity) { float r_ij = desRot — currRot; float w_ij = desAngVel — currAngVel; Vector3 springTorque = Q * r_ij * axisOfRotation + P * w_ij * axisOfAngularVelocity; return springTorque; }

Важно понимать, что желаемого угла поворота можно достичь с помощью анимации — keyframes от аниматоров или данных с motion capture. Кроме того, константами q и p можно управлять, чтобы определить, насколько отзывчиво вращение. Это означает, что аниматор может контролировать, насколько быстро голова вернётся в нужное положение.

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

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

Мера силы, которая передаётся противнику, зависит от площади поверхности во время контакта, относительной скорости удара и ускорения удара. Для вычисления меры силы достаточно просчитать или упростить эти переменные. В противном случае даже художник может самостоятельно определить силу для каждого типа удара или атаки.

Это основные аспекты файтинга, основанного на физике: наличие оппонента, который реагирует на удары; определение места ударов и их силы. Нужно понимать, что понадобится большой объём данных анимации для создания широкого спектра ударов и реакций на них. Использование этих методов физики и кинематики позволяет генерировать большое количество анимаций без необходимости большого количества данных анимации. Также все эти методы распространяются на удар ногой.

33 показа
11K11K открытий
18 комментариев

Overgrowth. И ни слова больше.

Ответить

Комментарий недоступен

Ответить

Toribash

Ответить

Название не соответствует тексту. Тема не раскрыта.

Ответить

Ну что, теперь и файтинги на джеме от дтф будут?)

Ответить

Файтинги-дейтсимы

Ответить

получается, всё просто

Ответить