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

Дата регистрации: Jun 2016
Проживает: г. Подольск, Россия
Сообщений: 1036
Возраст: 31

Рейтинг



Аттачменты на вьюмодели и их 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

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

Старое сообщение 10-08-2024 10:48
- За что?
 Дядя Миша
racing for fish

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

Рейтинг



Референсная статья: 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'

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

Старое сообщение 10-08-2024 11:45
-
Aynekko
Маппер

Дата регистрации: Jun 2016
Проживает: г. Подольск, Россия
Сообщений: 1036
Возраст: 31

Рейтинг



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

__________________
Мой мод на Xash

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

Старое сообщение 10-08-2024 12:21
- За что?
 Дядя Миша
racing for fish

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

Рейтинг



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

__________________
My Projects: download page

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

Цитата:

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

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

Старое сообщение 10-08-2024 13:39
-
Aynekko
Маппер

Дата регистрации: Jun 2016
Проживает: г. Подольск, Россия
Сообщений: 1036
Возраст: 31

Рейтинг



Ну все, держите меня семеро
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
}

[ Вложение ]
Безымянный.jpg

__________________
Мой мод на Xash

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

Старое сообщение 10-08-2024 16:46
- За что?
 Дядя Миша
racing for fish

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

Рейтинг



Тот тутор писался задолго до создания собственного компилятора моделей.
Этот твой способ более корректен. Но учти. В большинстве моделей будет либо мусор в 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'

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

Старое сообщение 10-08-2024 17:20
-
Aynekko
Маппер

Дата регистрации: Jun 2016
Проживает: г. Подольск, Россия
Сообщений: 1036
Возраст: 31

Рейтинг



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

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

__________________
Мой мод на Xash

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

Старое сообщение 10-08-2024 17:43
- За что?
 Дядя Миша
racing for fish

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

Рейтинг



Цитата:
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'

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

Старое сообщение 10-08-2024 18:11
-
Aynekko
Маппер

Дата регистрации: Jun 2016
Проживает: г. Подольск, Россия
Сообщений: 1036
Возраст: 31

Рейтинг



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

__________________
Мой мод на Xash

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

Старое сообщение 10-08-2024 18:17
- За что?
Тема: (Опционально)
Ваш ответ:



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


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

Временная зона GMT. Текущее время 04:28. Новая тема    Ответить
  Предыдущая тема   Следующая тема
HLFX.Ru Forum HLFX.Ru Forum > Теория и практика > Half-Life SDK > Аттачменты на вьюмодели и их angles
Версия для печати | Отправить тему по E-Mail | Подписаться на эту тему

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

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

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

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