From 437e8d63073c1a5a360e48e7796eb42720cf64c2 Mon Sep 17 00:00:00 2001 From: Valentin Popov Date: Fri, 30 Oct 2026 18:01:37 +0400 Subject: fix(camera): constrain free flight to terrain surface bounds --- docs/appendices/knowledge-boundaries.md | 4 ++++ docs/reference/render-frame.md | 15 +++++++++++++++ 2 files changed, 19 insertions(+) (limited to 'docs') diff --git a/docs/appendices/knowledge-boundaries.md b/docs/appendices/knowledge-boundaries.md index c58462b..a31b561 100644 --- a/docs/appendices/knowledge-boundaries.md +++ b/docs/appendices/knowledge-boundaries.md @@ -10,6 +10,10 @@ authoring API без динамического подтверждения. Не доказаны символами точные имена renderer vtable slots, полный набор CShade state transitions и окончательный порядок части transparent/FX/shadow subpasses. +Свободная камера превью удерживается в XY-границах поверхностей карты и над +рельефом. Она пока не проверяет стены и проёмы строений; эти ограничения не +подтверждают поведение стратегической камеры или камеры робота оригинала. + Закрывающий эксперимент: запустить оригинал в совместимой Windows/DirectX среде, перехватить DirectDraw/Direct3D calls и surface flips, сохранить state log на минимальных сценах с одним типом материала. 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` выполняет восстановление вида и проекции -- cgit v1.2.3