fix(camera): constrain free flight to terrain surface bounds
Docs Deploy / Build and Deploy MkDocs (push) Successful in 36s

This commit is contained in:
Valentin Popov committed 2026-10-30 18:01:37 +04:00
1 parent 146db05e12
commit 437e8d6307
4 files changed
+99 -4

No files matched your search

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