Привет. Я тут задался идеей построить из smd скелет и заанимировать его, но никак не могу добиться адекватного результата. Скелет постоянно то плющит, то выворачивает. Проблема, как мне кажется, крутится где-то вокруг углов и без помощи свыше я разобраться никак не могу.
Итак, выдержка из официальная дока:
Цитата:
A bone's position relative to its parent (give absolute values in the case of root bones).
Pos is position in units relative to the parent bone.
Rot is local Tait-Bryan angles, given in radians. (90° = 1.570796 rad)
Ага, видим что углы задаются в радианах, но это не проблема, они локальные относительно родительской кости = тоже понятно. А вот что за Тайт-Браин?
Мне по сути нужно получить относительный поворот в углах Эйлера. Как перевести Тайта-Брайна к Эйлеру не понятно.
Методом чёрного ящика мне удалось добиться некоторых успехов. Код:
C++ Source Code:
1
for (int i=0; i<_smd.Skeleton.Count; i++)
2
{
3
var bone = _bones[i];
4
V3 temp;
5
if (_smd.Skeleton.First(b => b.Name == bone.name).ParentBone == 0)
if (_smd.Skeleton.First(b => b.Name == bone.name).ParentBone == -1)
24
newRotZ -= 90;
25
26
V3 rot=new V3(newRotX,newRotY,newRotZ);
27
bone.localRot=rot;
28
}
Анимация прыжка стала выглядеть более-менее приемлемо(см вложение), по крайне мере её не выворачивает, но явно видно, что в работе с углами есть какая-то ошибка. Например, если загрузить анимацию смерти, то скелет упадёт на угол примерно 45 градусов от исходного, хотя должен упасть ровно на землю.
Далее, я попытался почитать код из Ксаша, но понял, что здесь замешана какая-то магия вроде матанализа или типа того. Короче не смог я понять что тут написано:
C++ Source Code:
1
cz = cos( zrotation );
2
sz = sin( zrotation );
3
4
while (fgets( line, sizeof( line ), input ) != NULL)
В связи с этим, если кто знает, прошу помощи. Подскажите, что там такого наворотили валвовцы с этими скелетами и как-ёптить их адекватно спарсить и отрисовать.
1. Это для углов или для смещения?
2. В каких случаях нужно добавлять минус к значению.
3. Для всех костей или для рутовой?
4. При чём здесь Zrotation и зачем синусы-косинусы?
Если вся проблема только в том, что система координат повёрнута, то оно бы решалось загрузкой без преобразований "как есть", с последующим поворотом рутовой кости на 90 градусов. Но это не канает почему-то.