Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.07.2015, 10:49   #1
mazagist
Новичок
Джуниор
 
Регистрация: 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.
mazagist вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ТОЭ.метод эквивалентных преобразований Студентос Помощь студентам 0 04.03.2013 18:56
PHP поиск + несколько преобразований mr.saalexander PHP 22 23.05.2011 16:27
Вывод побитовый преобразований EddieG Общие вопросы C/C++ 2 19.09.2010 17:18
Шифрование методом аналитических преобразований Margosha89 Помощь студентам 0 31.05.2010 16:04
Шифрование методом аналитических преобразований! Margosha89 PHP 7 31.05.2010 11:49