Давно у меня не было вопросов, которые я бы не сумел решить самостоятельно.
Но сейчас в ступоре.
У меня XashXT. Получаю angles аттачмента вьюмодели вот таким образом:
Для нужного мне результата опытным путем выяснил, что мне нужно, чтобы полученный вектор был равен (0, 90, 0) в состоянии покоя (анимация оружия idle). Числа округленные, там не 90, а 89.86785, суть примерно такая. У меня есть 2 оружия, у которых так и получается.
Но большинство остальных оружий выдают ахинею - например (-50, -90, -180) или (0, -90, 90).
Как задать эти angles аттачментов, чтобы они были как мне нужно? Я пробовал редактировать qc: менял положение аттачмента и менял кость, к которой он прикреплен. Но на выходе координаты не менялись.
И я не понимаю, каким образом они вообще высчитываются.
Спасибо, это более понятно.
Я пользуюсь праймовским компилятором, что на базе п2, там для аттачментов есть токены absolute и rotate, но что-то они мне пока не помогли. Посмотрел через исходники как их правильно задавать но все без толку.
Попробую по статье или еще как-нибудь.
Ну все, держите меня семеро
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.
То есть все раз и обнулилось.
Вот только проблема в том, что если закомментить строчку с 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++ )
Тот тутор писался задолго до создания собственного компилятора моделей.
Этот твой способ более корректен. Но учти. В большинстве моделей будет либо мусор в vectors либо нули.
Спасибо
С некоторыми пушками почему-то проблема не ушла. Хотя, казалось бы, задаю все как надо по образцу, и вижу во вьювере нормальную картинку. С пистолетом все хорошо, с автоматом нет...
Не пойму: в компиляторе моделей там все пишется в матрицу local, внутри int Cmd_Attachment(), насколько я понял. Так почему же тут берутся какие-то vectors? Нельзя ли сразу достать local?
Aynekko писал: в компиляторе моделей там все пишется в матрицу local, внутри int Cmd_Attachment(), насколько я понял. Так почему же тут берутся какие-то vectors?
C++ Source Code:
1
typedefstruct
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:
И не смотри что там вьювер рисует - я эту функцию никогда не тестировал. Я вообще удивлён что он там что-то рисует.