Как удерживать цели IK-ног на месте при движении тела персонажа
Чтобы стопы IK оставались на месте, удерживайте мировое положение каждой цели стопы неизменным, перемещая контрол тела персонажа. Позвольте решателю ног подстраивать суставы между движущимся телом и неподвижной целью. Если цель наследует движение тела, отделите эту связь трансформаций или компенсируйте её до расчёта IK.
Это руководство предназначено для авторов, позирующих риггированного виртуального персонажа, тело которого должно покачиваться, наклоняться или смещаться, пока обе стопы остаются на месте. Описанный ниже процесс сочетает документированное поведение трансформаций и IK с практической последовательностью диагностики; в качестве конкретных примеров используются термины Unity и Godot.
Почему цели стоп перемещаются вместе с телом?
Цель может сохранять локальные координаты и при этом перемещаться по сцене. Локальные трансформации описывают объект относительно его родителя, поэтому перемещение предка также меняет мировую трансформацию дочернего объекта. Godot документирует это различие с помощью transform и global_transform. Использование 3D-трансформаций — Godot Engine
Сначала отобразите контролы целей стоп и немного сдвиньте тело в сторону. Следите за целями отдельно от видимых стоп. Если цель движется вместе с телом, проверьте её предков: она может находиться в иерархии таза, контрола тела или другой движущейся группы.
Не оценивайте настройку только по полям локального положения. Запишите мировое положение цели до и после перемещения. Так вы разделите два полезных вопроса: покинула ли цель заданное положение или нога не последовала за неподвижной целью?
Как организовать контролы тела и стоп?
Используйте отдельные ветви контролов для движения тела и целей стоп, которые должны оставаться на месте. В практичной структуре скелет и контролы тела находятся в одной ветви, а цели левой и правой стоп — в другой, под неподвижным контролом сцены. Главное условие: контрол тела, которым вы управляете, не должен перемещать ветвь целей.
Общий контрол персонажа может включать обе ветви, если вы перемещаете только тело внутри него. Однако перемещение общего контрола сдвинет обе ветви. Прежде чем выбирать контрол, определите, что именно нужно сделать: «сдвинуть тело над неподвижными стопами» или «переместить всего персонажа».
Если приложение поддерживает независимое наследование трансформаций, это может стать ещё одним вариантом. Например, свойство Node3D.top_level в Godot отключает наследование узлом трансформаций родителя. Это документированная функция трансформаций; сама по себе она не настраивает решатель IK. Node3D — Godot Engine
При смене родителя цели или режима наследования сохраните её текущее мировое положение. Сначала запишите мировые координаты и ориентацию, измените связь, затем восстановите это положение. Проверьте результат, прежде чем снова перемещать тело.
Что делать, если цель должна оставаться под движущимся родителем?
Храните мировое положение стопы в отдельном месте и вычисляйте требуемое локальное положение цели по текущей трансформации родителя. Для координат положения зависимость выглядит так: локальное положение цели = обратная мировая трансформация текущего родителя × сохранённое мировое положение цели. В Unity преобразование из мировых координат в локальные выполняет InverseTransformPoint. Transform.InverseTransformPoint — Unity
Рассмотрим наглядный упрощённый пример только со смещением. Цель зафиксирована на мировом X = 1,0, а родитель изначально находится на X = 0,0. Следовательно, локальный X цели равен 1,0. Сдвиньте родителя до X = 0,3 — локальный X цели должен стать 0,7, чтобы она осталась на мировом X = 1,0. Если оставить локальный X равным 1,0, цель переместится на мировой X = 1,3.
Вычитание работает только в этом упрощённом примере. Для повёрнутого или масштабированного родителя требуется полное преобразование трансформации. Метод Unity TransformPoint переводит локальное положение в мировые координаты и явно учитывает масштаб. Поэтому для преобразования положения нужно использовать операцию над точкой, а не над направлением. Transform.TransformPoint — Unity
Сохраняйте положение фиксации в момент перехода стопы в состояние опоры. Используйте это сохранённое значение, пока тело движется. Если повторно сохранить положение цели после того, как она унаследовала движение, дрейф станет новым исходным значением. Если ориентация тоже должна оставаться неизменной, сохраняйте и преобразуйте её вместе с положением.
Как настроить IK ног, чтобы они следовали за целями?
Прежде чем проверять большую смену позы, проверьте назначение цепочки в решателе. В Unity Animation Rigging 1.4.1 для Two Bone IK задаются трансформы Root, Mid и Tip, цель Target и необязательная подсказка Hint. Для простой ноги персонажа из двух сегментов это соответственно сустав верхней части ноги, коленный и голеностопный суставы. Подсказка управляет направлением сгиба. Two Bone IK — Unity Animation Rigging
Для первой проверки установите полное влияние ограничения и полное влияние положения цели. Влияние поворота цели проверьте отдельно. В Unity это разные веса, поэтому следование за положением и совпадение ориентаций можно тестировать независимо. Параметр Maintain Target Offset в Unity сохраняет исходную разницу между конечным суставом и целью — для положения или поворота. Two Bone IK — Unity Animation Rigging
Совместите цели с заданными положениями голеностопов до включения ограничений. Если вы намеренно используете смещение, запишите, что оно означает. Необъяснённое исходное смещение затрудняет последующее сравнение цели с рассчитанным положением сустава.
Задайте нужное направление сгиба колена с помощью подсказки или полюсного контрола, затем немного переместите тело. Во время проверки размещение подсказки должно оставаться понятным: если одновременно менять цель, положение тела и контрол сгиба, будет сложнее определить причину неожиданного результата.
Насколько можно переместить тело, чтобы обе стопы остались на месте?
Неподвижные цели не делают достижимым любое положение тела. Для идеальной цепочки из двух сегментов со свободными суставами и без растяжения геометрия требует, чтобы расстояние от корня ноги до цели находилось между |длина верхнего сегмента − длина нижнего сегмента| и длина верхнего сегмента + длина нижнего сегмента. Реальные ограничения суставов могут сузить этот диапазон.
Рассмотрим пример персонажа с длиной сегментов 0,45 и 0,45 единицы сцены. Максимальная геометрическая длина вытянутой ноги равна 0,90 единицы. Если бедро находится на 0,80 единицы выше цели у голеностопа и на 0,30 единицы в стороне от неё по горизонтали, расстояние между ними составит √(0,80² + 0,30²), то есть примерно 0,854 единицы. Это укладывается в идеальный диапазон. Если увеличить горизонтальное расстояние до 0,50 единицы, получится примерно 0,943 единицы — больше допустимого диапазона.
Используйте этот расчёт, чтобы отличить проблему досягаемости от проблемы трансформации. Если цель остаётся неподвижной, но цепочка не может до неё дотянуться, уменьшите смещение тела или переместите тело так, чтобы учесть положение обеих ног. Оценивайте каждую ногу отдельно: смещение в сторону может приблизить одну цель и одновременно отдалить другую.
Для первой рабочей позы оставьте заметный сгиб обеих ног и проверьте небольшие перемещения. Увеличивайте диапазон движения тела, только после того как проверите, насколько близко каждая нога подходит к пределу своей досягаемости. Считайте этот диапазон индивидуальным для рига, а не копируйте значение смещения другого персонажа.
Как удерживать на месте всю стопу, а не только голеностоп?
Определите, что означает «неподвижность» в вашем риге. Неподвижная цель голеностопа задаёт положение сустава, но стопе также нужна заданная ориентация. Точка контакта подошвы и ось вращения голеностопа — это разные опорные точки; при размещении контрола сохраняйте предусмотренное для них смещение.
Для диагностики удерживайте положение голеностопа и поворачивайте только тело. Следите за пяткой и носком. Если они перемещаются вокруг голеностопа, проверьте контролы ориентации стопы и отдельные контролы пальцев. Эта проверка помогает отделить видимый контакт от положения цели.
Сохраняйте заданную ориентацию опорной стопы вместе с положением. Во время движения тела сравнивайте оба значения с сохранённой позой. В документации по трансформациям Godot объясняется, что трансформация объединяет начало координат с базисом, представляющим ориентацию и масштаб. Это полезный ориентир для понимания полной позы. Использование 3D-трансформаций — Godot Engine
Как систематически диагностировать скольжение?
Используйте следующую последовательность как практическую помощь для диагностики, основанную на описанном выше поведении трансформаций и решателя. Меняйте по одному условию за раз, начиная с минимального движения тела, при котором возникает проблема.
| Наблюдение | Что проверить в первую очередь | Следующее действие |
|---|---|---|
| Цель движется вместе с телом | Движущихся предков и наследование трансформаций | Разделите ветви контролов или восстановите сохранённое мировое положение |
| Цель неподвижна, но голеностоп до неё не достаёт | Назначение цепочки, влияние положения и досягаемость | Проверьте настройку, затем уменьшите смещение тела |
| Голеностоп неподвижен, но пятка или носок движется | Ориентацию стопы и смещение точки контакта | Восстановите заданную ориентацию опорной стопы |
| Колено неожиданно меняет направление сгиба | Размещение подсказки или полюса | Проверьте контрол сгиба при небольшом перемещении тела |
| Результат отличается при перетаскивании и воспроизведении | Какая система и когда управляет каждым контролом | Проверьте вычисленные трансформации во время воспроизведения |
В анимированной или процедурной настройке используйте явный порядок зависимостей: задайте позу тела, восстановите или преобразуйте сохранённые цели, затем вычислите IK ног. Проверьте, в каком порядке приложение выполняет эти операции. Одного названия обратного вызова недостаточно, чтобы установить, считывает ли решатель обновлённую цель на том же этапе вычисления.
В завершение проверьте короткий цикл: сдвиньте тело в сторону, опустите его, немного поверните и верните в исходную позу. Всё это время сравнивайте мировую позу каждой цели с сохранённым эталоном. Когда цели останутся на месте, дальнейшие настройки будут касаться конкретных аспектов: допустимого движения тела, стабильного направления коленей и ориентации стоп, необходимой для сохранения нужного контакта.
