-
Nikitos создал
Довёл CCD до состояния «проверено и объяснено» вместо «не удалось воспроизвести». Прежняя запись в §12 советовала «взять стену тоньше и подшаг мельче» — совет был неверен, и вот почему. ЧТО ВЫЯСНИЛОСЬ: * туннелирование не воспроизводится НИ с CCD, ни без него: 2-пиксельная стена при 63 px за шаг (3800 px/с) тело останавливает (x = 1995 при стене на 2000); * предел скорости задан `def.maximumLinearSpeed = 120` метров в секунду. При 32 px/м это ≈ 3840 px/с ≈ 64 px за шаг 1/60 — БЫСТРЕЕ ТЕЛО НЕ РАЗОГНАТЬ: `engine.setVelocity(body, 60000, 0)` даёт на выходе ровно 3840; * поэтому «подшаг мельче» не поможет: подшаг и так 1/60, а упереться можно только в предел скорости. Box2D v3 решает высокоскоростные контакты спекулятивно, и на пределе скорости этого хватает даже для стены 2 px. Это и была причина прежнего «не удалось воспроизвести»: тест пытался разогнать тело до 60000 px/с, но получал 3840 — то есть обычную скорость, на которой туннелирования и не должно быть. Заодно объяснилось «тело встало на 2660»: это не стена, а предел скорости (3840 px/с × 40 кадров ≈ 2560 px). ЗНАЧИТ `bullet` — страховка на будущее (если поднимать maximumLinearSpeed) и корректная настройка для сложных сцен, а не наблюдаемый сейчас эффект. Так и записано в API.md §15, вместе с новой строкой таблицы лимитов: 120 м/с ≈ 3840 px/с, быстрее setVelocity не разгонит. Проверка (tests/agent/highlevel_ccd_test.py, 8): флаг доходит до Box2D и читается обратно, снимается; пуля на ПРЕДЕЛЕ скорости останавливается и о 2-пиксельную, и о 8-пиксельную стену, с CCD и без него; тело долетает до стены, а не встаёт раньше; контроль на обычной скорости. Полный qjs, агентские, doc_coverage, doc_claims, быстрый набор — зелёные.
6eb919e5