diff options
| author | Valentin Popov <valentin@popov.link> | 2026-10-18 05:09:48 +0300 |
|---|---|---|
| committer | Valentin Popov <valentin@popov.link> | 2026-10-18 05:09:48 +0300 |
| commit | d97c8d40bfbae097435f10e46ecad5431504c729 (patch) | |
| tree | ab7c4cb3eb13ff4b4a88cf34f0a33bfe70ed9e4a /docs/reference/render-frame.md | |
| parent | e5d273158cd27545479276120dba8c02913f7930 (diff) | |
| download | fparkan-d97c8d40bfbae097435f10e46ecad5431504c729.tar.xz fparkan-d97c8d40bfbae097435f10e46ecad5431504c729.zip | |
Match free-flight camera to native projection
Diffstat (limited to 'docs/reference/render-frame.md')
| -rw-r--r-- | docs/reference/render-frame.md | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/docs/reference/render-frame.md b/docs/reference/render-frame.md index f8aee38..de71603 100644 --- a/docs/reference/render-frame.md +++ b/docs/reference/render-frame.md @@ -143,6 +143,27 @@ RVA `0x4EBE0` использует соглашение о вызовах `__std `0x481C5`. Это преобразование применяется только на границе неба и не меняет рыскание или управление движением `FreeFlightCamera`. +## Камера свободного полёта + +Начальный профиль использует `near = 0.5`, `far = 700` и горизонтальный FOV +`1.3` рад — параметры, наблюдавшиеся в проверенном контексте GOG Ngi32 +([формула native projection](../tomes/05-render.md#камера-и-размещение-в-оригинале)). +Для отношения ширины к высоте `a` превью вычисляет вертикальный угол +```rust +fn vertical_fov(self, aspect: f32) -> f32 { + 2.0 * ((self.horizontal_fov * 0.5).tan() / aspect).atan() +} +``` + +Код заменяет невалидный `aspect` на отношение 16:9; горизонтальный угол +остаётся `1.3` рад после изменения размера окна, а новый viewport и матрица +камеры применяются при следующей отрисовке. + +Проекция направления не сравнивает косинус угла с ближней дистанцией: она +отбрасывает только лучи за камерой и почти параллельные плоскости изображения +(`forward · direction <= 1e-4`). Лучи в передней полусфере могут проецироваться +за край viewport; владелец спрайта отдельно решает, нужно ли его рисовать. + ## Ограничения точного совпадения `VulkanStaticCamera::from_legacy_d3d7` выполняет восстановление вида и проекции |
