хорошо а как смешать треки?
вот предположим есть 3 трека одной модели - T1, T2, T3
у модели одна кость.. B1
ну так вот.. я проинтерполировал анимацию в каждом треке и получил 3 кватерниона
t1Q1, t2Q1, t3Q1 как мне их правильно смешать? (с учётом того что у каждого трека есть свой все, сумма их весов всегда = 1.0)
Не надо так.
Есть два ключевых кадра. Между ними интерполируй от 0 до 1 с учетом текущей дельты, кадров в секунду анимации.
В итоге получится плавный переход от ключа 1 к ключу 2.
И потом по цепочке, где в новой итерации ключ 2 станет ключом 1, а ключ 3 станет 2.
Псевдокод:
animationDeltaFrame = 1000 / animationFramesPerSecond; // длительность кадра в мс animationDeltaTime = currentAnimationTime / animationDeltaFrame; firstKey = floor (animationDeltaTime) % animationNumFrames; // вычислим первый индекс в массиве ключевых кадров secondKey = ( firstKey + 1) % animationNumFrames; // вычислим второй индекс lerpCoeff = frac ( animationDeltaTime); // вычислим коэффициент интерполяции между двумя кадрами для i из всех bones: нач // поворот quat rotation = quat::lerp ( animationBones[i].frames[firstKey].rotation, animationBones[i].frames[secondKey].rotation, lerpCoeff); // перенос vec3 position = vec3::lerp ( animationBones[i].frames[firstKey].position, animationBones[i].frames[secondKey].position, lerpCoeff); // матрица кости animationMatrices[i] = rotation.toMatrix ( ); // из кватерниона в матрицу animationMatrices[i] [3] = vec4 ( position, 1.0); // добавим перенос конец currentAnimationTime += FrameDeltaTime;
Без учета иерархии костей, но думаю прилипить будет не трудно
не, ты немного не понял, что я имею ввиду! это ОДИН трек анимации! например "анимация хотьбы".
Кадры интерполировать я догадался как.. тут много мозга не нада вроде как. а как смешать ДВЕ и БОЛЕЕ анимации:
например анимация "бег" и анимация "стрельба" получается у меня ДВА трека! я у 1 и у 2 НАШЁЛ УЖЕ позицию и поворот ИНТЕРПОЛИРОВАННЫЕ. Как мне сами АНИМАЦИИ смешать? Если их там 5 например
А, ё.
Кури блендинг/смешивание анимаций.
Например лекцию товарисча IronPeter:
http://www.gamedev.ru/community/gamedev_lecture/articles/?id=505
Blew_zc
> Например лекцию товарисча IronPeter:
спасибо, прочитал.
Помоему там им самим пофиг тупо линейную интерполяцию юзают. (ну как я для начала и хотел сам сделать)
heihachi
Ты для начала хотел матрицы интерполировать ;)
Blew_zc
> Ты для начала хотел матрицы интерполировать ;)
ну осечка, с кем не бывает : ) для первого раза не так уж и страшно..я их не собирался а интерполировал : Р и анимацию от 3D MAX-овской НЕ ОТЛИЧИШЬ! ; ) хотя наверно *специфичных ситуаций* ещё небыло.
Хорошэй у тебя движокЪ, кросавчег, жаль что DX рендера нету (OGL *не перевариваю*)
о, ещё вопрос в догонку... абстрактный
Как лучше к костям игровые объекты биндить? Ну например к руке прицепить нож!
Предположим я в максе специально добавлю кость для оружия и обзову специфично, а в двиге спокойно найду её.
Как обычно все биндяд объекты к костям?
В ум первое пришло (очень аццки) сделать интерфейс кости IBone и наследовать класс Bone от Ibone- это "нормальные" кости. и сделать ещё 1 класс NodeBone в котором унаследовать IBone и ISceneNode.
(о моём сценеграфе: объекты(модели, свет, триггеры и т.д.) - узлы сцены, группируются специальным объектом GroopNode,
который только и может что группировать объекты)
что я "придумал" - находим такую кость в скелете, конвертим её из Bone в NodeBone и вставляем в сценеграф... потом если нуна чонить к ней прицепить - создаём GroopNode, в него пихаем нашу кость и нужный bind-объект..всё.. они соединены
да, наверно слишком "аццки".. в 02:45 то какие ещё могут лезть в голову мысли.. ппц о_О : )
я тоже задался этим вопросом и пришло на ум вот что
есть персонаж, у него есть кости руки ! к ним привязываем оружие и экспортируем это оружие с индексами костей рук персонажа !
далее !!! добавляем меш оружия к мешу персонажа и так как персонаж обсчитывается скелетной анимацией, то оружие которое имеет индексы костей рук персонажа, будет двигаться в соответствие с анимацией рук персонажа ! типа как то так )))))) тонкости еще не проработал, так как пока до этого не дошел :D на освещение сейчас торчу )))
хах, а как он ронять будет оружие? или кидать гранаты? : )
эээм а в чем проблема ? )))))
берешь отбиндиваешь меш оружия меша персонажа и кидаешь его на пол или в другого персонажа )))))
мы же ведь просто добавляем вершины оружия к вершинам персонажа так же как и добавили можно удалить ))))
к примеру имеем структуру персонажа
struct
{
modelUse;
weaponUse;
animation;
... same atributes;
}
так вот на этапе рендере берется модель ее оружие комбинируется и отправлеяется в рендер
теперь если решили выбросить оружие то нужно, эээ ))))) а тут я сам чето не могу додумать
есть идеи но не менее ацкие чем у тебя )))) вобще очень интересно мнение гуру на этот счет ! так как лекцию я прочитал ( кстате спасибо за линк, многое то что я додумал уже сам прочитал там ( например про биндинг анимаций )) но там очень в скользь говориться о теме оружия или атрибутов
iArt
> а тут я сам чето не могу додумать
я про этот участок и говорил + биндить геометрию даещё и разбивать назад - извращение, очень медленно и не нужно ИМХО наверно сделаю, как придумал
да вот придумать то можна много чего )))))) просто вот интересно как ГУРУ делают !
я просто честно не до конца вкурил как ты придумал
а я сам себе гуру. придумал кость, к которой бум цеплять оружие, представить ещё и как игровой объект. и как обычно группирую игровые объекты, так и сгруппирую оружие с костью.
точнее сделаю ноду оружия дочерним узлом этой самой бинд кости
Тема в архиве.