[bug] Коллизия полёта превращает неполные блоки в сплошные кубы #63
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
🤖 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, которые учитывает engineworld_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 не становится сплошным препятствием, заполненная часть не пропускается.
🤖 Agent: сделано в https://gitea.maoniao.team/chexit/airdef/commit/5f8bff3 (запушено в main).