Привет. Я тут задался идеей построить из 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 градусов. Но это не канает почему-то.
Если там заданы углы Тайта-Брайана, значит и матрицу поворота нужно брать для них, а не для Эйлера. Её можно на английской Википедии посмотреть. А одно в другое переводить - это лишний геморрой
-=DrTressi=- писал: Это для углов или для смещения?
Для углов.
Цитата:
-=DrTressi=- писал: В каких случаях нужно добавлять минус к значению.
ни в каких
Цитата:
-=DrTressi=- писал: Для всех костей или для рутовой?
для всех костей
Цитата:
-=DrTressi=- писал: При чём здесь Zrotation и зачем синусы-косинусы?
Ну это, если моделька после компиляции смотрит боком или лежит, можно добавить Z-Rotation. А синусы-косинусы как раз и осуществляют это вращение.
Цитата:
-=DrTressi=- писал: Если вся проблема только в том, что система координат повёрнута, то оно бы решалось загрузкой без преобразований "как есть", с последующим поворотом рутовой кости на 90 градусов. Но это не канает почему-то.
В прошлом народ упорно не хотел всё вращать честно. Экономил процессорное время. Поэтому вращение заменили свапом координат.
Что в дальнейшем добавило немало весёлых минут юным исследователям древних форматов.
Цитата:
-=DrTressi=- писал: Ну так это я делаю же:
я понимаю. Но ты же зачем-то спросил?
Добавлено 28-01-2021 в 15:27:
Цитата:
ncuxonaT писал: Если там заданы углы Тайта-Брайана
Углы Тайта-Брайана это подмножество углов Эйлера. Я не знаю чем они отличаются. Конкретно вот эти углы в smd - они в радианах, Эйлер обычно в градусах. Других отличий вроде бы нет. Углы как углы.
Дядя Миша писал: Углы Тайта-Брайана это подмножество углов Эйлера. Я не знаю чем они отличаются.
Тем, что у обычного Эйлера первый и третий повороты идут по одной оси, а у Тайта-Брайана - по разным. Разные матрицы поворота используются. Pitch yaw roll - это как раз углы Тайта-Брайана
ncuxonaT писал: Разные матрицы поворота используются
Ну не знаю. Я использую те же самые матрицы, что и для обычного Эйлера.
Единственное отличие, да - я свапаю местами XYZ как написал выше.
Ну и конечно не перевожу градусы в радианы, поскольку там и так уже радианы.
Из чего следует вывод, что в кваках все углы Эйлера были в Тайт-Брайан формате, просто об этом как-то не упоминали.