Look AT в unreal на control rig

Всем привет! Решил начать вести небольшой дневник своих изысканий в мире технической анимации. Это не уроки, а скорее мои мысли вслух и анализ того, как работают те или иные механики. И начнём мы с классической задачи — Look At, или "взгляд на цель". Цель проста: заставить персонажа живенько вертеть головой, следя за каким-нибудь объектом.

Мой телеграмм канал про анимации и unreal

Создадим control rig - на скриншоте указано как это сделать

Я буду использовать unreal манекен и его готовый blueprints для примера

Look AT в unreal на control rig
Look AT в unreal на control rig

Подгружаем наш скелет

Look AT в unreal на control rig

Создаём переменную с типом данных Vector, делаем её редактируемой, поставив галочку Instance Editable. В ней мы будем хранить положение цели, на которую будет смотреть наш персонаж.

Look AT в unreal на control rig

Перетаскиваем переменную левой кнопкой мыши и жмём Get.

Дальше кликаем правой кнопкой мыши на пустом месте и ищем From World.

Look AT в unreal на control rig

объяснение

  • Get LookAtLocation: Эта нода просто получает значение из переменной LookAtLocation.
  • From World: Эта нода-конвертер. Она берёт Transform из мировых координат и пересчитывает его так, чтобы он был относительным к системе координат самого рига.

Зачем это нужно?

Control Rig работает в своём собственном, локальном пространстве. Чтобы заставить кость (например, голову) посмотреть на объект, который находится где-то в игровом мире, вам нужно сначала «перевести» мировые координаты этого объекта в локальную систему координат рига.

Проще говоря, этот код отвечает на вопрос: «Если цель находится в этой точке на карте мира, то где она будет находиться относительно меня?». Полученный результат затем используется в нодах IK или Aim для вращения костей.

Находим ноду Aim. В поле Name указываем нашу кость.

Look AT в unreal на control rig

Primary — это главная цель. Она отвечает на вопрос: «Куда смотреть?». Это основное направление, в которое будет повёрнута кость.

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

Проще говоря:

  • Primary: Повернуть голову, чтобы посмотреть на человека.
  • Secondary: Держать макушку направленной в потолок, чтобы голова не наклонялась вбок.

Указываем нашу основную ось, которой будет смотреть персонаж. Target — куда смотреть.

Оси нужно смотреть в локальной системе координат. Чтобы их увидеть, выделяем кость и делаем, как на скриншоте. Как вы видите, ось Y смотрит вперёд — её мы и будем двигать.

Look AT в unreal на control rig

Кстати, для быстрой проверки работы осей можно создать новый Control. Для этого кликните правой кнопкой мыши по пустому месту во вкладке Rig Hierarchy.и все остальное на видео

Вот таким способом мы и проверяем, как работают наши оси.

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

С помощью параметра Weight можно контролировать силу воздействия ноды Aim на кость, что позволяет сделать твисты костей неравномерными.

Look AT в unreal на control rig

Теперь создадим Объект на который будет смотреть персонаж

Создадим у нашего основного персонажа две переменные:

  1. Первая — булевого типа.
  2. Вторая — ссылка на созданный нами актор (в поле типа переменной вводим его название и выбираем Object Reference).

Заходим в в наш BP_Target выбираем коллизицию и делаем on component Begin Overlap and on component End Overlap - делаем Cast нашего персонажа и вытаскиваем из него 2 переменные ISlookAT булевного типа и LookAt object

Этот код создаёт зону-триггер в виде сферы, которая отслеживает, когда игрок (персонаж класса BP_ThirdPersonCharacter) входит в неё и выходит из неё.

Look AT в unreal на control rig

ак это работает (по шагам)

Код разделён на две части, реагирующие на два разных события:

1. Когда персонаж ВХОДИТ в сферу (On Component Begin Overlap)

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

  • Cast To BP_ThirdPersonCharacter: Это проверка "свой/чужой". Код проверяет, является ли вошедший объект (Other Actor) именно персонажем нужного нам класса. Если в сферу попадёт что-то другое (пуля, другой NPC, стена), каст провалится, и ничего не произойдёт.
  • SET ISLookAT (на true): Если проверка прошла успешно, переменная-флаг bIsOverlapped устанавливается в true. Это сигнализирует другим частям кода, что "персонаж внутри".
  • SET Look at o: В переменную Look at сохраняется прямая ссылка на наш BP_Target когда персонаж пересекает collision sphere.

2. Когда персонаж ВЫХОДИТ из сферы (On Component End Overlap)

Эта нижняя цепочка срабатывает один раз, когда объект перестаёт пересекаться со сферой.

  • Cast To BP_ThirdPersonCharacter: Снова та же проверка, чтобы убедиться, что из сферы вышел именно наш персонаж.
  • SET ISLookAT (на false): но сбрасывает значение на false.

По сути сам тот код еще немного не делает это шаблон нужных нам действий

Идем В ABP ( animation blueprint) нашего персонажа и ищем Event Blueprint Update Animation ( так как мы будет изменять позицию нашей головы каждый тик - если сработало пересечение тригерной сферы

Look AT в unreal на control rig

задача — определить, нужно ли персонажу смотреть на какой-то объект, и если да, то проверить, находится ли этот объект в пределах определённого угла обзора перед персонажем.

Пошаговый разбор логики

1. Обновление данных (каждый кадр)

  • Event Blueprint Update Animation: Это "тик" для анимационного блюпринта, он запускает всю логику на каждом кадре.
  • Get Owning Actor -> Cast To BP_ThirdPersonCharacter: Код получает ссылку на основного актора-персонажа, которому принадлежит этот анимационный блюпринт.
  • SET ISkoot at?, SET Look at, SET Sphere: Из полученной ссылки на персонажа, код копирует в локальные переменные анимационного блюпринта актуальные данные:ISkoot at?: говорит нам , пересек ли наш персонаж триггер зону, и возвращает True в случае пересеченияLook at : Ссылка на объект, на который нужно смотреть.Sphere: Ссылка на компонент-BP_target конкретно на mesh.

2. Основная логика (если взгляд включен)

  • Branch: Проверяется флаг ISkoot at?. Если он false, ничего не происходит. Если true, выполняется остальная логика.
  • SET Look at Location(эту ноду нужно будет сделать в ABP ) : Вычисляется точная точка в мире, на которую нужно смотреть. Она получается с помощью ноды Get World Location из Sphere и transform сферы подаются в SET Look at Location
  • Find Look at Rotation: Вычисляется вращение, необходимое персонажу, что бы посмотреть на цель , на вход в него подается Get World Location из персонаж и из цели на которую нужно посмотреть
  • Delta (Rotator): Эта нода сравнивает текущее вращение персонажа (берем его с помощью ноды Get Actor Rotation ) с тем что мы подали из ноды Find look at rotation вращением и находит между ними разницу.
  • Извлечение Yaw: Из этой разницы берётся только горизонтальный угол (Yaw). Это угол, на который персонажу нужно повернуться влево или вправо.

3. Финальная проверка

  • ABS: Берётся абсолютное значение угла (то есть, -90 становится 90). Это нужно, чтобы не важно было, слева или справа находится цель и упростить проверку где находится цель
  • < (Меньше чем): Это абсолютное значение угла сравнивается с некой пороговой величиной Look at Offset( в ноду устанавливаем нужный нам угол- если значение меньше его то мы поставим в Is in Range True.
  • SET Is in Range: будем использовать позже для включения и выключения поворота головы ( эту переменную нужно создать ) .
Look AT в unreal на control rig
Look AT в unreal на control rig

🏁 Итог

Каждый кадр этот код:

  1. Обновляет данные из основного блюпринта персонажа.
  2. Если персонаж должен на что-то смотреть, код вычисляет угол до цели.
  3. Затем он проверяет, входит ли этот угол в заданные рамки (например, +/- 85 градусов), и сохраняет результат в переменную Is in Range.

Эта переменная Is in Range затем использоваться в AnimGraph для активации IK-нод, которые будут физически поворачивать голову и тело персонажа в сторону цели.

подключаем все это дело к Control rig

Как это работает

  1. Кэширование основной позы (Use cached pose 'MainAnim') Сначала основная анимация персонажа (из стейт-машины,) сохраняется в кэш под именем MainAnim. Это делается для того, чтобы не вычислять её дважды.
  2. Два варианта позы Далее код создаёт два варианта того, как может выглядеть персонаж в этом кадре:
  • False Pose (Поза по умолчанию): Берётся напрямую из кэша MainAnim. Это обычная анимация персонажа без каких-либо изменений.
  • True Pose (Поза с "Look At"): Берётся та же самая поза MainAnim, но она пропускается через Control Rig. Control Rig модифицирует позу, поворачивая голову персонажа в сторону цели (Look at Location).
  1. Переключение (Blend Poses by bool) Это главный переключатель. Он смотрит на булеву переменную Is in Range.
  • Если Is in Range равно false (цель не в зоне видимости), то на выход идёт False Pose — обычная анимация.
  • Если Is in Range равно true (цель в зоне видимости), то на выход идёт True Pose — анимация с повёрнутой головой.

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

На последнем скриншоте я подключить всю эту конструкцию к Control rig который идет по стандарту вместе с unreal манекеном

и самое главное нужно не забыть подключить ноду LookAtLocation в Target и не нужно пугатся немного поломанного персонажа)

11
1
8 комментариев