Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Скелетная анимация :( [Delphi]


Зм1й ©   (2006-01-27 15:25:00) 

Вопрос наверно не совсем для форума, но я уже 2 месяца бьюсь, и на форум у меня последняя надежда. Я хочу сделать скелетную анимацию. Средствами maxscript экспортирую из max'а вершины объектов, кости, у каждой вершины ссылка на кость. И для обычных объектов, и для костей экспортирую кадры анимации - перенос, поворот в углах эйлера и масштаб. Пока будем считать, что для одной вершины одна кость.
Так вот, в кадре для каждого объекта пересчитываю результирующую матрицу трансформацию. Если есть родитель, то учитываю его трансформацию. Потом каждую вершину каждого объекта умножаю на полученную матрицу соответствующего объекта. Естественно перед каждым кадром объекты "обнуляю". Кости, и другие "не-skin-овые" объекты выводятся вроде корректно. А вот что делать со скинами? Как корректировать их вершины, чтобы при движении костей двигались и вершины?


XProger   (2006-02-09 19:27:00) [1]

Зм1й, где найти формулу тебе уже в [15] посте подсказали


Зм1й   (2006-02-09 19:10:00) [2]

Вопрос всё ещё в силе...


> TWINc ©   (05.02.06 16:34) [15]

glscene я не использую, и к тому же думаю, что дело всё-таки не в матрицах. Просто я изначально всё не так делаю, я же не знаю формулы :(


TWINc   (2006-02-05 16:34:00) [3]

инвертирование матрицы есть в VectorMath GLScene'ы


Зм1й   (2006-02-05 15:34:00) [4]

Никто не знает точную формулу, по которой рассчитывается скелетная анимация в Максе? Может у кого исходник есть? Или может кто-нибудь может подсказать форум, где могут ответить на мой вопрос? Ниужели так трудно поделиться опытом?
:(

P. S. Поиск я юзал, не нашёл


Ricks   (2006-01-30 10:58:00) [5]

Почитай здесь:
http://www.mathem.h1.ru/matr.html

или покопайся в ссылках этого сайта, хотя и там все написано, я проверил :)


Зм1й   (2006-01-29 17:21:00) [6]

Не мог бы ты написать тоже самое для 4*4, а то у меня нет учебника по линейной алгебре, есть только по обычной за 11 класс, но там этого нет...


Ricks   (2006-01-28 23:27:00) [7]

Если ты хочешь найти обратную матрицу то тебе надо... (это я пытаюсь вспомнить линейную алгебру)...

обратная матрица находится как транспонированная матрица, составленная из алгебраических дополнений (по-моему так это называется) и умноженная на 1 / модуль нормальной матрицы

например:


a = ( a b )
    ( c d )
|a| = a*d - b*c

a^(-1) =
1/|a| * ( d  -c )
          (-b   a )


а вообще лучше найди что-нибудь по аналитике!


Зм1й   (2006-01-28 20:35:00) [8]

Я решил находить вот так

 TMatrix= Array[0..3, 0..3] of Single;

function Det_Mat(M: TMatrix): Single;
begin
 Result:=M[0, 0]*M[1, 1]*M[2, 2]*M[3, 3]+M[0, 1]*M[1, 2]*M[2, 3]*M[1, 0]+
         M[0, 2]*M[1, 3]*M[2, 1]*M[3, 2]+M[0, 3]*M[2, 0]*M[3, 1]*M[3, 0]-
         M[0, 3]*M[1, 2]*M[2, 1]*M[3, 0]-M[0, 2]*M[1, 1]*M[2, 0]*M[1, 3]-
         M[0, 1]*M[1, 0]*M[2, 2]*M[3, 1]-M[0, 0]*M[2, 3]*M[3, 2]*M[3, 3];
end;

function Inv_Mat(M: TMatrix): TMatrix;
var
 d: Single;
begin
 d:=Det_Mat(M);

 if d<>0 then Result:=New_Mat(M[0, 0]/d, M[1, 0]/d, M[2, 0]/d, M[3, 0]/d,
                              M[0, 1]/d, M[1, 1]/d, M[2, 1]/d, M[3, 1]/d,
                              M[0, 2]/d, M[1, 2]/d, M[2, 2]/d, M[3, 2]/d,
                              M[0, 3]/d, M[1, 3]/d, M[2, 3]/d, M[3, 3]/d)
 else Result:=M;
end;


но всё ещё хуже стало

Проверьте пожалуста на ошибки

P. S. Вы конечно извините, что я вас так достаю, но мне просто крайне важен этот вопрос :)


Зм1й   (2006-01-28 19:48:00) [9]

Я вот думаю, может я неправильно обратную матрицу нахожу... Подскажите пожалуйста, как правильно её находить?


Зм1й   (2006-01-28 17:36:00) [10]


> TrahTibiDoh   (28.01.06 14:21) [7]
> А монЫтор пробовал тряпочкой бумажной протереть?

Слыш, "брЫтан", ты вот это щас к чему? :E


TrahTibiDoh   (2006-01-28 14:21:00) [11]

А монЫтор пробовал тряпочкой бумажной протереть?


Зм1й   (2006-01-27 19:26:00) [12]

Я это читал, я теорию-то понимаю. Мне кажется, что проблема конкретно в моей задаче... Я ведь модели экспортирую из макса, в нём я применяю модификатор Skin. Так вот я пробовал просто умножать каждую вершину на матрицу соответствующей кости, но получался бред. В статье, которую дал Sapersky, модель предварительно "сворачивается", то есть умножается на матрицу обратную матрице нулевого кадра. Но там md2, а у меня MAX. Пробовал умножать на матрицу, противоположную матрице нулевого кадра(то есть полученную из отрицательного переноса и отрицательного поворота), но тоже не катит. Пробовал ещё умножать на матрицу переноса, полученную из вектора - центра кости, не катит. В общем хочется услышить от тех, кто имел дело со скелетной анимацией из макса(модификатор Skin)- какие операции нужно применять к вершинам, если известны матрицы костей?


Sapersky   (2006-01-27 17:25:00) [13]

Белое окошко :)
http://www.tmtlib.narod.ru/files.htm


XProger   (2006-01-27 17:25:00) [14]

Зм1й,
http://dtf.ru/articles/read.php?id=29
http://www.gamedev.ru/articles/?id=40112
http://www.gamedev.ru/coding/10917.shtml


Зм1й   (2006-01-27 15:54:00) [15]


> TrahTibiDoh   (27.01.06 15:41) [2]


спроси, только я не совсем понял, о чём ты говоришь


TrahTibiDoh   (2006-01-27 15:41:00) [16]

Вспомныл, видел в белом охошке в белой коробке, на столе хоторая лежит, может спросить у нее? У


TrahTibiDoh   (2006-01-27 15:39:00) [17]

Хде-та я видал что есть прымер со костяной мультииплыкацыей, хде не помню


Наверх

Титульная страница Поиск, карта сайта Написать письмо