HLFX.Ru Forum
профиль •  правила •  регистрация •  календарь •  народ •  FAQ •  поиск •  новое •  сутки •  главная •  выход  
HLFX.Ru Forum HLFX.Ru Forum > Теория и практика > Half-Life SDK > Smd animation parse
Древнее колдунство
  Предыдущая тема   Следующая тема
Автор
Тема Новая тема    Ответить
-=DrTressi=-
Мото-смертник

Группа: Неопытный
Дата регистрации: Aug 2010
Проживает: На Белом свете!
Сообщений: 1003
Возраст: 27

Рейтинг



Smd animation parse

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

Итак, выдержка из официальная дока:

Цитата:
A bone's position relative to its parent (give absolute values in the case of root bones).
Pos is position in units relative to the parent bone.
Rot is local Tait-Bryan angles, given in radians. (90° = 1.570796 rad)

Ага, видим что углы задаются в радианах, но это не проблема, они локальные относительно родительской кости = тоже понятно. А вот что за Тайт-Браин?
Мне по сути нужно получить относительный поворот в углах Эйлера. Как перевести Тайта-Брайна к Эйлеру не понятно.

Методом чёрного ящика мне удалось добиться некоторых успехов. Код:
C++ Source Code:
1
for (int i=0; i<_smd.Skeleton.Count; i++)
2
{
3
  var bone = _bones[i];
4
  V3 temp;
5
  if (_smd.Skeleton.First(b => b.Name == bone.name).ParentBone == 0)
6
  {
7
    temp.x = _smd.Frames[_frame].Joints[i].Pos.Z;
8
    temp.y = _smd.Frames[_frame].Joints[i].Pos.X;
9
    temp.z = _smd.Frames[_frame].Joints[i].Pos.Y;
10
  }
11
  else
12
  {
13
    temp.x = _smd.Frames[_frame].Joints[i].Pos.X;
14
    temp.y = _smd.Frames[_frame].Joints[i].Pos.Z;
15
    temp.z = _smd.Frames[_frame].Joints[i].Pos.Y;
16
  }
17
 
18
  bone.locPos=temp;
19
 
20
  float newRotX = -_smd.Frames[_frame].Joints[i].Angle.X * Mathf.Rad2Deg;
21
  float newRotY = -_smd.Frames[_frame].Joints[i].Angle.Z * Mathf.Rad2Deg;
22
  float newRotZ = -_smd.Frames[_frame].Joints[i].Angle.Y * Mathf.Rad2Deg;
23
  if (_smd.Skeleton.First(b => b.Name == bone.name).ParentBone == -1)
24
    newRotZ -= 90;
25
 
26
  V3 rot=new V3(newRotX,newRotY,newRotZ);
27
  bone.localRot=rot;
28
}


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

Далее, я попытался почитать код из Ксаша, но понял, что здесь замешана какая-то магия вроде матанализа или типа того. Короче не смог я понять что тут написано:
C++ Source Code:
1
cz = cos( zrotation );
2
sz = sin( zrotation );
3
 
4
while (fgets( line, sizeof( line ), input ) != NULL)
5
{
6
  linecount++;
7
  if (sscanf( line, "%d %f %f %f %f %f %f", &index, &pos[0], &pos[1], &pos[2], &rot[0], &rot[1], &rot[2] ) == 7)
8
  {
9
    if (t >= panim->startframe && t <= panim->endframe)
10
    {
11
      if (panim->node[index].parent == -1) {
12
        adjust_vertex( pos );
13
        panim->pos[index][t][0] = cz * pos[0] - sz * pos[1];
14
        panim->pos[index][t][1] = sz * pos[0] + cz * pos[1];
15
        panim->pos[index][t][2] = pos[2];
16
        // rotate model
17
        rot[2]			+= zrotation;
18
      }
19
      else
20
      {
21
        VectorCopy( pos, panim->pos[index][t] );
22
      }
23
      if (t > end)
24
        end = t;
25
      if (t < start)
26
        start = t;
27
 
28
      if (panim->node[index].mirrored)
29
        VectorScale( panim->pos[index][t], -1.0, panim->pos[index][t] );
30
 
31
      scale_vertex( panim->pos[index][t] );
32
 
33
      clip_rotations( rot );
34
 
35
      VectorCopy( rot, panim->rot[index][t] );
36
    }
37
  }


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

[ Вложение ]
animtest.jpg

__________________
How interesting, just look at that!
© Scientist

Отредактировано -=DrTressi=- сегодня в 04:51

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

Старое сообщение сегодня 04:48
- За что?
 Дядя Миша
who said meow?

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

Рейтинг



Z это Y
Y это X
X это Z

Цитата:
-=DrTressi=- писал:
Как перевести Тайта-Брайна к Эйлеру не понятно.

умножить на 57,295779513082320876798154814105

__________________
My Projects: download page

Ты сегодня мне принёс гидравлический насос и сказал, что это ландышы
Но меня не проведёшь, насос на ландыш не похож, он большой, а ландыш маленький

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

Старое сообщение сегодня 09:07
-
-=DrTressi=-
Мото-смертник

Группа: Неопытный
Дата регистрации: Aug 2010
Проживает: На Белом свете!
Сообщений: 1003
Возраст: 27

Рейтинг



Дядя Миша

Цитата:
Z это Y
Y это X
X это Z

1. Это для углов или для смещения?
2. В каких случаях нужно добавлять минус к значению.
3. Для всех костей или для рутовой?
4. При чём здесь Zrotation и зачем синусы-косинусы?

Если вся проблема только в том, что система координат повёрнута, то оно бы решалось загрузкой без преобразований "как есть", с последующим поворотом рутовой кости на 90 градусов. Но это не канает почему-то.

Цитата:
умножить на 57,295779513082320876798154814105

Ну так это я делаю же:
code:
* Mathf.Rad2Deg

__________________
How interesting, just look at that!
© Scientist

Отредактировано -=DrTressi=- сегодня в 09:46

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

Старое сообщение сегодня 09:45
- За что?
Тема: (Опционально)
Ваш ответ:



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


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

Временная зона GMT. Текущее время 10:59. Новая тема    Ответить
  Предыдущая тема   Следующая тема
HLFX.Ru Forum HLFX.Ru Forum > Теория и практика > Half-Life SDK > Smd animation parse
Древнее колдунство
Версия для печати | Отправить тему по E-Mail | Подписаться на эту тему

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

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

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

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