Новичок
Джуниор
Регистрация: 09.07.2015
Сообщений: 1
|
Наследование преобразований в скелетной анимации
Всем привет. Этот вопрос я задавал на многих форумах, но никто так и не ответил. Теперь задаю его здесь 
Есть json файл с мешами и 1 скелетом. У скелета 2 кости( родительская и дочерняя). У каждой кости есть своя анимация( набор из 30 фреймов, каждый из которых содержит матрицу 4x4, которую я отправляю в шейдер). Сцена создана таким образом, что дочерняя кость никак не изменяется, а родительская кость просто вращается.
У всех костей есть такие параметры, как: - "id"
- "parentId" (идентификатор родительской кости (если родительской кости нет, то =-1)),
- "matrix" (я так понял, это - матрица, на основе которой происходят преобразования (как будто центр преобразований, хотя я могу ошибаться)),
- "frames" (массив всех фреймов анимации кости)
Вот пример json файла:
Код:
"skeletons": [{
"name": "skelet",
"bones": [{
"name": "Bone parent",
"index": 0,
"matrix": [0.7021, 0, -0.712, 0, -0.3347, 0.8826, -0.3301, 0, 0.6285, 0.4701, 0.6197, 0, 0, 1, 0, 1],
"parentBoneIndex": -1,
"animation": {
"dataType": 3,
"framePerSecond": 24,
"keys": [{
"frame": 1,
"values": [0.7021, 0, -0.712, 0, -0.3347, 0.8826, -0.3301, 0, 0.6285, 0.4701, 0.6197, 0, 0, 1, 0, 1]
}, {
"frame": 2,
"values": [0.7021, 0.0029, -0.712, 0, -0.3347, 0.8839, -0.3265, 0, 0.6285, 0.4676, 0.6216, 0, 0, 1, 0, 1]
}, {
"frame": 3,
"values": [0.7021, 0.0115, -0.7119, 0, -0.3347, 0.8878, -0.3158, 0, 0.6285, 0.46, 0.6272, 0, 0, 1, 0, 1]
}... {
"frame": 30,
"values": [0.7021, 0.7012, 0.1236, 0, -0.3347, 0.1719, 0.9265, 0, 0.6285, -0.6919, 0.3554, 0, 0, 1, 0, 1]
}, {
"name": "Bone child",
"index": 1,
"matrix": [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, -1, 0, -0.6955, -0.647, -2.3721, 1],
"parentBoneIndex": 0,
"animation": {
"dataType": 3,
"framePerSecond": 24,
"keys": [{
"frame": 1,
"values": [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, -1, 0, -0.6955, -0.647, -2.3721, 1]
}, {
"frame": 2,
"values": [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, -1, 0, -0.6955, -0.647, -2.3721, 1]
}, {
"frame": 2,
"values": [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, -1, 0, -0.6955, -0.647, -2.3721, 1]
}... {
"frame": 30,
"values": [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, -1, 0, -0.6955, -0.647, -2.3721, 1]
}],
"loopBehavior": 1,
"name": "anim",
"property": "_matrix"
}
}],
"loopBehavior": 1,
"name": "anim",
"property": "_matrix"
}
}]
}]
Теперь немного кода вершинного шейдера:
Код:
uniform mat4 animationBone[100];
uniform mat4 matrixBone[100];
...
if(boneWeight.x>0.0||boneWeight.y>0.0||boneWeight.z>0.0)
{
mat4 ps=animationBone[int(boneIndex.x)]*boneWeight.x*matrixBone[int(boneIndex.x)];
ps+=animationBone[int(boneIndex.y)]*boneWeight.y*matrixBone[int(boneIndex.y)];
ps+=animationBone[int(boneIndex.z)]*boneWeight.z*matrixBone[int(boneIndex.z)];
ps+=animationBone[int(boneIndex.w)]*boneWeight.w*matrixBone[int(boneIndex.w)];
//mat4 ps=bone.animation.keys.value*weight*bone.matrix
pos=MoveMat*(ps*(vec4(position,1.0)));
}
Если у кости есть родитель, я умножаю анимацию этой кости на анимацию кости родителя, и так до тех пор, пока не будет произведено умножение на анимацию корневой кости. Например, посчитаем анимацию костей для третьего фрейма анимации:
Код:
resultAnimation = [];
boneArray.forEach(function(bone) {
if (getParent(bone)) {
animation = bone.animation.keys[3].values;
var parentId = bone.parentBoneIndex;
while (parentId != -1) {
animation = mult(animation, boneArray[parentId].animation.keys[3].values);
parentId = boneArray[parentId].parentBoneIndex;
}
resultAnimation = resultAnimatin.concat(animation);
} else {
resultAnimation = resultAnimatin.concat(bone.animation.keys[3].values);
}
});
sendUniform("animationBone", animation);
P.S. это javascript код, но я думаю разобраться в нем сможет даже далекий от javascript человек
P.S.S. concat- соединение массивов; forEach- перебор всех эл-тов массива
Сам вопрос: создание наследования в этом коде происходит неправильно, т.к. дочерняя кость умножается на родительскую и происходит неведомая "хрень" с анимацией этой кости. Так вот, как мне исправить механизм наследования анимации костей?
Последний раз редактировалось mazagist; 09.07.2015 в 10:52.
|