Игровая математика — векторы, кватернионы и интерполяция вместо ручной арифметики
Когда говорят «математика в Unreal», подразумевают шесть кирпичей, которые покрывают 95% геймплейных задач: FVector для позиций и направлений, скалярное произведение для углов и проекций, FTransform для перехода между пространствами, FQuat для поворотов без gimbal lock, line trace для запросов к миру и FInterpTo/Slerp для плавного движения. Каждый имеет один канонический сценарий применения — и десяток способов сделать неправильно.
Главная ошибка новичков — писать математику руками вместо использования готовых API: складывать углы Эйлера компонентно, нормализовать через sqrt(x*x+y*y+z*z), интерполировать поворот линейно. Unreal даёт FQuat::Slerp, GetSafeNormal, FMath::RInterpTo — они учитывают краевые случаи (нулевой вектор, кратчайший путь по сфере, рамку независимости от FPS). Самописная альтернатива почти всегда ломается на нулевых входах или больших DeltaTime.
Вторая характерная путаница — между скалярным произведением (Dot → число, угол/проекция) и векторным (Cross → вектор, нормаль/сторона). Они не взаимозаменяемы и решают разные задачи. Третья — между FRotator (углы для UI и редактора) и FQuat (внутреннее представление, единственное безопасное для композиции). Полная карта — в слоях ниже.
Карта темы
- Vectors —
FVector, единицы измерения (см),Size/SizeSquared,GetSafeNormal, базовые операции. - Dot Product —
Dot, косинус угла, проекция, конус обзора, фронтальная/задняя полусфера. - Transforms —
FTransform(loc/rot/scale), мировое vs локальное,TransformPosition/InverseTransformPosition. - Quaternions —
FQuatvsFRotator, gimbal lock, композиция умножением,MakeFromX. - Raycasting —
LineTraceSingleByChannel,FHitResult, sweep, каналы vs профили,FCollisionQueryParams. - Interpolation —
Lerp/Slerp/Nlerp,FInterpTovsFInterpConstantTo, экспоненциальное сглаживание и FPS-независимость.
Частые ошибки и ловушки
| Ошибка | Последствие |
|---|---|
Передать в LineTraceSingleByChannel направление вместо точки End | Луч уходит в (0,0,0) относительно мира; ничего не находится |
Забыть нормализовать векторы перед Dot | Результат не косинус — все сравнения с cos(angle) мусор |
Считать результат Dot углом в градусах | Это косинус; нужен acos и RadiansToDegrees |
Складывать FRotator-ы покомпонентно | Накапливается gimbal lock; правильный путь — FQuat * FQuat |
Двигать актёра как Pos += Direction * Speed без * DeltaTime | Скорость зависит от FPS |
Использовать Lerp(A, B, Speed * DeltaTime) для сглаживания | При большом DeltaTime шаг > 1, цель проскакивается, появляются колебания |
Считать FHitResult до проверки булева возврата трейса | Поля не заполнены при промахе — мусор или нули |
SetActorLocation для перемещения персонажа | Минует CharacterMovementComponent и NavMesh; клипы через стены |
Использовать Size вместо SizeSquared для сравнений | Лишний sqrt каждый кадр; узкое место при большом числе объектов |
Применять GetActorForwardVector после SetActorRotation в том же кадре | Кеш форварда обновлён, но FQuat-ось может отличаться от ожидаемой при экстремальных углах |
Значение для собеседований
Игровая математика — middle-тема для UE5-собеседования с упором на геймплей. Проверяется:
- Что
Dotдаёт скаляр (косинус угла),Cross— вектор (перпендикуляр). - Зачем
FQuatесли естьFRotator— gimbal lock и корректная композиция. - Как устроен
FTransform(loc/rot/scale) и зачемInverseTransformPosition. - Как сделать сглаживание независимым от FPS (экспоненциальное, не линейное).
- Что
LineTraceSingleByChannelберёт точкуEnd, а не направление. - Разницу между каналами трассировки и профилями коллизий.
Типичный неверный ответ: «Складываю углы и нормализую вектор через корень — этого достаточно для любого геймплея». Реальный ответ — Unreal даёт готовые типы и операции, каждая из которых уже решает известный класс багов (gimbal lock, нулевой вектор, проскок цели при низком FPS). Самописная математика обходит эти решения и приносит обратно все ловушки.