HLFX.Ru Forum
Показать все 9 сообщений этой темы на одной странице

HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Half-Life SDK (https://hlfx.ru/forum/forumdisplay.php?forumid=8)
-- Аттачменты на вьюмодели и их angles (https://hlfx.ru/forum/showthread.php?threadid=6098)


Отправлено Aynekko 10-08-2024 в 10:48:

Аттачменты на вьюмодели и их angles

Давно у меня не было вопросов, которые я бы не сумел решить самостоятельно.
Но сейчас в ступоре.
У меня XashXT. Получаю angles аттачмента вьюмодели вот таким образом:

C++ Source Code:
Vector angles = R_StudioAttachmentAngles( view, 1, AF_LOCAL_SPACE );

Для нужного мне результата опытным путем выяснил, что мне нужно, чтобы полученный вектор был равен (0, 90, 0) в состоянии покоя (анимация оружия idle). Числа округленные, там не 90, а 89.86785, суть примерно такая. У меня есть 2 оружия, у которых так и получается.
Но большинство остальных оружий выдают ахинею - например (-50, -90, -180) или (0, -90, 90).

Как задать эти angles аттачментов, чтобы они были как мне нужно? Я пробовал редактировать qc: менял положение аттачмента и менял кость, к которой он прикреплен. Но на выходе координаты не менялись.

И я не понимаю, каким образом они вообще высчитываются.

__________________
Мой мод на Xash


Отправлено Дядя Миша 10-08-2024 в 11:45:

Референсная статья: https://hlfx.ru/forum/showthread.php?s=&threadid=2121

__________________
My Projects: download page

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

Цитата:

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


Отправлено Aynekko 10-08-2024 в 12:21:

Спасибо, это более понятно.
Я пользуюсь праймовским компилятором, что на базе п2, там для аттачментов есть токены absolute и rotate, но что-то они мне пока не помогли. Посмотрел через исходники как их правильно задавать но все без толку.
Попробую по статье или еще как-нибудь.

__________________
Мой мод на Xash


Отправлено Дядя Миша 10-08-2024 в 13:39:

И возможно в этой функции был какой-то мелкий баг, я сам уже толком не помню. Спроси у Метаморфа.

__________________
My Projects: download page

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

Цитата:

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


Отправлено Aynekko 10-08-2024 в 16:46:

Ну все, держите меня семеро
XashXT, StudioCalcAttachments.
Примечание: в данном коде i = 0, смотрю только свой аттачмент.

C++ Source Code:
matrix3x4 world = bones[pattachment[i].bone].ConcatTransforms( att[i].local );
att[i].angles = world.GetAngles();

Вывел в консоль att[i].local, там обычная Identity.
att[i].angles равен вектору 0 0 90.
Хорошо. Вместо att[i].local для нужного аттачмента подсовываю свое: избавляюсь от 90.
C++ Source Code:
matrix3x4 test = matrix3x4( g_vecZero, Vector(0,0,-90));
matrix3x4 world = bones[pattachment[i].bone].ConcatTransforms( test );
att[i].angles = world.GetAngles();

Получил нужный результат. Angles 0 0 0, которые нормально отклоняются во время анимации модели. Отлично! Но как бы мне сделать так, чтобы не хардкодить у себя, а пофиксить это в модели?
Смотрю исходники параноевского studiomdl.
C++ Source Code:
1
if( !Q_stricmp( token, "rotate" ))
2
  (.....)
3
g_attachment[g_numattachments].local = matrix3x4( g_vecZero, angles );
4
g_attachment[g_numattachments].flags |= STUDIO_ATTACHMENT_LOCAL;

Ой, как удобно! Прям то, что нужно.
Добавляю строчку в qc.
C++ Source Code:
$attachment "1" "A_Muzzle" 0 0 0 rotate 0 0 -90

На выходе получаю такую картинку см. прикрепленный скриншот.

А вот в игре я получаю кукиш с маслом. Разбираюсь.
XashXT, CStudioModelRenderer::ClearInstanceData
C++ Source Code:
1
// setup attachment names
2
for( int i = 0; i < Q_min( MAXSTUDIOATTACHMENTS, m_pStudioHeader->numattachments ); i++ )
3
{
4
  Q_strncpy( att[i].name, pattachment[i].name, sizeof( att[0].name ) );
5
  att[i].local.Identity();
6
  att[i].local.SetOrigin( pattachment[i].org );
7
}

То есть все раз и обнулилось.
Вот только проблема в том, что если закомментить строчку с Identity - ничего вообще не работает. att[i].local становится не инициализированной. То есть где-то на входе все затирается уже в XashXT. А так по сути все должно работать.

UPDATE:

Неужели починилось? Хех мда...
Теперь я получаю то, что хотел.
C++ Source Code:
1
// setup attachment names
2
for( int i = 0; i < Q_min( MAXSTUDIOATTACHMENTS, m_pStudioHeader->numattachments ); i++ )
3
{
4
  Q_strncpy( att[i].name, pattachment[i].name, sizeof( att[0].name ) );
5
  att[i].local.Identity();
6
  att[i].local[0][0] = pattachment->vectors[0][0];
7
  att[i].local[0][1] = pattachment->vectors[0][1];
8
  att[i].local[0][2] = pattachment->vectors[0][2];
9
  att[i].local[1][0] = pattachment->vectors[1][0];
10
  att[i].local[1][1] = pattachment->vectors[1][1];
11
  att[i].local[1][2] = pattachment->vectors[1][2];
12
  att[i].local[2][0] = pattachment->vectors[2][0];
13
  att[i].local[2][1] = pattachment->vectors[2][1];
14
  att[i].local[2][2] = pattachment->vectors[2][2];
15
  att[i].local.SetOrigin( pattachment[i].org );
16
}

__________________
Мой мод на Xash


Отправлено Дядя Миша 10-08-2024 в 17:20:

Тот тутор писался задолго до создания собственного компилятора моделей.
Этот твой способ более корректен. Но учти. В большинстве моделей будет либо мусор в vectors либо нули.

Корректно делать вот так:

C++ Source Code:
1
if( FBitSet( pattachment[i].flags, STUDIO_ATTACHMENT_LOCAL ))
2
{
3
  att[i].local[0][0] = pattachment->vectors[0][0];
4
  att[i].local[0][1] = pattachment->vectors[0][1];
5
  att[i].local[0][2] = pattachment->vectors[0][2];
6
  att[i].local[1][0] = pattachment->vectors[1][0];
7
  att[i].local[1][1] = pattachment->vectors[1][1];
8
  att[i].local[1][2] = pattachment->vectors[1][2];
9
  att[i].local[2][0] = pattachment->vectors[2][0];
10
  att[i].local[2][1] = pattachment->vectors[2][1];
11
  att[i].local[2][2] = pattachment->vectors[2][2];
12
}
13
else att[i].local.Identity();
14
att[i].local.SetOrigin( pattachment[i].org );


Вот теперь будет полностью правильно.

__________________
My Projects: download page

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

Цитата:

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


Отправлено Aynekko 10-08-2024 в 17:43:

Спасибо
С некоторыми пушками почему-то проблема не ушла. Хотя, казалось бы, задаю все как надо по образцу, и вижу во вьювере нормальную картинку. С пистолетом все хорошо, с автоматом нет...

Не пойму: в компиляторе моделей там все пишется в матрицу local, внутри int Cmd_Attachment(), насколько я понял. Так почему же тут берутся какие-то vectors? Нельзя ли сразу достать local?

__________________
Мой мод на Xash


Отправлено Дядя Миша 10-08-2024 в 18:11:

Цитата:
Aynekko писал:
в компиляторе моделей там все пишется в матрицу local, внутри int Cmd_Attachment(), насколько я понял. Так почему же тут берутся какие-то vectors?

C++ Source Code:
1
typedef struct
2
{
3
  char		name[MAXSTUDIONAME];
4
  int		flags;
5
  int		bone;
6
  vec3_t		org;		// attachment position
7
  vec3_t		vectors[3];	// attachment vectors
8
} mstudioattachment_t;

Оригин поперёд векторов. При загрузке конвертятся в матрицу.

Цитата:
Aynekko писал:
Хотя, казалось бы, задаю все как надо по образцу, и вижу во вьювере нормальную картинку

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

Добавлено 10-08-2024 в 21:10:

Цитата:
Aynekko писал:
С пистолетом все хорошо, с автоматом нет...

Ну давай рассуждать логически. Ты задаешь углы 0 0 0 и получаешь идентичную матрицу, которая умножается на матрицу кости. Фактически ты получаешь углы из матрицы кости. Которую ты не контролируешь.
Таким образом чтобы получить нужные углы тебе надо от матрицы кости развернуть углы аттачмента в обратную сторону. Что совсем неудобно и некруто. Т.к. ты не знаешь, как повернута матрица кости, к которой присобаченн аттачмент. Именно поэтому я и восстанавливал направление из вектора, заданного из двух позиций - позиция кости минус позиция аттачмента. И видел как палка протягивается от кости к аттачменту. Это и есть направление. В большинстве случаев это прекрасно работает.

Добавлено 10-08-2024 в 21:11:

И не смотри что там вьювер рисует - я эту функцию никогда не тестировал. Я вообще удивлён что он там что-то рисует.

__________________
My Projects: download page

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

Цитата:

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


Отправлено Aynekko 10-08-2024 в 18:17:

Да - надо, пожалуй, попробовать этот метод с костью.

__________________
Мой мод на Xash


Временная зона GMT. Текущее время 09:16.
Показать все 9 сообщений этой темы на одной странице

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