HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Half-Life SDK (https://hlfx.ru/forum/forumdisplay.php?forumid=8)
-- (Help!) Сдвиг камеры при приземлении как в CS:GO (https://hlfx.ru/forum/showthread.php?threadid=5542)
Отправлено Aynekko 03-08-2020 в 16:32:
(Help!) Сдвиг камеры при приземлении как в CS:GO
Привет всем! Хотел запостить в нубских вопросах, но, думаю, лучше создать отдельную тему.
Наверняка все видели анимацию приземления в csgo, когда вид от первого лица плавно и слегка пружинит вниз и возвращается обратно. Честно сказать, парюсь уже недели две, если не больше. До последнего не хотел создавать тему и пытался разобраться сам, но ничего не выходит. Надеюсь на какую-нибудь помощь. В общем, вот сам код из исходников csgo, который я нарыл:
C++ Source Code:
1 | void CBasePlayer::CalcViewBob( Vector& eyeOrigin ) |
3 | #if defined( CSTRIKE15 ) |
4 | #if defined( CLIENT_DLL ) |
5 | if ( cl_use_new_headbob.GetBool() == false ) |
8 | Vector vecBaseEyePosition = eyeOrigin; |
10 | // if we just landed, dip the player's view |
11 | float flOldFallVel = m_Local.m_flOldFallVelocity; |
12 | float flFallVel = m_Local.m_flFallVelocity; |
13 | //Msg("Fall Velocity: %f\n", flFallVel ); |
15 | if ( flFallVel <= 0.1f && flOldFallVel > 10.0f && flOldFallVel <= PLAYER_FATAL_FALL_SPEED && m_Local.m_bInLanding == false ) |
17 | m_Local.m_bInLanding = true; |
18 | m_Local.m_flLandingTime = gpGlobals->curtime; |
21 | // don't bob the view right now |
23 | const float flMaxSpeed = sv_maxspeed.GetFloat(); |
27 | if ( m_Local.m_bInLanding == true ) |
29 | float landseconds = MAX(gpGlobals->curtime - m_Local.m_flLandingTime, 0.0f); |
30 | float landFraction = SimpleSpline( landseconds / 0.25f ); |
31 | clamp( landFraction, 0.0f, 1.0f ); |
33 | float flDipAmount = (1 / flOldFallVel) * 0.1f; |
35 | int dipHighOffset = 64; |
36 | int dipLowOffset = dipHighOffset - cl_headbob_land_dip_amt.GetInt(); |
37 | Vector temp = GetViewOffset(); |
38 | temp.z = ( ( dipLowOffset - flDipAmount ) * landFraction ) + |
39 | ( dipHighOffset * ( 1 - landFraction ) ); |
41 | if ( temp.z > dipHighOffset ) |
43 | temp.z = dipHighOffset; |
44 | m_Local.m_bInLanding = false; |
46 | eyeOrigin.z -= ( dipHighOffset - temp.z ); |
47 | //SetViewOffset( temp ); |
51 | // don't bob the view right now |
53 | flSpeedFactor = GetAbsVelocity().Length() / flMaxSpeed; |
54 | clamp( flSpeedFactor, 0.0f, 1.0f ); |
55 | eyeOrigin.z += flSpeedFactor * (sin(gpGlobals->curtime * cl_headbob_freq.GetFloat() ) * cl_headbob_amp.GetFloat()); |
59 | // stop when our eyes get back to default |
60 | if ( m_Local.m_bInLanding == true && ( (eyeOrigin.z - 0.001f) >= vecBaseEyePosition.z ) ) |
62 | m_Local.m_bInLanding = false; |
65 | if ( m_Local.m_bInLanding == false ) |
67 | // Set the old velocity to the new velocity, we check next frame to see if we hit the ground |
68 | m_Local.m_flOldFallVelocity = m_Local.m_flFallVelocity; |
Куда вставить этот код (конечно же не в этом виде!) я нашел - это в функцию PM_CheckFalling в playermove.cpp на сервере.
Изначально я сделал все проще и одной строчкой:
C++ Source Code:
pmove->punchangle.x = pmove->flFallVelocity * 0.005; |
Ну такое, ага… Слишком резкое, и наклон идет не вертикальный, а вперед. В целом, вполне сошло бы, но что-то как-то не. Я даже пытался менять функцию punch, делая ее плавнее, но тогда "сломал" другие места, где она используется. Принял решение копать в другую сторону. Мне бы подошла функция из PM_Duck. Потому что если в ксаш-моде быстро нажать и отпустить приседание, камера плавно спускается вниз и тут же плавно возвращается. Но там все завязано, как я понял, на проверке "нажато ли приседание в текущем кадре, если нет - возврат".
Дальше идет полное ламерство. Все изменения, как уже сказал, делал в конце PM_CheckFalling - там, где стоял мой простой punchangle. Не знаю, корректно ли это, но я хотя бы уверен, что именно в этом месте выполняется код после приземления.
Итак: есть, значит, такая штука в коде, как pmove->view_ofs[2], которая отвечает за высоту взгляда игрока. Я логично рассудил, что мне "всего лишь" надо сделать, чтобы это значение после приземления плавно спускалось от дефолтного VEC_VIEW и, достигнув определенного значения, так же плавно вернулось обратно. В итоге я попробовал написать вот такую фигную:
C++ Source Code:
pmove->view_ofs[2] -= 3 * pmove->frametime; |
Полный бред, теперь я уже знаю (значение 3 для эксперимента было, может и не 3 там было, уже не суть; по итогу просто после каждого призмеления взгляд просто спускался ниже и ниже. Но, думаю, что начал копать в правильном направлении, т.к. все плавные изменения чего-либо в коде всегда были завязаны на frametime или time, как я заметил.
Пытался еще сделать проверку, что при достижении какого-то уровня взгляда он бы возвращался к VEC_VIEW. После этого вообще ничего не менялось, т.к. все условия, видимо, выполнялись разом. Я рассчитывал увидеть отскок, хотя бы резкий. Увы.
Дальше я пытался завести временную переменную, и как-то отсчитывать от нее, но опять ничего не получилось. Либо изменений не было, либо камера просто резко смещалась вниз, ни о какой плавности речи не было.
Дальше я снова вернулся к коду приседания и попытался как-то впаять эту плавность к себе в PM_CheckFalling:
C++ Source Code:
3 | float fMore = (VEC_DUCK_HULL_MIN - VEC_HULL_MIN); |
4 | time = max( 0.0, ( 1.0 - (float)pmove->flDuckTime / 1000.0 ) ); |
5 | duckFraction = PM_SplineFraction( time, (1.0/TIME_TO_DUCK) ); |
6 | pmove->view_ofs[2] = ((VEC_DUCK_VIEW - fMore ) * duckFraction) + (VEC_VIEW * (1-duckFraction)); |
Теперь при приземлении взгляд резко уходит вертикально вверх. Дальше уже ничего не вышло, либо ломалось все, либо так же взгляд уходил вверх.
Ну а дальше будет полный анекдот, можете просто посмеяться. Решил "адаптировать" функцию из csgo, прям копипастнул и отредактировал. С комментами.
Разумеется, ничего не получилось, кто бы мог подумать.
C++ Source Code:
1 | #define clamp(a,b,c) (a = min(max(a, b), c)) // скопипастил сюда, иначе кламп не работал |
2 | float m_flFallVelocity = pmove->flFallVelocity; |
3 | float m_flOldFallVelocity = 0.0f; // взял из playerlocaldata.h (csgo) |
4 | bool m_bInLanding = false; // взял из playerlocaldata.h (csgo) |
5 | float m_flLandingTime = -1.0f; // взял из playerlocaldata.h (csgo) |
7 | Vector vecBaseEyePosition = pmove->view_ofs[2]; // вместо eyeOrigin, она же позиция глаз, видимо… поставил view_ofs. Ставил " = VEC_VIEW ", но тоже не сработало |
9 | // if we just landed, dip the player's view |
10 | float flOldFallVel = m_flOldFallVelocity; // m_Local.m_flOldFallVelocity; что такое м_локал, точно выяснить не удалось… поэтому решил переименовать так |
11 | float flFallVel = m_flFallVelocity; |
12 | //Msg("Fall Velocity: %f\n", flFallVel ); |
14 | if ( flFallVel <= 0.1f && flOldFallVel > 10.0f && flOldFallVel <= PLAYER_FATAL_FALL_SPEED && m_bInLanding == false ) |
15 | // m_Local.m_bInLanding == false - это вообще шо? в playerlocaldata.h оно было false по-умолчанию, так что задал перед функцией |
18 | m_flLandingTime = pmove->time; // было m_Local.m_flLandingTime = gpGlobals->curtime; |
21 | // don't bob the view right now |
23 | const float flMaxSpeed = sv_maxspeed.GetFloat(); |
27 | if ( m_bInLanding == true ) |
29 | float landseconds = max(pmove->time - m_flLandingTime, 0.0f); // было MAX(gpGlobals->curtime - m_Local.m_flLandingTime, 0.0f); |
30 | float landFraction = SimpleSpline( landseconds / 0.25f ); |
31 | clamp( landFraction, 0.0f, 1.0f ); |
33 | float flDipAmount = (1 / flOldFallVel) * 0.1f; |
35 | int dipHighOffset = 64; |
36 | int dipLowOffset = dipHighOffset - 4; |
37 | // было dipHighOffset - cl_headbob_land_dip_amt.GetInt(); - удалось выяснить, что значение cl_headbob--- равно 4 по-умолчанию |
38 | Vector temp = pmove->view_ofs[2]; // было Vector temp = GetViewOffset(); |
39 | temp.z = ( ( dipLowOffset - flDipAmount ) * landFraction ) + |
40 | ( dipHighOffset * ( 1 - landFraction ) ); |
42 | if ( temp.z > dipHighOffset ) |
44 | temp.z = dipHighOffset; |
47 | pmove->view_ofs[2] -= ( dipHighOffset - temp.z ); // было eyeOrigin.z -= ( dipHighOffset - temp.z ); |
48 | //SetViewOffset( temp ); |
52 | // don't bob the view right now |
54 | flSpeedFactor = GetAbsVelocity().Length() / flMaxSpeed; |
55 | clamp( flSpeedFactor, 0.0f, 1.0f ); |
56 | eyeOrigin.z += flSpeedFactor * (sin(gpGlobals->curtime * cl_headbob_freq.GetFloat() ) * cl_headbob_amp.GetFloat()); |
60 | // stop when our eyes get back to default |
61 | if ( m_bInLanding == true && ( (pmove->view_ofs[2] - 0.001f) >= VEC_VIEW ) ) |
62 | // было if ( m_Local.m_bInLanding == true && ( (eyeOrigin.z - 0.001f) >= vecBaseEyePosition.z ) ) |
67 | if ( m_bInLanding == false ) |
69 | // Set the old velocity to the new velocity, we check next frame to see if we hit the ground |
70 | m_flOldFallVelocity = m_flFallVelocity; |
Компилит, но результата ноль, то есть вообще ничего не происходит. Надо полагать и не должно, т.к. я вообще не уверен, что я тут наделал (но надеялся, эх
).
В общем, ниасилил. Спасибо, что прочитали, может было интересно. Если кто может помочь адаптировать функцию или подсказать, как это сделать проще, буду очень благодарен. Сам в матане/линале не шарю, а уж в кодинге…слишком сложно оказалось. Вот регенерацию хп из Portal стащить получилось, а тут никак. Ну там и строчек-то совсем мало было…
Отправлено Дядя Миша 03-08-2020 в 18:46:
Можно по аналогии с кодом сглаживания ступенек в view.cpp. Немного переделать.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено Aynekko 03-08-2020 в 19:31:
Это я нашел, кажется
C++ Source Code:
1 | if( !pparams->smoothing && pparams->onground && pparams->simorg[2] - oldz > 0.0f ) |
5 | steptime = pparams->time - lasttime; |
6 | if( steptime < 0 ) steptime = 0; |
8 | oldz += steptime * 150.0f; |
10 | if( oldz > pparams->simorg[2] ) |
11 | oldz = pparams->simorg[2]; |
12 | if( pparams->simorg[2] - oldz > pparams->movevars->stepsize ) |
13 | oldz = pparams->simorg[2] - pparams->movevars->stepsize; |
15 | pparams->vieworg[2] += oldz - pparams->simorg[2]; |
19 | oldz = pparams->simorg[2]; |
Только пока не представляю, что с этим делать. К тому же, это на клиенте…
попробую, поковыряюсь, конечно.
Отправлено Дядя Миша 03-08-2020 в 19:44:
такие эффекты лучше всего и делать на клиенте.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено JPEG 04-08-2020 в 17:59:
абсолютно такой же прыжок есть в ку3, мб его сорцы помогут, не знаю. Есть ещё похожий эффект, не то, что нужно, но вдруг понравится:
pmove->punchangle[ 0 ] = -8; перед строкой PM_PreventMegaBunnyJumping(); и тоже самое перед строкой for (i =0; i < 2; i++) для прыжка сидя
__________________
МОЙ НОВЫЙ ПАБЛИК ПО ХЛ))
Отправлено Дядя Миша 04-08-2020 в 18:19:
Там не пунч, там надо высоту камеры немного вниз и плавно вверх. Ну если совсем по ламерски - подержать пару кадров присед при касании земли и отпустить.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено Aynekko 04-08-2020 в 18:48:
Цитата:
JPEG писал:
абсолютно такой же прыжок есть в ку3, мб его сорцы помогут, не знаю. Есть ещё похожий эффект, не то, что нужно, но вдруг понравится:
pmove->punchangle[ 0 ] = -8; перед строкой PM_PreventMegaBunnyJumping(); и тоже самое перед строкой for (i =0; i < 2; i++) для прыжка сидя
Ага, точно, в ку3 реально есть такое. Маловероятно, что я разберусь, но уже кажись нашел этот код (офигеть там много строчек), огромное спасибо за наводку!
То, что ты второе предложил, это тот же эффект, что и при прыжке с лонгджампом, ну так себе, да
мне нужно именно плавное приземление.
В целом хотелось бы разобраться, как менять любое значение плавно. Везде, где хочется плавно поменять значение, у меня именно здесь все упирается и никогда не работает. Для примера, хочу опустить pmove->view_ofs[2] с 40 до 30. В течении 5 секунд скажем. Активируется функция и взгляд плавно идет вертикально вниз в течении этих 5 секунд. Вот как это сделать?
pmove->view_ofs[2] -= 10 * pmove->frametime это все, на что меня хватило. Оно резко спускается и все. И я даже понимаю почему, это ведь по сути одноразовое изменение. Наверное, нужны переменные и формулы, но в математике я не силен.
Добавлено 04-08-2020 в 21:48:
Цитата:
Дядя Миша писал:
Ну если совсем по ламерски - подержать пару кадров присед при касании земли и отпустить.
Во-во, я именно так и хотел сделать. Ток не раздуплю как пока что
Отправлено Дядя Миша 04-08-2020 в 19:19:
Цитата:
Aynekko писал:
но уже кажись нашел этот код (офигеть там много строчек)
Я в ку3 вчера заглянул, но навскидку не нашёл.__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено Aynekko 04-08-2020 в 21:15:
CG_OffsetFirstPersonView разве не оно?
Добавлено 05-08-2020 в 00:15:
Итак, я все-таки сделал это. Все-таки заставил работать код приседания, при этом я все равно не понимаю до конца, как он работает.
В общем, результат на видео.
https://youtu.be/FCMkUrvSB9M
Я там еще нажимал в паре мест CTRL, проверял на застревания, но вроде все норм. Хочется поправить одну-единственную вещь здесь: просед слишком низкий, может у кого есть идея, как уменьшить его? Сделать не таким явным и более коротким, как в csgo.
Вот сам код, который заработал:
C++ Source Code:
6 | if ( ( (float)pmove->flDuckTime / 500.0 <= ( 1.0 - TIME_TO_DUCK ) ) || ( pmove->onground == -1 ) ) |
9 | pmove->flags |= FL_DUCKING; |
10 | pmove->bInDuck = false; |
12 | if ( pmove->onground != -1 ) |
14 | for ( i = 0; i < 3; i++ ) |
16 | pmove->origin[i] -= 0.5 * ( pmove->player_mins[1][i] - pmove->player_mins[0][i] ); |
18 | PM_FixPlayerCrouchStuck( STUCK_MOVEUP ); |
19 | PM_CatagorizePosition(); |
Вставлять его нужно в PM_CheckFalling после строчки
C++ Source Code:
// Knock the screen around a little bit, temporary effect |
Кстати, имейте в виду, что у меня стоит threshold поменьше, поэтому у меня функция активируется при любом прыжке. Вам наверное придется спрыгнуть с большей высоты.
Повторюсь, хотелось бы уменьшить эффект немного, сделать его не таким явным. В остальном это то, что нужно! Я копал в сторону хуллов, менял pmove->origin (добавил *0.5 - получился плавный эффект). Подбирал другие числа там и тут, но без изменений.
Может кому пригодится или кто доведет его до ума…
Отправлено Aynekko 16-08-2020 в 18:13:
Копаюсь дальше. Вариант выше не прокатит. Выявил баг, что при урона не будет при приземлении с любой высоты.
В общем, решил делать "по-нормальному". Залез в r_view.cpp на ксаше и в исходники quake 3.
Пока ничего не получается. Подскажите хоть, я вообще в правильном направлении иду или нет? Я очень слабо понимаю, что я вообще тут делаю.
Вот код, который я нашел в quake 3:
C++ Source Code:
2 | delta = cg.time - cg.landTime; |
3 | if ( delta < LAND_DEFLECT_TIME ) { |
4 | f = delta / LAND_DEFLECT_TIME; |
5 | cg.refdef.vieworg[2] += cg.landChange * f; |
6 | } else if ( delta < LAND_DEFLECT_TIME + LAND_RETURN_TIME ) { |
7 | delta -= LAND_DEFLECT_TIME; |
8 | f = 1.0 - ( delta / LAND_RETURN_TIME ); |
9 | cg.refdef.vieworg[2] += cg.landChange * f; |
Попробовал переписать под себя, получилось такое:
C++ Source Code:
1 | void V_LandDip( struct ref_params_s *pparams ) |
3 | #define LAND_DEFLECT_TIME 150 |
4 | #define LAND_RETURN_TIME 300 |
11 | VectorCopy( pparams->simvel, vel ); |
15 | landtime = pparams->time; |
17 | delta = pparams->time - landtime; |
18 | if ( delta < LAND_DEFLECT_TIME ) |
20 | f = delta / LAND_DEFLECT_TIME; |
21 | pparams->simorg[2] += landChange * f; |
23 | else if ( delta < LAND_DEFLECT_TIME + LAND_RETURN_TIME ) |
25 | delta -= LAND_DEFLECT_TIME; |
26 | f = 1.0 - ( delta / LAND_RETURN_TIME ); |
27 | pparams->simorg[2] += landChange * f; |
Ну и добавил строчку V_LandDip( pparams ); в конец функции V_CalcFirstPersonRefdef. Ноль изменений (как и ожидалось, хех). Туда хоть иду-то?)
Отправлено Дядя Миша 16-08-2020 в 19:37:
C++ Source Code:
Добавлено 16-08-2020 в 22:37:
ну и да, когда удар об землю есть - прекратить добавлять landtime и считать разность. За счёт чего и происходит временной эффект.
Тупым ковырянием тут можно еще долгие годы не иметь результата.__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено Aynekko 16-08-2020 в 20:02:
Ну вот я уже где-то месяц ковыряюсь наверное, все кодеры заняты (я даже не забесплатно предлагал), да и найти их не так-то просто, а тут так, мелкая хотелка. 
static float я увидел на smooth stairs функции, только не знаю в чем разница, надо книги читать походу. Просто меня кодинг особо не интересует как класс, но кто еще будет фишки запиливать? Хоть какие-то туторы есть, и тому рад.
И математики много, тоже засада…
P.S. если есть желающие помочь, пишите в приват, в долгу не останусь
Отправлено Дядя Миша 16-08-2020 в 21:02:
то что объявлено внутри функции теряет свои значения по её завершению, а static позволяет это сохранить до следующего вызова. Ну он не совсем для этого конечно.
Там в чём смысл - когда игрок в воздухе - присваиваем время в переменную landtime. Коснулся земли - начинаем считать разность между текущим временем и тем что осталось в landtime. И так получаем возрастающее со временем значение, которое и используется для анимации высоты взгляда.
Можно и по другому сделать конечно.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено Aynekko 17-08-2020 в 11:20:
Цитата:
Дядя Миша писал:
когда игрок в воздухе - присваиваем время в переменную landtime. Коснулся земли - начинаем считать разность
А как определять, когда он в воздухе, а когда нет? Пока получилось так, результата опять же нет
C++ Source Code:
1 | void V_LandDip( struct ref_params_s *pparams) |
3 | #define LAND_DEFLECT_TIME 150 |
4 | #define LAND_RETURN_TIME 300 |
10 | if( pparams->simvel[2] > 0 ) |
12 | landtime = pparams->time; |
14 | if (pparams->onground && pparams->time > landtime ) |
17 | delta = pparams->time - landtime; |
18 | if ( delta < LAND_DEFLECT_TIME ) |
20 | f = delta / LAND_DEFLECT_TIME; |
21 | pparams->vieworg[2] += landChange * f; |
23 | else if ( delta < LAND_DEFLECT_TIME + LAND_RETURN_TIME ) |
25 | delta -= LAND_DEFLECT_TIME; |
26 | f = 1.0 - ( delta / LAND_RETURN_TIME ); |
27 | pparams->vieworg[2] += landChange * f; |
Я не уверен, что такое simvel, но как мне показалось это скорость ([2] - по вертикали). Значит если игрок летит вниз, начинаем считать. А потом когда onground, то выполняется функция.
В кваке 3 там вообще эта функция, начиная с дельты, просто лежит в FirstPersonOffset. Как они определили, что игрок приземлился, вообще не понимаю. Есть случай EV_FALL_SHORT, больше ничего не нарыл.
Отправлено Crystallize 17-08-2020 в 13:05:
Цитата:
Aynekko писал:
А как определять, когда он в воздухе, а когда нет?
флаг FL_ONGROUND, я правда не знаю как оно на клиенте
Отправлено Aynekko 17-08-2020 в 13:48:
Вот я и задал "pparams->onground"
Добавлено 17-08-2020 в 16:48:
Хых, оказывается vieworg это для моделей пушек. Сейчас вот такое:
C++ Source Code:
1 | if( pparams->simvel[2] > 0 && !pparams->onground) |
3 | landtime = pparams->time; |
6 | if (pparams->onground && pparams->time > landtime ) |
9 | delta = pparams->time - landtime; |
10 | if ( delta < LAND_DEFLECT_TIME ) |
12 | f = delta / LAND_DEFLECT_TIME; |
13 | pparams->viewangles[2] += landChange * f; |
15 | else if ( delta < LAND_DEFLECT_TIME + LAND_RETURN_TIME ) |
17 | delta -= LAND_DEFLECT_TIME; |
18 | f = 1.0 - ( delta / LAND_RETURN_TIME ); |
19 | pparams->viewangles[2] += landChange * f; |
Поставил viewangles[2]. Теперь при приземлении экран начинает меееедленно скашиваться влево. При прыжке восстанавливается резко в исходное положение, при приземлении снова начинается медленный скос. Кажется, еще чуть и я решу эту задачку
Почему-то, если ставить simorg вместо viewangles - тогда вообще ничего не происходит.
Отправлено Crystallize 17-08-2020 в 14:56:
Цитата:
Aynekko писал:
Хых, оказывается vieworg это для моделей пушек
vieworg это клиентская камера, она каждый кадр выравнивается по модельке игрока. Если я правильно помню, то клиентская пушка привязана не к камере, а к игроку. Ну в кваке так.
Отправлено Aynekko 17-08-2020 в 17:40:
Вот как. Блин. Когда стояло vieworg, пушка просто медленно уезжала вверх, в общем та же самая ситуация со скосом камеры вбок. Ничего не понимаю.
Добавлено 17-08-2020 в 20:37:
Оно заработало!
Только все равно есть баги, которые не могу понять, как отловить…помогите
Вот текущий рабочий код:
C++ Source Code:
1 | void V_LandDip( struct ref_params_s *pparams) |
3 | #define LAND_DEFLECT_TIME 0.6 //150 |
4 | #define LAND_RETURN_TIME 0.25 //300 |
10 | if( pparams->simvel[2] > 0 && !pparams->onground) |
12 | landtime = pparams->time; |
15 | if (pparams->onground && pparams->time > landtime ) |
18 | delta = pparams->time - landtime; |
19 | if ( delta < LAND_DEFLECT_TIME ) |
21 | f = delta / LAND_DEFLECT_TIME; |
22 | pparams->simorg[2] += landChange * f; |
24 | else if ( delta < LAND_DEFLECT_TIME + LAND_RETURN_TIME ) |
26 | delta -= LAND_DEFLECT_TIME; |
27 | f = 1.0 - ( delta / LAND_RETURN_TIME ); |
28 | pparams->simorg[2] += landChange * f; |
Что имею на выходе. При прыжке и приземлении, камера едет вниз и обратно - все как надо!
Проблемы:
- если спрыгивать с уступа - сдвига камеры нет.
- если запрыгнуть на высокий ящик с помощью (ctrl+space), то при приземлении на ящик камера съезжает гораздо сильнее, как будто я упал с бОльшей высоты. То есть по идее все должно быть наоборот.
Что я упустил? Я уже так близок к успеху 
Добавлено 17-08-2020 в 20:40:
Если заметили, то Deflect и Return я задал совершенно другие значения. Если оставить 150 и 300, то камера будет ехать вниз минуты две и столько же обратно (да, я проверял…).
Где-то что-то не то. Предполагаю, что в simvel проблема где-то…может задал неправильно
Отправлено Дядя Миша 17-08-2020 в 18:26:
Цитата:
Aynekko писал:
А как определять, когда он в воздухе, а когда нет?
C++ Source Code:
if( pparams->onground == -1 ) |
Цитата:
Aynekko писал:
результата опять же нет
так результат откуда возьмется, если ты совершаешь хаотичные действия?
Добавлено 17-08-2020 в 21:24:
C++ Source Code:
1 | void V_LandDip( struct ref_params_s *pparams) |
3 | #define LAND_DEFLECT_TIME 0.6 //150 |
4 | #define LAND_RETURN_TIME 0.25 //300 |
10 | if( pparams->onground == -1 ) |
12 | landtime = pparams->time; |
17 | delta = pparams->time - landtime; |
18 | if ( delta < LAND_DEFLECT_TIME ) |
20 | f = delta / LAND_DEFLECT_TIME; |
21 | pparams->simorg[2] += landChange * f; |
23 | else if ( delta < LAND_DEFLECT_TIME + LAND_RETURN_TIME ) |
25 | delta -= LAND_DEFLECT_TIME; |
26 | f = 1.0 - ( delta / LAND_RETURN_TIME ); |
27 | pparams->simorg[2] += landChange * f; |
Так попробуй, но я не проверял.
Добавлено 17-08-2020 в 21:26:
Цитата:
Aynekko писал:
Если заметили, то Deflect и Return я задал совершенно другие значения
в ку3 это милисекунды, в халфе - доли секунды. 150 это 0.15, 300 это 0.3__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено Aynekko 17-08-2020 в 18:52:
Цитата:
Дядя Миша писал:
так результат откуда возьмется, если ты совершаешь хаотичные действия?
Да, я в курсе.
Я просто констатировал факт моих экспериментов.
Цитата:
Дядя Миша писал:
Так попробуй, но я не проверял.
Спасибо большое за помощь. В принципе то же самое, что и результат в посте перед твоим, только
Цитата:
pparams->onground == -1
не работает, зато работает !pparams->onground. Но ведь это же одно и то же по сути… О.о
Осталась одна вещь. При падении даже с браша высотой один юнит, камера все равно проигрывается. Выше через пост я там поставил условие pparams->simvel[2] > 0, я там ставил еще > 50. Тогда камера дергается в полете.
Как бы так сделать, чтобы камера проигрывалась только тогда, когда скорость приземления превысила заданную. На сервере было простое условие pmove->flFallVelocity >= 50 или вроде того.
Отправлено Дядя Миша 17-08-2020 в 20:47:
Цитата:
Aynekko писал:
зато работает !pparams->onground
Код из Ксаша:
C++ Source Code:
fd->onground = (cl.local.onground != -1); |
Пля, я был уверен, что там именно номер энтити. Забыл уже.
Цитата:
Aynekko писал:
когда скорость приземления превысила заданную
simvel[2] < -XXX
попробуй там через gEngfuncs.Con_Printf посмотреть значения при падении с разной высоты. И подбери по вкусу.__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено Aynekko 17-08-2020 в 21:03:
Дядя Миша спасибо! Но, в принципе, пошаманил с циферками и можно даже и без проверки по велосити обойтись, эффект совсем ненавязчивый получился, зато интерактивности добавил будь здоров (имхо конечно). Еще и на оружие сделал. Красота.
Кстати из ксго тоже попробовал код, т.к. теперь я уже разобрался более-менее с этими временными метками и по подобию сделать оказалось не трудно.