Автор разбирает, почему игровая камера и 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 именно в этап построения матрицы проекции.