diff options
| author | Valentin Popov <valentin@popov.link> | 2026-10-30 17:01:37 +0300 |
|---|---|---|
| committer | Valentin Popov <valentin@popov.link> | 2026-10-30 17:01:37 +0300 |
| commit | 437e8d63073c1a5a360e48e7796eb42720cf64c2 (patch) | |
| tree | 05598afab62f88d258524f238a8a3ca5e498681c /docs/reference | |
| parent | 146db05e12a7ef40e1e313307127cb73919772eb (diff) | |
| download | fparkan-437e8d63073c1a5a360e48e7796eb42720cf64c2.tar.xz fparkan-437e8d63073c1a5a360e48e7796eb42720cf64c2.zip | |
fix(camera): constrain free flight to terrain surface bounds
Diffstat (limited to 'docs/reference')
| -rw-r--r-- | docs/reference/render-frame.md | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/docs/reference/render-frame.md b/docs/reference/render-frame.md index 3085731..8cba630 100644 --- a/docs/reference/render-frame.md +++ b/docs/reference/render-frame.md @@ -181,6 +181,21 @@ fn vertical_fov(self, aspect: f32) -> f32 { (`forward · direction <= 1e-4`). Лучи в передней полусфере могут проецироваться за край viewport; владелец спрайта отдельно решает, нужно ли его рисовать. +После движения свободная камера ограничивает X и Y прямоугольником +поверхностей карты, затем поднимается над найденным рельефом на заданный +зазор. Границы берутся из корня пространственного индекса `TerrainWorld`, +поэтому неиспользуемые вершины файла их не расширяют и повторного обхода +геометрии в каждом кадре нет: + +```rust +position[axis] = position[axis].clamp(min[axis], max[axis]); // axis = 0, 1 +position[2] = position[2].max(ground_height + ground_clearance); +``` + +Высота полёта сверху не ограничена. Это ограничение диагностической камеры +превью; столкновения со стенами зданий и точные правила игровых камер оригинала +остаются отдельными задачами. + ## Ограничения точного совпадения `VulkanStaticCamera::from_legacy_d3d7` выполняет восстановление вида и проекции |
