HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Half-Life SDK (https://hlfx.ru/forum/forumdisplay.php?forumid=8)
-- [Xash3D/XashXT] смешивание анимаций. (https://hlfx.ru/forum/showthread.php?threadid=4365)
Отправлено ILZM 18-04-2014 в 06:52:
[Xash3D/XashXT] смешивание анимаций.
Добрый день!
Ответьте на и объясните, пожалуйста, некоторые вопросы:
1. Почему иногда код в движке и в моде повторяется? Например, StudioSetupBones. Код как-будто делает тоже самое.
2. Есть такой код:
C++ Source Code:
1 | if( pseqdesc->numblends > 1 ) |
5 | panim += m_pStudioHeader->numbones; |
6 | StudioCalcRotations( pos2, q2, pseqdesc, panim, f ); |
8 | float dadt = StudioEstimateInterpolant(); |
9 | s = (m_pCurrentEntity->curstate.blending[0] * dadt + m_pCurrentEntity->latched.prevblending[0] * (1.0f - dadt)) / 255.0f; |
11 | StudioSlerpBones( q, pos, q2, pos2, s ); // смешивание одной и той же анимации на одном и том же кадре с интерполянтом s? |
13 | if( pseqdesc->numblends == 4 ) |
15 | panim += m_pStudioHeader->numbones; // зачем всё время прибавлять? |
16 | StudioCalcRotations( pos3, q3, pseqdesc, panim, f ); // а эт зачем?? |
18 | panim += m_pStudioHeader->numbones; |
19 | StudioCalcRotations( pos4, q4, pseqdesc, panim, f ); |
21 | s = (m_pCurrentEntity->curstate.blending[0] * dadt + m_pCurrentEntity->latched.prevblending[0] * (1.0f - dadt)) / 255.0f; |
22 | StudioSlerpBones( q3, pos3, q4, pos4, s ); |
24 | s = (m_pCurrentEntity->curstate.blending[1] * dadt + m_pCurrentEntity->latched.prevblending[1] * (1.0f - dadt)) / 255.0f; |
25 | StudioSlerpBones( q, pos, q3, pos3, s ); |
Чё так все сложно? Ничего не понятно...
3. C++ Source Code:
1 | if( m_fDoInterp && m_pCurrentEntity->latched.sequencetime && ( m_pCurrentEntity->latched.sequencetime + 0.2f > m_clTime ) && ( m_pCurrentEntity->latched.prevsequence < m_pStudioHeader->numseq )) |
3 | static Vector pos1b[MAXSTUDIOBONES]; |
4 | static Vector4D q1b[MAXSTUDIOBONES]; |
7 | // blend from last sequence |
8 | // g-cont. blending between sequences should be done in 0.1 secs. See Xash3D cl_frame.c code for details |
9 | pseqdesc = (mstudioseqdesc_t *)((byte *)m_pStudioHeader + m_pStudioHeader->seqindex) + m_pCurrentEntity->latched.prevsequence; |
10 | panim = StudioGetAnim( m_pRenderModel, pseqdesc ); |
13 | StudioCalcRotations( pos1b, q1b, pseqdesc, panim, m_pCurrentEntity->latched.prevframe ); |
15 | if( pseqdesc->numblends > 1 ) |
17 | panim += m_pStudioHeader->numbones; |
18 | StudioCalcRotations( pos2, q2, pseqdesc, panim, m_pCurrentEntity->latched.prevframe ); |
20 | s = (m_pCurrentEntity->latched.prevseqblending[0]) / 255.0f; |
21 | StudioSlerpBones( q1b, pos1b, q2, pos2, s ); |
Цитата:
g-cont. blending between sequences should be done in 0.1 secs. See Xash3D cl_frame.c code for details
Не нашёл...
А всё это к сводится к одному вопросу: как сделать смешивание анимасый ног?
Отправлено XaeroX 18-04-2014 в 07:12:
Цитата:
ILZM писал:
Почему иногда код в движке и в моде повторяется?
Потому что мод может не экспортировать студийный интерфейс.
Цитата:
ILZM писал:
смешивание одной и той же анимации на одном и том же кадре с интерполянтом s?
Ты не видишь, что там разные переменные?Цитата:
ILZM писал:
// зачем всё время прибавлять?
Про арифметику указателей читал? 
__________________
Отправлено Дядя Миша 18-04-2014 в 08:11:
Цитата:
ILZM писал:
Почему иногда код в движке и в моде повторяется? Например, StudioSetupBones. Код как-будто делает тоже самое.
Ну это ты Вальву спроси, почему они допускают существование модов с отсутствующим экспортом HUD_GetStudioModelInterface. например Opposing Force. Иными словами, если отрезать клиентский вариант, то движок включит свой, точно такой же. Просто это редко случается.
Цитата:
ILZM писал:
// смешивание одной и той же анимации на одном и том же кадре с интерполянтом s?
Ну вообще-то там несколько анимаций в одной. Для того же барника, который целится, там анимация "пистолет поднят" и "пистолет опущен".
При смешивании в равных пропорциях получается "пистолет по центру".
Цитата:
ILZM писал:
// зачем всё время прибавлять?
ну очевидно чтобы получить доступ к следующей позе. Этож массив
[положение костей]
[положение костей]
[положение костей]
вот мы по нему двигаемся.
Цитата:
ILZM писал:
// а эт зачем??
вот как раз, чтобы посчитать из относительных смещений и углов эйлера - кватернионы и реальную позицию, а потом переконвертить их в матрицы костей.
Цитата:
ILZM писал:
Не нашёл...
CL_UpdateStudioVars
C++ Source Code:
1 | // sequence has changed, hold the previous sequence info |
2 | if( newstate->sequence != ent->curstate.sequence ) |
4 | if( ent->index > 0 && ent->index <= cl.maxclients ) |
5 | ent->latched.sequencetime = ent->curstate.animtime + 0.01f; |
6 | else ent->latched.sequencetime = ent->curstate.animtime + 0.1f; |
8 | // save current blends to right lerping from last sequence |
9 | for( i = 0; i < 2; i++ ) |
10 | ent->latched.prevseqblending[i] = ent->curstate.blending[i]; |
11 | ent->latched.prevsequence = ent->curstate.sequence; // save old sequence |
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено ILZM 24-04-2014 в 06:17:
Теперь более менее всё понятно.
C++ Source Code:
1 | if( pseqdesc->numblends > 1 ) |
5 | panim += m_pStudioHeader->numbones; // это итерация на следующую анимацию смешивания |
6 | StudioCalcRotations( pos2, q2, pseqdesc, panim, f ); |
8 | float dadt = StudioEstimateInterpolant(); |
9 | s = (m_pCurrentEntity->curstate.blending[0] * dadt + m_pCurrentEntity->latched.prevblending[0] * (1.0f - dadt)) / 255.0f; |
11 | StudioSlerpBones( q, pos, q2, pos2, s ); |
А зачем эти строки, если они не используются?
C++ Source Code:
1 | if( pseqdesc->numblends == 4 ) |
3 | panim += m_pStudioHeader->numbones; |
4 | StudioCalcRotations( pos3, q3, pseqdesc, panim, f ); |
6 | panim += m_pStudioHeader->numbones; |
7 | StudioCalcRotations( pos4, q4, pseqdesc, panim, f ); |
9 | s = (m_pCurrentEntity->curstate.blending[0] * dadt + m_pCurrentEntity->latched.prevblending[0] * (1.0f - dadt)) / 255.0f; |
10 | StudioSlerpBones( q3, pos3, q4, pos4, s ); |
12 | s = (m_pCurrentEntity->curstate.blending[1] * dadt + m_pCurrentEntity->latched.prevblending[1] * (1.0f - dadt)) / 255.0f; |
13 | StudioSlerpBones( q, pos, q3, pos3, s ); |
Ведь в смешивании учавствует 2 анимации, а не 4.
--------------
В ̶̶с̶в̶и̶т̶к̶а̶х̶ ̶9̶ ̶п̶у̶т̶е̶й̶ ̶н̶и̶н̶д̶з̶я̶ исходниках 9-путёвого смешивания есть функция LookupAnimation ( iSeq, iBlend ), т. е. там можно указывать под-анимацию. Это же сделано при помощи C++ Source Code:
panim += m_pStudioHeader->numbones; |
? А то самой функции не нашёл.
Отправлено Дядя Миша 24-04-2014 в 06:20:
Цитата:
ILZM писал:
Ведь в смешивании учавствует 2 анимации, а не 4.
это от моделлёра зависит. Если ты в QC укажешь 4 анимации, то будет четыре.__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено ILZM 24-04-2014 в 06:57:
Дядя Миша, лол. А что будет если для игрока сделать 4 путёвый блендинг да и ищо оставить контроллеры
Отправлено Ghoul [BB] 24-04-2014 в 07:30:
Зачем вообще тебе этот блендинг сдался, вот вопрос.
__________________
Ты топчешь мир своими ботинками,
Не замечая куда наступаешь,
А время от тебя уходит цветными картинками,
Но ты даже этого не понимаешь.
Компрометирую данные своей учётной записи.
ЛОГИН: Ghoul [BB]
ПАРОЛЬ: paladin_solo
Отправлено Ku2zoff 24-04-2014 в 08:09:
Цитата:
ILZM писал:
А что будет если для игрока сделать 4 путёвый блендинг да и ищо оставить контроллеры
Наклоны и повороты модели игрока с помощью контроллеров выглядят вырвиглазно, не зря вальва в сорсе везде, где можно, юзает 9-ти путёвый блендинг, не зря в продвинутых мультиплеерных модах под ГС он юзается.
Контроллеры хорошо годятся для рта и поворотов головы, на моделях турелей, техники и всякого такого, где можно вертеть отдельную бодигруппу. Если бонеконроллерами вертеть, к примеру, кости позвоночника, это выглядит ну очень страшно
Вообще, рендерер студиомоделек в халфе - очень классная вещь, он много чего позволяет с ними делать. Особенно приятно, что в своё время на клиенте была сделана копипаста из движка, это открывает огромный простор для модмейкеров. Тут можно и модельки к друг другу аттачить, и что-то другое к моделькам, и эффекты всякие без доступа к движковому рендереру делать, вроде светящихся в темноте полигонов на оружии. Даже фейковые зеркала а-ля Дюк Нукем делать можно (см. спирит).
Большой минус - нет нормального примера серверной настройки костей, хотя интерфейс для этого существует и заюзан всё в тех же мультиплеерных модах с 9-ти путёвым блендингом моделек игрока. Я много времени потратил на попытки написания ответной части на сервере. И до появления кое-каких исходников КС 1.6 у меня так ничего и не получалось. Я до сих пор толком не разобрался с этим механизмом, но подвижки есть, серверная часть почти соответствует клиентской. Если бы я не был гуманитарием... 
Цитата:
Ghoul [BB] писал:
Зачем вообще тебе этот блендинг сдался, вот вопрос.
Конечно, можно реализовать все эти наклоны и повороты при прицеливании бонеконтроллерами, но это будет вырвиглазно шопипец, особенно на стандартных модельках халфы. К тому же, есть ограничение на количество этих самых контроллеров.
А вообще, если уж на то пошло, то для полного счастья, нам инверсной кинематики недостаёт. Вспомните Академию Джедаев, как там ноги могут на разной высоте стоять, если одна, например, на камне, а другая просто на земле.
Сейчас Дядя Миша меня упрекнёт наверное, но хотелось бы такое в Ксаше
Лишь бы кто-нибудь эти все фичи использовал.
Цитата:
ILZM писал:
Ведь в смешивании учавствует 2 анимации, а не 4.
Тоже удивился, когда первый раз увидел. Возможно, сначала вальва планировала юзать блендинг из четырёх анимаций: 2 по вертикали и 2 по горизонтали. Но потом почему-то они сделали горизонталь бонеконтроллерами. Механизм довольно прост: определяем углы поворота энтити, а потом, соответственно этим углам, выбираем нужный бленд. То есть, блендов может быть хоть 20 штук, по одному на каждую конкретную позицию (учитывая ограничения компилятора на кол-во анимаций). Но достаточно девяти: верх-лево, верх-право, середина-лево, середина-право, низ-лево, низ-право, середина-верх, середина-центр, середина-низ. Промежуточные позиции создаются засчёт смешивания девяти базовых в определённых пропорциях.
Отправлено Дядя Миша 24-04-2014 в 11:12:
Цитата:
Ku2zoff писал:
А вообще, если уж на то пошло, то для полного счастья, нам инверсной кинематики недостаёт
Для реализации инверсной кинематики нам надо хранить матрицу костей отдельно, от её угла и позиции, иначе мы не сможем ничего инвертировать.
В mstudiobone_t её не запишешь, совместимость поломается. Видимо придется заводить еще одну структуру костей (копию) и использовать её, это единственный выход. Но вообще я много над этим размышляю.
Из хл2-шных моделек нам требуется не так уж и много:
-процедурная симуляция отдельных костей (jiggle bones)
-инверсная кинематика
-аттач вертекса к нескольким костям
вот вроде бы и всё. Больше я в хл2-шных модельках ничего интересного не обнаружил. Если, вы знаете что-то еще - напишите сюда.__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено ILZM 24-04-2014 в 15:19:
А как это нога на выступе просчитывается?
И ещё кто-нибудь знает или видел код или пример продвинутой ходьбы, ну там влево и вправо имеют разные анимации?
Отправлено Дядя Миша 24-04-2014 в 15:42:
http://ru.wikipedia.org/wiki/Инверсная_кинематика
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено ILZM 24-04-2014 в 19:01:
Дядя Миша, складывание анимаций, например. Вздрагивание от боли реализовано складыванием анимаций. http://www.youtube.com/watch?v=YJHuyjrB0FU, ну и сразу косяк с ними http://www.youtube.com/watch?v=rUOvaSvpV94.
Ku2zoff, http://www.hlfx.ru/forum/showthread...=&threadid=4374 классный тутор!) Но меня смущает это
C++ Source Code:
1 | extern "C" _declspec(dllexport) int Server_GetBlendingInterface( int version, sv_blending_interface_t **pinterface, server_studio_api_t *pstudio, float ***rotationmatrix, float ****bonetransform ) |
3 | if (version != SV_BLENDING_INTERFACE_VERSION) |
6 | *pinterface = &sv_blending; |
8 | IEngineStudio.Mem_Calloc = pstudio->Mem_Calloc; |
9 | IEngineStudio.Cache_Check = pstudio->Cache_Check; |
10 | IEngineStudio.LoadCacheFile = pstudio->LoadCacheFile; |
11 | IEngineStudio.Mod_Extradata = pstudio->Mod_Extradata; |
13 | g_pRotationMatrix = (float (*)[3][4])rotationmatrix; |
14 | g_pBoneTransform = (float (*)[MAXSTUDIOBONES][3][4])bonetransform; |
16 | ALERT(at_console, "Server_GetBlendingInterface exported.\n"); |
Как вынести функцию в Xash'e? Просто же?