|
Some checks failed
CI / checks (push) Has been cancelled
Спека декодера взята из настоящего bone_setup.cpp (Mapbase-зеркало SDK 2013). Прошлые догадки были неверны, и это зафиксировано в docs/PARITY.md: каналы дорожек — не компоненты кватерниона, а углы Эйлера (raw · rotscale + поза покоя, затем AngleQuaternion); позиции — raw · posscale + bone.pos; значения блоков не накапливаются дельтами (ExtractAnimValue идёт по блокам valid+1 записей, внутри блока value[k], дальше повтор последнего); флаг DELTA означает относительные каналы без позы покоя. Замеры на живых данных, три теста в tests/world_real.rs: - @taunt_muscle_base (451 кадр, 53 дорожки): углы ≤ 4,75 рад, сдвиги позиций ≤ 28,5 юнитов, кватернионы единичные — при новой спеке нарушений нет; - кости локальны родителю (цепочка 4,0 / 3,5 / 8,9), корень — таз на 38,6; - police.mdl: 57 костей, своя анимация @ragdoll лежит в самом MDL (anim_block == 0); m_anm.mdl: 1563 анимации в models/m_anm.ani (7,1 МБ); - модель игрока, idle_all_01: из 3147 вершин 1101 сдвинулась между кадрами 0 и 30, высота тела 61 юнит и в покое, и в анимации — не схлопывается. Движок: AnimData (буферы кадров под Arc), frame_pose, play_model_animation (мировые позы через родителей, A·B⁻¹ по костям, скиннинг весами вершин); кости меша ищутся в скелете анимации по именам — скелеты совпадают по именам, но не по числу костей. Кадры читаются и из .ani, и из самого MDL. Клиент: вьюмодель играет idle, модель игрока — idle_all_01; добавлен вид со стороны --third-person (иначе свою модель не увидеть: в первом лице камера внутри неё). Map(Box<MapArgs>) — против clippy::large_enum_variant. Все 23 сьюта и 29 картовых тестов зелёные. |
||
|---|---|---|
| .. | ||
| ARCHITECTURE.md | ||
| DIARY.md | ||
| LUA.md | ||
| NETWORK.md | ||
| PARITY.md | ||
| PLAN.md | ||
| PROBLEMS.md | ||
| RECON.md | ||