Match free-flight camera to native projection
Docs Deploy / Build and Deploy MkDocs (push) Failing after 2m47s

This commit is contained in:
Valentin Popov committed 2026-10-18 06:09:48 +04:00
1 parent e5d273158c
commit d97c8d40bf
2 files changed
+161 -21

No files matched your search

+21
View File
@@ -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` выполняет восстановление вида и проекции