[bug] Коллизия полёта превращает неполные блоки в сплошные кубы #63

Closed
opened 2026-10-29 21:11:34 +00:00 by chexit · 1 comment
Owner

🤖 Filed by Codex, AI-агент Владимира (chexit).

Ревью 6f3fc644bc5194311a86baba722bc340215306b7. После #42 мод использует section occupancy как окончательную геометрию, хотя API лучей форка умеет точные collision boxes. В результате свободная часть slab/stairs считается препятствием.

Путь в коде

В патче 24 game/mod_world.rs::world_tables отмечает COLLISION для любого непустого cached collision shape; реальные AABB хранятся отдельно в boxes. section_of упаковывает только один бит на block через section_bits; формы в ответ не входят.

sim/world.rs::solid читает этот бит, а sweep при true возвращает Hit сразу на границе целого voxel. Все ветки дронов и перехватчиков используют именно этот sweep, не render.query-rays. Данные shapes, которые учитывает engine world_query::trace, до narrow phase полёта не доходят.

Воспроизведение для регрессии

Нижняя полуплита в (10,70,0) занимает Y [70,70.5]. Луч (9.5,70.75,0.5) → (11.5,70.75,0.5) проходит в свободной верхней половине. Section bit плиты равен 1, поэтому мод получает Hit на x=10. Точный ray provider по AABB должен дать Clear. Аналогично отверстия ступеней/некоторых составных форм. Это доказуемое расхождение представлений по коду; vanilla resources для живого прогона здесь отсутствовали.

Нужно

Оставить occupancy для дешёвого broad phase, а потенциальный контакт проверять по настоящим collision shapes: narrow-phase запрос в движок с сохранением непроверенного шага либо bounded cache форм. Не посылать host-запрос на каждый voxel. Согласовать с обработкой Unknown; не добавлять лишний случайный пропуск столкновения. Явно документировать габарит аппарата/луч центра.

Приёмка

Одинаковый first contact у точного ray API и полёта: нижняя/верхняя плита, ступени, полноразмерная стена, свободный тоннель; static и context-dependent shapes. Воздух внутри voxel не становится сплошным препятствием, заполненная часть не пропускается.

🤖 Filed by Codex, AI-агент Владимира (chexit). Ревью `6f3fc644bc5194311a86baba722bc340215306b7`. После #42 мод использует section occupancy как окончательную геометрию, хотя API лучей форка умеет точные collision boxes. В результате свободная часть slab/stairs считается препятствием. ### Путь в коде В патче 24 `game/mod_world.rs::world_tables` отмечает COLLISION для любого непустого cached collision shape; реальные AABB хранятся отдельно в `boxes`. `section_of` упаковывает только один бит на block через `section_bits`; формы в ответ не входят. `sim/world.rs::solid` читает этот бит, а `sweep` при true возвращает Hit сразу на границе **целого voxel**. Все ветки дронов и перехватчиков используют именно этот sweep, не `render.query-rays`. Данные shapes, которые учитывает engine `world_query::trace`, до narrow phase полёта не доходят. ### Воспроизведение для регрессии Нижняя полуплита в `(10,70,0)` занимает Y `[70,70.5]`. Луч `(9.5,70.75,0.5) → (11.5,70.75,0.5)` проходит в свободной верхней половине. Section bit плиты равен 1, поэтому мод получает Hit на `x=10`. Точный ray provider по AABB должен дать Clear. Аналогично отверстия ступеней/некоторых составных форм. Это доказуемое расхождение представлений по коду; vanilla resources для живого прогона здесь отсутствовали. ### Нужно Оставить occupancy для дешёвого broad phase, а потенциальный контакт проверять по настоящим collision shapes: narrow-phase запрос в движок с сохранением непроверенного шага либо bounded cache форм. Не посылать host-запрос на каждый voxel. Согласовать с обработкой Unknown; не добавлять лишний случайный пропуск столкновения. Явно документировать габарит аппарата/луч центра. ### Приёмка Одинаковый first contact у точного ray API и полёта: нижняя/верхняя плита, ступени, полноразмерная стена, свободный тоннель; static и context-dependent shapes. Воздух внутри voxel не становится сплошным препятствием, заполненная часть не пропускается.
chexit added the area:simulationtype:bugpriority:P2 labels 2026-10-29 21:11:34 +00:00
Author
Owner

🤖 Agent: сделано в https://gitea.maoniao.team/chexit/airdef/commit/5f8bff3 (запушено в main).

🤖 Agent: сделано в https://gitea.maoniao.team/chexit/airdef/commit/5f8bff3 (запушено в main).
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chexit/airdef#63