• Nikitos's avatar
    CCD: почему туннелирование не воспроизводится — предел скорости движка
    · 6eb919e5
    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