HLFX.Ru Forum
профиль •  правила •  регистрация •  календарь •  народ •  FAQ •  поиск •  новое •  сутки •  главная •  выход  
HLFX.Ru Forum HLFX.Ru Forum > Теория и практика > Half-Life SDK > (Help!) Сдвиг камеры при приземлении как в CS:GO
Для ксаш-мода, кодинг
Страницы (2): [1] 2 »   Предыдущая тема   Следующая тема
Автор
Тема Новая тема    Ответить
Aynekko
Маппер

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

Рейтинг



Question (Help!) Сдвиг камеры при приземлении как в CS:GO

Привет всем! Хотел запостить в нубских вопросах, но, думаю, лучше создать отдельную тему.
Наверняка все видели анимацию приземления в csgo, когда вид от первого лица плавно и слегка пружинит вниз и возвращается обратно. Честно сказать, парюсь уже недели две, если не больше. До последнего не хотел создавать тему и пытался разобраться сам, но ничего не выходит. Надеюсь на какую-нибудь помощь. В общем, вот сам код из исходников csgo, который я нарыл:

C++ Source Code:
1
void CBasePlayer::CalcViewBob( Vector& eyeOrigin )
2
{
3
#if defined( CSTRIKE15 )
4
#if defined( CLIENT_DLL )
5
  if ( cl_use_new_headbob.GetBool() == false )
6
    return;
7
 
8
  Vector vecBaseEyePosition = eyeOrigin;
9
 
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 );
14
 
15
  if ( flFallVel <= 0.1f && flOldFallVel > 10.0f && flOldFallVel <= PLAYER_FATAL_FALL_SPEED && m_Local.m_bInLanding == false )
16
  {
17
    m_Local.m_bInLanding = true;
18
    m_Local.m_flLandingTime = gpGlobals->curtime;
19
  }
20
 
21
  // don't bob the view right now
22
  /*
23
  		const float flMaxSpeed = sv_maxspeed.GetFloat();
24
  		float flSpeedFactor;
25
  		*/
26
 
27
  if ( m_Local.m_bInLanding == true )
28
  {
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 );
32
 
33
    float flDipAmount = (1 / flOldFallVel) * 0.1f;
34
 
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 ) );
40
 
41
    if ( temp.z > dipHighOffset )
42
    {
43
      temp.z = dipHighOffset;
44
      m_Local.m_bInLanding = false;
45
    }
46
    eyeOrigin.z -= ( dipHighOffset - temp.z );
47
    //SetViewOffset( temp );
48
  }
49
  else
50
  {
51
    // don't bob the view right now
52
    /*
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());
56
    			*/
57
  }
58
 
59
  // stop when our eyes get back to default
60
  if ( m_Local.m_bInLanding == true && ( (eyeOrigin.z - 0.001f) >= vecBaseEyePosition.z )  )
61
  {
62
    m_Local.m_bInLanding = false;
63
  }
64
 
65
  if ( m_Local.m_bInLanding == false  )
66
  {
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;
69
  }
70
#endif
71
#endif
72
}


Куда вставить этот код (конечно же не в этом виде!) я нашел - это в функцию 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:
1
float duckFraction;
2
float time;
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)
6
 
7
Vector vecBaseEyePosition = pmove->view_ofs[2];  // вместо eyeOrigin, она же позиция глаз, видимо… поставил view_ofs. Ставил " = VEC_VIEW ", но тоже не сработало
8
 
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 );
13
 
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 по-умолчанию, так что задал перед функцией
16
{
17
  m_bInLanding = true;
18
  m_flLandingTime = pmove->time;  // было m_Local.m_flLandingTime = gpGlobals->curtime;
19
}
20
 
21
// don't bob the view right now
22
/*
23
		const float flMaxSpeed = sv_maxspeed.GetFloat();
24
		float flSpeedFactor;
25
		*/
26
 
27
if ( m_bInLanding == true )
28
{
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 );
32
 
33
  float flDipAmount = (1 / flOldFallVel) * 0.1f;
34
 
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 ) );
41
 
42
  if ( temp.z > dipHighOffset )
43
  {
44
    temp.z = dipHighOffset;
45
    m_bInLanding = false;
46
  }
47
  pmove->view_ofs[2] -= ( dipHighOffset - temp.z );   // было eyeOrigin.z -= ( dipHighOffset - temp.z );
48
  //SetViewOffset( temp );
49
}
50
else
51
{
52
  // don't bob the view right now
53
  /*
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());
57
  			*/
58
}
59
 
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 )  )
63
{
64
  m_bInLanding = false;
65
}
66
 
67
if ( m_bInLanding == false  )
68
{
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;
71
}


Компилит, но результата ноль, то есть вообще ничего не происходит. Надо полагать и не должно, т.к. я вообще не уверен, что я тут наделал (но надеялся, эх ).

В общем, ниасилил. Спасибо, что прочитали, может было интересно. Если кто может помочь адаптировать функцию или подсказать, как это сделать проще, буду очень благодарен. Сам в матане/линале не шарю, а уж в кодинге…слишком сложно оказалось. Вот регенерацию хп из Portal стащить получилось, а тут никак. Ну там и строчек-то совсем мало было…

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

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

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

Рейтинг



Можно по аналогии с кодом сглаживания ступенек в 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'

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

Старое сообщение 03-08-2020 18:46
-
Aynekko
Маппер

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

Рейтинг



Это я нашел, кажется

C++ Source Code:
1
if( !pparams->smoothing && pparams->onground && pparams->simorg[2] - oldz > 0.0f )
2
{
3
  float steptime;
4
 
5
  steptime = pparams->time - lasttime;
6
  if( steptime < 0 ) steptime = 0;
7
 
8
  oldz += steptime * 150.0f;
9
 
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;
14
 
15
  pparams->vieworg[2] += oldz - pparams->simorg[2];
16
}
17
else
18
{
19
  oldz = pparams->simorg[2];
20
}

Только пока не представляю, что с этим делать. К тому же, это на клиенте… попробую, поковыряюсь, конечно.

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

Старое сообщение 03-08-2020 19:31
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32188
Нанёс повреждений: 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: Записан
Сообщение: 196060

Старое сообщение 03-08-2020 19:44
-
JPEG
Житель форума

Дата регистрации: Sep 2013
Проживает: рф
Сообщений: 659

Рейтинг



абсолютно такой же прыжок есть в ку3, мб его сорцы помогут, не знаю. Есть ещё похожий эффект, не то, что нужно, но вдруг понравится:
pmove->punchangle[ 0 ] = -8; перед строкой PM_PreventMegaBunnyJumping(); и тоже самое перед строкой for (i =0; i < 2; i++) для прыжка сидя

__________________
МОЙ НОВЫЙ ПАБЛИК ПО ХЛ))

перехожу на другой двиг

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

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

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32188
Нанёс повреждений: 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: Записан
Сообщение: 196069

Старое сообщение 04-08-2020 18:19
-
Aynekko
Маппер

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

Рейтинг



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

Цитата:
Дядя Миша писал:
Ну если совсем по ламерски - подержать пару кадров присед при касании земли и отпустить.

Во-во, я именно так и хотел сделать. Ток не раздуплю как пока что

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

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

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

Рейтинг



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

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

Старое сообщение 04-08-2020 19:19
-
Aynekko
Маппер

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

Рейтинг



CG_OffsetFirstPersonView разве не оно?

Добавлено 05-08-2020 в 00:15:

Итак, я все-таки сделал это. Все-таки заставил работать код приседания, при этом я все равно не понимаю до конца, как он работает.
В общем, результат на видео.
https://youtu.be/FCMkUrvSB9M
Я там еще нажимал в паре мест CTRL, проверял на застревания, но вроде все норм. Хочется поправить одну-единственную вещь здесь: просед слишком низкий, может у кого есть идея, как уменьшить его? Сделать не таким явным и более коротким, как в csgo.
Вот сам код, который заработал:

C++ Source Code:
1
int i;
2
pmove->bInDuck    = true;
3
 
4
if ( pmove->bInDuck )
5
{
6
  if ( ( (float)pmove->flDuckTime / 500.0 <= ( 1.0 - TIME_TO_DUCK ) ) || ( pmove->onground == -1 ) )
7
  {
8
    pmove->usehull = 1;
9
    pmove->flags |= FL_DUCKING;
10
    pmove->bInDuck = false;
11
 
12
    if ( pmove->onground != -1 )
13
    {
14
      for ( i = 0; i < 3; i++ )
15
      {
16
        pmove->origin[i] -= 0.5 * ( pmove->player_mins[1][i] - pmove->player_mins[0][i] );
17
      }
18
      PM_FixPlayerCrouchStuck( STUCK_MOVEUP );
19
      PM_CatagorizePosition();
20
    }
21
  }
22
  else
23
  {
24
    //
25
  }
26
}


Вставлять его нужно в PM_CheckFalling после строчки
C++ Source Code:
// Knock the screen around a little bit, temporary effect


Кстати, имейте в виду, что у меня стоит threshold поменьше, поэтому у меня функция активируется при любом прыжке. Вам наверное придется спрыгнуть с большей высоты.
Повторюсь, хотелось бы уменьшить эффект немного, сделать его не таким явным. В остальном это то, что нужно! Я копал в сторону хуллов, менял pmove->origin (добавил *0.5 - получился плавный эффект). Подбирал другие числа там и тут, но без изменений.
Может кому пригодится или кто доведет его до ума…

Отредактировано Aynekko 04-08-2020 в 21:18

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

Старое сообщение 04-08-2020 21:15
- За что?
Aynekko
Маппер

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

Рейтинг



Копаюсь дальше. Вариант выше не прокатит. Выявил баг, что при урона не будет при приземлении с любой высоты.
В общем, решил делать "по-нормальному". Залез в r_view.cpp на ксаше и в исходники quake 3.
Пока ничего не получается. Подскажите хоть, я вообще в правильном направлении иду или нет? Я очень слабо понимаю, что я вообще тут делаю.

Вот код, который я нашел в quake 3:

C++ Source Code:
1
// add fall height
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;
10
}


Попробовал переписать под себя, получилось такое:
C++ Source Code:
1
void V_LandDip( struct ref_params_s *pparams )
2
{
3
#define LAND_DEFLECT_TIME 150
4
#define LAND_RETURN_TIME 300
5
  float delta;
6
  float landtime = 0;
7
  float f;
8
  float landChange = -8;
9
 
10
  Vector    vel;
11
  VectorCopy( pparams->simvel, vel );
12
  vel[0] = 0;
13
  vel[1] = 0;
14
 
15
  landtime = pparams->time;
16
 
17
  delta = pparams->time - landtime;
18
  if ( delta < LAND_DEFLECT_TIME )
19
  {
20
    f = delta / LAND_DEFLECT_TIME;
21
    pparams->simorg[2] += landChange * f;
22
  }
23
  else if ( delta < LAND_DEFLECT_TIME + LAND_RETURN_TIME )
24
  {
25
    delta -= LAND_DEFLECT_TIME;
26
    f = 1.0 - ( delta / LAND_RETURN_TIME );
27
    pparams->simorg[2] += landChange * f;
28
  }
29
}


Ну и добавил строчку V_LandDip( pparams ); в конец функции V_CalcFirstPersonRefdef. Ноль изменений (как и ожидалось, хех). Туда хоть иду-то?)

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

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

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

Рейтинг



C++ Source Code:
static float landtime;


Добавлено 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'

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

Старое сообщение 16-08-2020 19:37
-
Aynekko
Маппер

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

Рейтинг



Ну вот я уже где-то месяц ковыряюсь наверное, все кодеры заняты (я даже не забесплатно предлагал), да и найти их не так-то просто, а тут так, мелкая хотелка.

static float я увидел на smooth stairs функции, только не знаю в чем разница, надо книги читать походу. Просто меня кодинг особо не интересует как класс, но кто еще будет фишки запиливать? Хоть какие-то туторы есть, и тому рад.
И математики много, тоже засада…

P.S. если есть желающие помочь, пишите в приват, в долгу не останусь

Отредактировано Aynekko 16-08-2020 в 20:21

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

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

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

Рейтинг



то что объявлено внутри функции теряет свои значения по её завершению, а 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'

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

Старое сообщение 16-08-2020 21:02
-
Aynekko
Маппер

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

Рейтинг



Цитата:
Дядя Миша писал:
когда игрок в воздухе - присваиваем время в переменную landtime. Коснулся земли - начинаем считать разность

А как определять, когда он в воздухе, а когда нет? Пока получилось так, результата опять же нет
C++ Source Code:
1
void V_LandDip( struct ref_params_s *pparams)
2
{
3
#define LAND_DEFLECT_TIME 150
4
#define LAND_RETURN_TIME 300
5
  float delta;
6
  static float landtime;
7
  float f;
8
  float landChange = -8;
9
 
10
  if( pparams->simvel[2] > 0 )
11
  {
12
    landtime = pparams->time;
13
 
14
    if (pparams->onground && pparams->time > landtime )
15
    {
16
 
17
      delta = pparams->time - landtime;
18
      if ( delta < LAND_DEFLECT_TIME )
19
      {
20
        f = delta / LAND_DEFLECT_TIME;
21
        pparams->vieworg[2] += landChange * f;
22
      }
23
      else if ( delta < LAND_DEFLECT_TIME + LAND_RETURN_TIME )
24
      {
25
        delta -= LAND_DEFLECT_TIME;
26
        f = 1.0 - ( delta / LAND_RETURN_TIME );
27
        pparams->vieworg[2] += landChange * f;
28
      }
29
    }
30
  }
31
}

Я не уверен, что такое simvel, но как мне показалось это скорость ([2] - по вертикали). Значит если игрок летит вниз, начинаем считать. А потом когда onground, то выполняется функция.

В кваке 3 там вообще эта функция, начиная с дельты, просто лежит в FirstPersonOffset. Как они определили, что игрок приземлился, вообще не понимаю. Есть случай EV_FALL_SHORT, больше ничего не нарыл.

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

Старое сообщение 17-08-2020 11:20
- За что?
Crystallize
Житель форума

Дата регистрации: Jul 2007
Проживает: Новосибирск
Сообщений: 4415
Возраст: 34

Рейтинг



Цитата:
Aynekko писал:
А как определять, когда он в воздухе, а когда нет?

флаг FL_ONGROUND, я правда не знаю как оно на клиенте

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

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



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


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

Временная зона GMT. Текущее время 14:18. Новая тема    Ответить
Страницы (2): [1] 2 »   Предыдущая тема   Следующая тема
HLFX.Ru Forum HLFX.Ru Forum > Теория и практика > Half-Life SDK > (Help!) Сдвиг камеры при приземлении как в CS:GO
Для ксаш-мода, кодинг
Версия для печати | Отправить тему по E-Mail | Подписаться на эту тему

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

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

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

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