Войти
ПрограммированиеФорумГрафика

Скелетная анимация сколько костей должно влиять на одну вершину ?

#0
13:46, 6 сен. 2006

пишу свой редактор анимации (заточенный под мою игру),  для реалистичной анимации нужно что б на одну вершину могло влять несколько костей, или можно обойтись влиянием одной кости ?


#1
13:54, 6 сен. 2006

Как ты себе потом представляешь анимацию своеё модели? Вообще тебе достаточно будет чтобы на вершину влияла только одна кость.

#2
14:12, 6 сен. 2006

Kavis
>>можно обойтись влиянием одной кости
Да можешь вообще вершины к костям не прикреплять....

#3
14:52, 6 сен. 2006

KKH
>>Как ты себе потом представляешь анимацию своеё модели
в моей анимации все очень просто: роль кости у меня выполняет параллепипед (я его просто называю куб), у него есть центральная точка относительно которой он поворачивается, у куба есть длина, ширина, высота, положение по x,y,z, и 6 углов поворотов,  есть принадлежность куба к другому т.е. когда я поворачиваю/перемещаю родителя потомки тоже поворачиваются , при расчете анимации помечаю каждую вершину какому она кубу принадлежит вот и все вроде
математическую часть рассказывать не буду :).
0xB800:0000
>>Да можешь вообще вершины к костям не прикреплять....
можешь пояснить идею?

#4
14:54, 6 сен. 2006

Kavis
Для малополигональных моделей, можно и одной. В хл1 вершина только к одной кости цеплялась.

#5
15:07, 6 сен. 2006

they say 4 нормально, а 5 так совсем заглаза

#6
15:12, 6 сен. 2006

BUzer
это хорошо, а то я думал мне придется переделывать
а хотя можно наверно попробовать ввести влияние на стыках кубов, но тогда придется еще переписыть вершинный шейдер а это  очень неохота ...
BUzer
а если  модель высокополигональная к примеру 5000 треугольников?

#7
15:14, 6 сен. 2006

kas
5 - первый раз слышу
и вообще как они должно взаимодествовать, имеется ввиду влияние костей на вершину например на стыках, а еще где?,
про это есть какай-нибудь статья?

#8
15:31, 6 сен. 2006

Kavis
Если все персонажи - роботы, то одной кости на вершину вполне достаточно.

#9
15:55, 6 сен. 2006

Kavis
>5 - первый раз слышу
>и вообще как они должно взаимодествовать, имеется ввиду влияние костей на
>вершину например на стыках, а еще где?,
Взаимодействие очень простое.

Допустим, у тебя есть точка в вершине треугольника и есть несколько костей, на неё воздействующих.

Для этой вершины нам известно:

1) список костей, которые на неё воздействуют:
кость15
кость4
кость7

2) "веса", с которыми кости воздействуют на эту вершину:
0.4
0.1
0.5

Как видно, сумма весов составляет 1.


Далее. У нас есть модель героя в исходной позиции и склект для этой позиции.

Нужно "свернуть" модель героя, чтобы в последующем её можно было "разворачивать" другими положениями скелета. Для "сворачивания" используются инверсные матрицы. "Сворачивание" заключается в том, что все вершины модели из локальных координат костей попадут в начало координат глобальной системы координат.

Рассмотрим одну вершину. Мы хотим получить её "свёрнутую" координату (SV.x,SV.x,SV.x). Делается это так:

1) приравниваем её нулю:
SV.x:=0;
SV.y:=0;
SV.z:=0;

2) Берём вершину треугольника из нормальной модели(v.x, v.y, v.z)
домножаем v на инверсную матрицу кости КОСТЬ15. Получаем vInv.x, vInv.y, vInv.z

3) заполняем значение вершины для "свёрнутого" меша с учётом веса этой кости:
SV.x:=SV.x+vInv.x * 0.4
SV.y:=SV.y+vInv.y * 0.4
SV.z:=SV.z+vInv.z * 0.4

0.4 - это вес влияния КОСТИ15

4) Пункты 2 и 3 нужно повторить для всех костей, влияющих на данную вершину

5) Всё готово! Это был подготовительный этап перед анимацией.


Теперь анимация модели.  Мы хотим получить вершину ekr.x, ekr.y, ekr.z, которую уже можно выводить на экран.

1) Приравняем вершину ekr нулю:
ekr.x:=0
ekr.y:=0
ekr.z:=0

2) Применим к вершине "свёрнутого" меша (SV.x,SV.y,SV.z) теперь уже НЕ ИНВЕРСНУЮ матрицу КОСТИ15. Получим "развёрнутую" матрицей кости координату RAZV.x, RAZV.y, RAZV.z

3) Сделаем суммирование с учётом веса:
ekr.x:=ekr.x+RAZV.x * 0.4
ekr.y:=ekr.y+RAZV.y * 0.4
ekr.z:=ekr.z+RAZV.z * 0.4

0.4 - это вес первой кости

4) Повторяем пункты 2 и 3, используя для трасформации матрицы других костей, влияющих на эту вершину. Результат трансформации домножаем на вес кости и прибавляем к ekr.x,ekr.y,ekr.z

5) Всё! Модель анимируется!!

По-моему правильно. Описанный способ уже проверен мною на практике =)

#10
16:40, 6 сен. 2006

tmtlib
Плохо тебя понял ...

Ты хочешь подменивать скелеты для одной модели ... ?. А зачем?

#11
17:22, 6 сен. 2006

KKH
>Плохо тебя понял ...
>Ты хочешь подменивать скелеты для одной модели ... ?. А зачем?
Нет. Почему подмять?

Скелет один, но есть разные положения скелета.

Также есть модель. Но она одна, и стоит в том положении, в которой её моделили (наример, модель человека с руками, расставленными в стороны).

Также есть одно ОСОБОЕ положение скелета, сответвующее этой единственной модели.

Я "сварачиваю" модель инверсными матрицами этого скелета.

А потом "разворачиваю" иневерсными матрицами других положений скелета (бег, ходьба и т.п.).

Я использую именно такой подход, так как иногда матрицы костей генерирую интерактивно!

#12
20:06, 6 сен. 2006

четыре кости хватит с головой. я пока не видел моделей, которым этого было мало. да и юзать юдобно. можно в шедер фигачить через vec4. оверхеда с одной кости немного. 3 векторных сложения + 3 умножения вектора на скаляр.
можно юзать конечно и больше костей, но смысла в этом не вижу.

#13
20:15, 6 сен. 2006

_Winnie
>Если все персонажи - роботы, то одной кости на вершину вполне достаточно.

Я сейчас как раз делаю свою(точнее буду переделывать). У меня ощущение, что все делают скелеталку по какойто определенной(мне неизвесной) модели.

У меня почемуто получаеться, что вершина прикреплена только к одной кости, а вот все что касаеться трансформации скелета я называю анимацией...

ПрограммированиеФорумГрафика

Тема в архиве.