Почему камера и SceneCapture в UE5 кадрируют по‑разному и что с этим делать — Game Design Radar
← Все посты

Почему камера и SceneCapture в UE5 кадрируют по‑разному и что с этим делать

29.01.2026
Почему камера и SceneCapture в UE5 кадрируют по‑разному и что с этим делать

Автор разбирает, почему игровая камера и SceneCaptureComponent2D в Unreal Engine 5 могут давать разное кадрирование при одинаковых настройках FOV и аспекта.

Как работает SceneCapture в UE5

Функция BuildProjectionMatrix(), используемая SceneCapture, жёстко задаёт поведение осей:

XAxisMultiplier = 1.0f;
YAxisMultiplier = InRenderTargetSize.X / float(InRenderTargetSize.Y);

То есть горизонтальный компонент проекции фиксирован, а вертикальный масштабируется под аспект рендер‑таргета. В отличие от CalculateProjectionMatrixGivenViewRectangle(), здесь нет опции Maintain X / Maintain Y / Major Axis, доступной обычной игровой камере.

Следствие: SceneCapture всегда «держит» горизонтальную ось и подстраивает вертикальную. Поэтому при изменении соотношения сторон рендер‑таргета кадрирование SceneCapture расходится с камерой, настроенной, например, на Maintain Y или Major Axis.

Решение: кастомный компонент с Maintain Axis

Автор предлагает создать UMaintainAxisCaptureComponent2D, наследника USceneCaptureComponent2D, который добавляет поддержку режимов Maintain X, Maintain Y и Major Axis — по аналогии с обычной камерой.

Ключевой вопрос: где вмешаться в построение проекции для SceneCapture?

  • Пересчитывать FOVAngle перед построением матрицы (аналогично Blueprint‑подходу).
  • Или строить матрицу проекции вручную и подставлять её через bUseCustomProjectionMatrix.

Почему не стоит крутить FOVAngle

Перезапись FOVAngle работает технически, но имеет серьёзный минус: параметр, который должен отражать осознанный выбор дизайнера/художника (угол обзора камеры), превращается в производную техническую величину, зависящую от:

  • текущего размера рендер‑таргета;
  • выбранного режима Maintain Axis.

В итоге FOVAngle постоянно меняется, сложнее отлаживается и перестаёт быть стабильным входным параметром камеры.

Подход с кастомной матрицей проекции

Использование bUseCustomProjectionMatrix позволяет разделить роли:

  • FOVAngle остаётся исходным пользовательским вводом компонента.
  • Вся логика синхронизации с аспектом и режимом Maintain Axis живёт в кастомной матрице проекции.

Такой подход:

  • делает поведение камеры более прозрачным и контролируемым;
  • позволяет точно повторить поведение обычной камеры, не ломая пользовательские параметры;
  • даёт прямой контроль над матрицей, которая передаётся в FSceneViewInitOptions и далее в рендер.

Контекст: обычный пайплайн камеры

В стандартном пайплайне камеры вертикальный HalfYFOV выводится из соотношения сторон камеры. Для SceneCapture по умолчанию это не учитывается — вертикальная компонента просто масштабируется под размер рендер‑таргета. Поэтому для совпадения кадра с игровой камерой нужно явно внедрить логику Maintain Axis в построение матрицы проекции.

Выводы

  • SceneCaptureComponent2D в UE5 всегда фиксирует горизонтальную ось и подстраивает вертикальную под аспект рендер‑таргета.
  • В отличие от игровой камеры, SceneCapture не поддерживает Maintain X / Maintain Y / Major Axis из коробки.
  • Пересчёт FOVAngle решает проблему, но делает FOV нестабильным и трудным для отладки параметром.
  • Корректнее строить и подставлять собственную матрицу проекции через bUseCustomProjectionMatrix, сохраняя FOVAngle как пользовательский ввод.
  • Для совпадения кадра камеры и SceneCapture нужно внедрить логику Maintain Axis именно в этап построения матрицы проекции.
check_circle Факт-чекинг
Статья прошла проверку. Фактологических ошибок не выявили.