Я реконструирую файлы анимации видеоигр и столкнулся с кирпичной стеной. Наборы анимации структурированы следующим образом:
Для каждого набора анимации:
- Название набора анимации: Атака
- Количество костей: 22
- Продолжительность: 1.03333
и впоследствии для каждой кости в наборе:
- Название кости: Таз
- Идентификатор кости: 0
- Ключевой интервал: 0,0333333
- Ключи: 31
а затем следующие данные разбиваются на 7 каналов (Position[x,y,z]
и Rotation quaternion[x,y,z,w]
):
Position[x,y,z] являются либо постоянными, либо исходными значениями, и у меня здесь нет проблем.
Но каналы кватерниона вращения [x, y, z, w] интерпретируются как сплайны с N сегментами и N коэффициентами, и мне трудно понять, как именно я буду оценивать сплайны в данных, которые я могу вставить в 3D-программу.
Я знаю, что сплайн каждого канала построен так, что Y и X равны нормализованному времени (от 0 до 1).
Этот Q + A ( Оценка полиномиальных коэффициентов ) кажется мне нужным:
Многочленом степени n с коэффициентами a0, a1, a2, a3........an называется функция
p(x)= a0+a1*x+a2*x^2+a3*x^3+.....+an*x^n
и написан как код Python:
def poly(lst, x):
n, tmp = 0, 0
for a in lst:
tmp = tmp + (a * (x**n))
n += 1
return tmp
Но я не уверен, что правильно делаю, когда ставлю lst
в качестве коэффициентов для каждого сегмента и x = Duration / Keys
.
Вот канал 'Rot.x' первого набора анимаций, его сегменты и коэффициенты:
Сегменты = 3
Сегмент 1
- Коэфф1: 0,0198117
- Коэфф2: 0,00826611
- Коэфф3: 0,0521381
- Коэфф4: -0,00210184
Сегмент 2
- Коэфф1: -0,181324
- Коэфф2: 1,09073
- Коэфф3: -1,77627
- Коэфф4: 0,920407
Сегмент 3
- Коэфф1: -0,0335189
- Коэфф2: 0,265863
- Коэфф3: -0,359457
- Коэфф4: 0,147228
Я смотрю на это так: каждый сегмент составляет 1/3 продолжительности (1,03333), и, кроме того, коэффициенты каждого сегмента должны оцениваться по 1/3 числа ключей (31), но вывод с использованием вышеуказанного poly(lst, x)
функция для
- сегмент 1 = от 0,019 до 4,90 до -7,15
- сегмент 2 = от -0,18 до 20985,41
- сегмент 3 = от -0,03 до 3296,11
Очевидно, я делаю что-то не так, так как выход слишком высок.
Любая помощь будет принята с благодарностью!