Процедурный трейл для костей: простой свинг без физики — Game Design Radar
← Все посты

Процедурный трейл для костей: простой свинг без физики

05.02.2026
Процедурный трейл для костей: простой свинг без физики

Автор разбирает простой приём процедурной анимации для создания эффекта «висящих» суставов (trailing joints), которые слегка запаздывают за основным движением. Такой свинг даёт ощущение физичности без полноценной физической симуляции и подходит, например, для крыльев или любых придатков, создающих вторичное движение.

Базовая идея эффекта

Эффект основан на модификации поворота кости относительно её текущего положения. Вместо полноценной физики используется вычисление «цели» для части тела (частицы/сустава), которая должна отставать от основного движения, и плавный свинг к этой цели.

Пайплайн в Unreal Engine

Автор опирается на пример из Game Programming Gems 4 и показывает реализацию в узле анимации FAnimNode_SimpleTrail:

  • Берётся текущий трансформ кости в пространстве компонента (Component Space, CS).
  • Преобразуется в мировое пространство (World Space, WS).
  • На основе положения в WS вычисляется «particle target» — целевая позиция/направление для свинга.
  • Используется кватернион Swing, описывающий отклонение (свинг) от текущего поворота.
  • Результирующий поворот в мировом пространстве: ResultWS = Swing * InBoneWS.GetRotation(). Важно, что порядок умножения кватернионов не транспонирован — это принципиально для корректного результата.
  • Затем поворот возвращается в пространство компонента: ResultCS = ToWorld.GetRotation().Inverse() * ResultWS.
  • В выходной массив анимационного узла пишется новый трансформ кости: исходная позиция и масштаб, но с обновлённой ротацией ResultCS.

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

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

Пример в Unity

Для Unity автор показывает упрощённую версию на MonoBehaviour (хотя для производительности лучше использовать AnimationScriptPlayable job):

class TrailingBone { void Update() { transform.rotation = swing * transform.rotation; } }

Логика та же: к текущему повороту кости каждый кадр применяется кватернион swing, который задаёт запаздывание/подтягивание к желаемому направлению. Таким образом, любая кость может получать простой trailing-эффект без сложной физики.

Выводы

  • Эффект trailing joints реализуется через поэтапную работу с трансформами в CS и WS и применение кватерниона свинга.
  • Важно корректно умножать кватернионы (порядок Swing * Rotation), иначе результат будет неверным.
  • «Магическое число» ~1/3 дополнительного смещения цели даёт визуально приятный трейл без переусердствования.
  • Базовый узел (AnimNode/MonoBehaviour) можно расширять до сложных систем вторичной анимации.
  • В Unity лучше выносить такую логику в AnimationScriptPlayable job для производительности, но концепция свинга остаётся той же.
check_circle Факт-чекинг
Статья прошла проверку. Фактологических ошибок не выявили.