HLFX.Ru Forum
профиль •  правила •  регистрация •  календарь •  народ •  FAQ •  поиск •  новое •  сутки •  главная •  выход  
HLFX.Ru Forum HLFX.Ru Forum > Наш форум > Технические вопросы > Скелетная SMD анимация
Снова здорова
Страницы (7): [1] 2 3 4 5 » ... Последняя »   Предыдущая тема   Следующая тема
Автор
Тема Новая тема    Ответить
KiQ
Житель форума

Дата регистрации: Aug 2010
Проживает: Смоленск, Москва
Сообщений: 2087

Рейтинг



Unhappy Скелетная SMD анимация

Всем доброго времени суток, товарищи! Может кто-нибудь помнит, как я пытался имплементировать в свой движок анимацию из smd из древней статьи на tmlibе, лет этак пять назад. Тогда мне удалось успешно забороть все глюки и выверты скелета и меша. И вот спустя столько времени, я решил портировать этот код на текущую версию движа, используя в качестве матриц не самописную либу, а рекомендуемый в среде lwjgl погромистов - JOML (Java OpenGL Math Library). После определенных манипуляций я переписал загрузчик, но по итогу вновь вернулся к раскоряченному скелету и полигонам. Собственно, что удалось выяснить - в JOML используется порядок матрицы вертикального вида
00, 10, 20, 30
01, 11, 21, 31
02, 12, 22, 32
03, 13, 23, 33
в то время, как у меня порядок был горизонтальный. Кроме того, отпала необходимость в конверсии радианов в градусы, так как JOML изначально работает в радианах. В остальном же код не слишком изменился, но модели вновь корежит (координаты вертексов тут без преобразования, то есть загружены напрямую из smd "как есть").


Загружаю рефренсный фрейм прямо

C++ Source Code:
1
int boneId = Integer.parseInt(tokens[0]);
2
 
3
float x = Float.parseFloat(tokens[1]);
4
float y = Float.parseFloat(tokens[2]);
5
float z = Float.parseFloat(tokens[3]);
6
 
7
float ax = Float.parseFloat(tokens[4]);
8
float ay = Float.parseFloat(tokens[5]);
9
float az = Float.parseFloat(tokens[6]);
10
 
11
referenceFrame.pos.put(boneId, new Vector3f(x, y, z)); //Сюда сторим референсную позицию
12
referenceFrame.angles.put(boneId, new Vector3f(ax, ay, az)); //А сюда углы в радианах


Кости настраиваю так:
C++ Source Code:
1
//Читаем все кости подряд
2
for (Bone b : bones.values()) {
3
  Vector3f pos = startFrame.pos.get(b.id); //Получаем позицию для кости
4
  Vector3f angles = startFrame.angles.get(b.id); //И углы
5
 
6
  b.matRelative.identity(); //Промежуточная матрица
7
  b.matRelative.rotateX(angles.x);
8
  b.matRelative.rotateY(angles.y);
9
  b.matRelative.rotateZ(angles.z);
10
  b.matRelative.translate(pos.x, pos.y, pos.z);
11
 
12
  if (b.parentId == -1) {
13
    b.matAbsolute = b.matRelative; //Если парент-кости нет - то присваимаем абсолютной матрице локальную
14
  } else {
15
    //В ином случае - перемножаем абсолютную матрицу парента с текущей и сохраняем в текущую абсолютную
16
    Bone p = bones.get(b.parentId);
17
    p.matAbsolute.mul(b.matRelative, b.matAbsolute);
18
  }
19
 
20
  b.matAbsolute.transformPosition(b.pos);
21
}


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


Что-то мне подсказывает, что решение где-то под носом, но найти не могу, а возвращаться к самописным матрицам не хочется, тем более, что у JOML отличная интеграция с шейдерами

__________________
-Brain is dead-

Сообщить модератору | | IP: Записан
Сообщение: 195142

Старое сообщение 26-06-2020 22:19
- За что?
nemyax
Нёмыч

Дата регистрации: Jul 2011
Проживает: (void)
Сообщений: 4133

Рейтинг



Порядок эйлеров XYZ в этом жомле?

Сообщить модератору | | IP: Записан
Сообщение: 195144

Старое сообщение 27-06-2020 08:15
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32190
Нанёс повреждений: 392 ед.

Рейтинг



Таблица конверсии

Original - smd
YAW -> ROLL
PITCH -> YAW
ROLL -> PITCH

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 195147

Старое сообщение 27-06-2020 09:13
-
KiQ
Житель форума

Дата регистрации: Aug 2010
Проживает: Смоленск, Москва
Сообщений: 2087

Рейтинг



Post

Цитата:
nemyax писал:
Порядок эйлеров XYZ в этом жомле?

Не совсем понял, порядок поворотов можно указывать в любой последовательности.

Как выяснилось на сумрачном форуме по JOML, порядок операций над матрицами должен быть T * R * v (вообще форумы по нему какие-то и прям люто сумрачные, учитывая вроде-бы относительную популярность этой либы, толком найти там что-то очень сложно, большинство ответов в стиле "сам дурак, иди учи линейную алгебру"). Применил его, а так же переделал трансформацию в соответствии с таблицей конверсии:
C++ Source Code:
1
b.matRelative.translation(pos.z, pos.x, pos.y);
2
b.matRelative.rotateX(angles.z);
3
b.matRelative.rotateY(angles.x);
4
b.matRelative.rotateZ(angles.y);


то есть поменял с (x, y, z) на (z, x, y). Скелет вроде бы грузится правильно, но развернутым на 90 градусов и где-то в стороне от начала координат. При этом, если менять порядок только углов (pitch, yaw, roll -> roll, yaw, pitch), но оставлять неизменным порядок позиции, то скелет опять-же плющит. С вертексами ситуация еще страннее, если оставить обычный порядок, то они грузятся перпендикуярно скелету. Если сменить (x, y, z->z, x, y), то тоже как бы "на боку". Более-менее правильно они грузятся в следующем порядке вершин (y, z, x), и то, где-то в воздухе, далеко от референсного скелета. Преобразование я даже пока не делал, там нужно какое-то сворачивание полигонов инвертированной матрицей, которую я эксперементально подберал в прошлой версии, тут она не заработала.

Скелет при pos(z, x, y) и angles(z, x, y)




Полигоны при (vy, vz, vx) при этом модель зеркально отражается


Добавлено 28-06-2020 в 17:08:

Ради интереса впилил обратно самописные матрицы. Итог - все замечательно грузится, скелет и полигоны на своих местах, за исключением того, что модель отзеркалена (как я раньше не замечал о_О)



Добавлено 28-06-2020 в 17:15:

Хотя зеркалится, вероятно, потому что я использую RH матрицу проекции вместо LH, а не как следствие неправильной загрузки

__________________
-Brain is dead-

Отредактировано KiQ 28-06-2020 в 13:40

Сообщить модератору | | IP: Записан
Сообщение: 195150

Старое сообщение 28-06-2020 14:15
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32190
Нанёс повреждений: 392 ед.

Рейтинг



Компилятор действительно свапает вертексы и еще по дефолту вращает скелет на 90 градусов.

Цитата:
KiQ писал:
модель отзеркалена


t = 1.0 - t;

там почти всё свапнуто или повернуто, целый огород граблей.

Добавлено 28-06-2020 в 19:40:

Самое смешное, что это не проблема smd, это вальва зачем-то придумала.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 195151

Старое сообщение 28-06-2020 16:40
-
KiQ
Житель форума

Дата регистрации: Aug 2010
Проживает: Смоленск, Москва
Сообщений: 2087

Рейтинг



Цитата:
Дядя Миша писал:
Самое смешное, что это не проблема smd, это вальва зачем-то придумала.

да уж, господа знают толк в...

Цитата:
Дядя Миша писал:
t = 1.0 - t;

если это про текстурную развертку, то у меня так и есть, проблема в том, что отзеркалены и кости...

Впрочем изначально я и собирался написать конвертер, а smd использовать как промежуточный формат. То есть, если оно будет правильно работать с самописными матрицами, то это некритично, просто сделаю дамп с этих матриц в конечный файл модели и потом буду грузить уже в JOML исправленные данные. Полагаю, mdlcompiler так и делает.

__________________
-Brain is dead-

Сообщить модератору | | IP: Записан
Сообщение: 195152

Старое сообщение 28-06-2020 17:32
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32190
Нанёс повреждений: 392 ед.

Рейтинг



Цитата:
KiQ писал:
Хотя зеркалится, вероятно, потому что я использую RH матрицу проекции вместо LH

Может. В кваках заданы некоторые неявные стандарты, которые потом вылазиют, когда начинаешь пилить что-то своё.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 195154

Старое сообщение 28-06-2020 18:56
-
KiQ
Житель форума

Дата регистрации: Aug 2010
Проживает: Смоленск, Москва
Сообщений: 2087

Рейтинг



Переделал под LH проекцию, ну это просто какая-то жесть. Такое ощусчение, что вальва просто рандомно свапала значения в smd, до кучи добавив этот непонятный и ненужный поворот root кости на 90 градусов. Теперь буду проверять анимации. Кстати, хотел спросить, по идее у модели же может быть несколько мировых костей (с parent == -1)?




Тут внезапно всплыла еще одна проблема, а именно - нормали вертексов, которые не трансформируются вместе с костями, в итоге при развороте скелета вместо симпатичного "пинхеда" мы получаем такое

__________________
-Brain is dead-

Сообщить модератору | | IP: Записан
Сообщение: 195159

Старое сообщение 29-06-2020 13:54
- За что?
FiEctro
Кот Арсис

Дата регистрации: Aug 2006
Проживает: код
Сообщений: 12885
Возраст: 32

Рейтинг



Походу они никак не могли определиться в какой системе координат им работать.

Надеюсь в ксаше и волатиле такого трешака не будет

Сообщить модератору | | IP: Записан
Сообщение: 195160

Старое сообщение 29-06-2020 14:21
- За что?
KiQ
Житель форума

Дата регистрации: Aug 2010
Проживает: Смоленск, Москва
Сообщений: 2087

Рейтинг



Эксперементально выяснил, что если в матрице проекции ось Z направлена от камеры, то модель отзеркаливается горизонтально. Ерунда какая-то

Добавлено 29-06-2020 в 17:23:

FiEctro это я для своего движка делаю, smd взял как промежуточный формат, потому-что в нем нет ничего лишнего и удобная скелеталка, плюс его легко парсить

__________________
-Brain is dead-

Сообщить модератору | | IP: Записан
Сообщение: 195161

Старое сообщение 29-06-2020 14:23
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32190
Нанёс повреждений: 392 ед.

Рейтинг



Цитата:
KiQ писал:
по идее у модели же может быть несколько мировых костей (с parent == -1)?

да, конечно.

Добавлено 29-06-2020 в 18:39:

Цитата:
KiQ писал:
нормали вертексов, которые не трансформируются вместе с костями

это как?

Добавлено 29-06-2020 в 18:45:

Цитата:
FiEctro писал:
Надеюсь в ксаше и волатиле такого трешака не будет

да я вот думаю запилить smd version 2, который от первой по содержанию будет отличаться ничем, но там уже не придется ничего свапать, вращать и переставлять.

Цитата:
FiEctro писал:
Походу они никак не могли определиться в какой системе координат им работать.

грёбаная оптимизация. Вместо того, чтобы нормально всё трансформировать через матрицу, они начали это свапать, типа так быстрее. И окончательно всё запутали. Впрочем в ase точно такой же адок творится, даже еще хуже. Потому что в ase умел сохранять q3map2, который это делал прямо в системе координат самого квейка, т.е. повернутым два раза на 90 градусов. И вот у нас стоит изумительная задачка - отличить обычный ase вот так такого повернутого. Я зацепился за комментарий "written by q3map2", других способов просто нет.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 195162

Старое сообщение 29-06-2020 15:45
-
KiQ
Житель форума

Дата регистрации: Aug 2010
Проживает: Смоленск, Москва
Сообщений: 2087

Рейтинг



Цитата:
Дядя Миша писал:
это как?

Ну вот для примера, как нормали выглядят сразу после загрузки


а вот так после поворота нулевой кости на 90 градусов (чтобы пофиксить поворот который добавила вальва)


Белым выделено начало координат (0,0,0)

Добавлено 29-06-2020 в 22:56:

Это нормали именно вертексов, которые в smd пишутся в секции triangles. Нормали треугольников я еще не считал

__________________
-Brain is dead-

Сообщить модератору | | IP: Записан
Сообщение: 195163

Старое сообщение 29-06-2020 19:56
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32190
Нанёс повреждений: 392 ед.

Рейтинг



Если ты делаешь VectorTransform для вертексов, очевидно надо сделать и VectorRotate для нормалей.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 195164

Старое сообщение 29-06-2020 21:20
-
KiQ
Житель форума

Дата регистрации: Aug 2010
Проживает: Смоленск, Москва
Сообщений: 2087

Рейтинг



Дядя Миша именно только вращение? То есть, получается берём матрицу кости, вычленяем из неё вектор вращения и умножаем на ноомаль?

Добавлено 30-06-2020 в 01:45:

Так-то эта вся визуализация чисто утилитарная, потом я оставлю только консольный конвертер, но мне важно сейчас все правильно настроить

Добавлено 30-06-2020 в 02:04:

Вообще интересно, например, читаю Quake Specs, там пишется, что квака использует стандартную left-handed проекцию, где ось Z идёт положительно вверх. В то время, как JOML упорно строит матрицу проекции с z от камеры или в камеру. С другой стороны, это логично, Z-buffer же. Где-то меня клинит, а где, не могу понять. Как будто в 2010 откатился

__________________
-Brain is dead-

Сообщить модератору | | IP: Записан
Сообщение: 195165

Старое сообщение 29-06-2020 23:04
- За что?
ncuxonaT
каков стол, таков и стул

Группа: Опытный
Дата регистрации: Oct 2009
Проживает: город/село/деревня
Сообщений: 1626
Возраст: 33

Рейтинг



Цитата:
KiQ писал:
То есть, получается берём матрицу кости, вычленяем из неё вектор вращения и умножаем на ноомаль?

бери vec4(gl_Normal, 0.0) и умножай на те же матрицы, что и вершины

Сообщить модератору | | IP: Записан
Сообщение: 195166

Старое сообщение 29-06-2020 23:09
- За что?
Тема: (Опционально)
Ваш ответ:



Переводчик транслита


[проверить длину сообщения]
Опции: Автоматическое формирование ссылок: автоматически добавлять [url] и [/url] вокруг интернет адресов.
Уведомление по E-Mail: отправить вам уведомление, если кто-то ответил в тему (только для зарегистрированных пользователей).
Отключить смайлики в сообщении: не преобразовывать текстовые смайлики в картинки.
Показать подпись: добавить вашу подпись в конец сообщения (только зарегистрированные пользователи могут иметь подписи).

Временная зона GMT. Текущее время 12:15. Новая тема    Ответить
Страницы (7): [1] 2 3 4 5 » ... Последняя »   Предыдущая тема   Следующая тема
HLFX.Ru Forum HLFX.Ru Forum > Наш форум > Технические вопросы > Скелетная SMD анимация
Снова здорова
Версия для печати | Отправить тему по E-Mail | Подписаться на эту тему

Быстрый переход:
Оцените эту тему:

Правила Форума:
Вы not можете создавать новые темы
Вы not можете отвечать в темы
Вы not можете прикреплять вложения
Вы not можете редактировать ваши сообщения
HTML Код ВЫКЛ
vB Код ВКЛ
Смайлики ВКЛ
[IMG] Код ВКЛ
 

< Обратная связь - HLFX.ru >

На основе vBulletin
Авторское право © 2000 - 2002, Jelsoft Enterprises Limited.
Дизайн и программирование: Crystice Softworks © 2005 - 2024