Воскресенье, 13.10.2024, 11:22
Приветствую Вас Guest | RSS
Главная страница | Статьи | Регистрация | Вход
Меню сайта

Случайный рисунок

Категории каталога
Туториалы по маппингу (HL2) [68]
Туториалы по маппингу для Half-Life
Туториалы по текстурированию (HL2) [10]
Туторы по текстурированию для Half-Life
Туториалы по моделированию (HL2) [9]
Туторы по моделированию для Half-Life
Туториалы по программированию (HL2) [53]
Туторы по прагроммированию для Half-life
Другие туториалы (HL1 и HL2) [4]
Туторы которые не вошли в другие категории
Half-Life 2 Beta [1]
Статьи о npc и weapon в бете Half-Life 2, а так же мануалы и FAQ.
Туториалы по маппингу (HL1) [14]
Туторы по маппингу для Half-Life 1
Туториалы по текстурированию (HL1) [1]
Туторы по текстурированию для Half-Life 1
Туториалы по моделированию (HL1) [1]
Туторы по моделированию для Half-Life 1
Туториалы по программированию (HL1) [30]
Туторы по программированию для Half-Life 1

Наш опрос
Очистить ли форум от всех сообщений и начать всё с чистого листа?
Всего ответов: 563

Начало » Статьи » Туториалы по программированию (HL2)

Вид из-за плеча (Over the Shoulder View)
Этот тутор расскажет вам, как же всё-таки на движке Source, сделать вид из-за плеча biggrin

Шаг 1 - Поставить вид от третьего лица по дефолту.
Найдите и откройте in_camera.cpp, он должен находиться в client.dll файлах.
Теперь найдите каждый случай использования sv_cheats, и удалите или закомментируйте все эти строки.
Найдите последнюю функцию, и в самом конце вы должны увидеть что-то подобное void CInput::Init_Camera( void )
В этой функции добавьте m_fCameraInThirdPerson = true;
Должно получиться вот так:

Code
void CInput::Init_Camera( void )
{
  m_CameraIsOrthographic = false;
  m_fCameraInThirdPerson = true;
}

Данные действия установили вид от третьего лица стандартно, не требуя никаких телодвижений от игрока.

Шаг 2 - Создаём вид из-за плеча.
В этом шаге мы внесём необходимые изменения, для того чтобы сделать камеру с видом из-за плеча. Найдите и откройте clientmode_shared.cpp. Он также находиться в client.dll файлах.
Теперь найдите функцию void ClientModeShared::OverrideView( CViewSetup *pSetup ).
Замените всё внутри функции на:

Code
C_BasePlayer *pPlayer = C_BasePlayer::GetLocalPlayer();
if(!pPlayer)
  return;

pPlayer->OverrideView( pSetup );

if( ::input->CAM_IsThirdPerson() )
{
  Vector camForward, camRight, camUp;
   
  AngleVectors( pPlayer->EyeAngles(), &camForward, &camRight, &camUp );
   
  trace_t tr, tr2;
  Vector vecStart, vecStop, vecDirection, vecSetDirection;  
  static float camCurrentY;  
  static float camCurrentX=16.0f;  
  float camDelta=0.5f;
  vecStart=pSetup->origin;

  AngleVectors(pPlayer->EyeAngles(), &vecDirection);  
   
  vecSetDirection.Init(0,0,1.0f);
  vecDirection=vecDirection.Cross(vecSetDirection);
  vecStop = vecStart + vecDirection*52.0f;

  UTIL_TraceLine( vecStart, vecStop, MASK_ALL, pPlayer, COLLISION_GROUP_NONE, &tr );
   
  if (tr.fraction == 1) //достаточно ли мы далеки чтобы не задеть стену камерой
  {
  if(camCurrentX < 16.0f)
  camCurrentX +=camDelta;
  if(camCurrentX >16.0f)
  camCurrentX=16.0f;
  VectorMA( pSetup->origin, camCurrentX, camRight, pSetup->origin); //установка правильного смещения
  VectorMA( pSetup->origin, 16.0f, camUp, pSetup->origin);
  vecStart=tr.endpos;
  }
  else  
  {  
   
  vecStop = vecStart + vecDirection * -52.0f;
   
  UTIL_TraceLine( vecStart, vecStop, MASK_ALL, pPlayer, COLLISION_GROUP_NONE, &tr );
   
  if (tr.fraction == 1)  
  {  
  if(camCurrentX > -16.0f)
  camCurrentX -=camDelta;
  if(camCurrentX < -16.0f)
  camCurrentX=-16.0f;
  VectorMA( pSetup->origin, camCurrentX, camRight, pSetup->origin);
  VectorMA( pSetup->origin, 16.0f, camUp, pSetup->origin);
  vecStart=tr.endpos;
  }
  else  
  {  
  VectorMA( pSetup->origin, 0.0f, camRight, pSetup->origin);  
  AngleVectors(pPlayer->EyeAngles(), &vecDirection);  
  vecSetDirection.Init(1.0f,0,0);
  vecDirection=vecDirection.Cross(vecSetDirection);
  vecStop = vecStart +vecDirection*32.0f;
   
  UTIL_TraceLine( vecStart, vecStop, MASK_ALL, pPlayer, COLLISION_GROUP_NONE, &tr);

  if(tr.fraction == 1)
  {
  VectorMA( pSetup->origin, 32.0f, camUp, pSetup->origin);
  vecStart=tr.endpos;
  }
  else  
  //Добавьте код, чтобы сделать игрока прозрачным, таким образом игрок может видеть лучше (?)
  {
  VectorMA( pSetup->origin, 0.0f, camUp, pSetup->origin);
  }
  }

  }
   
  AngleVectors(pPlayer->EyeAngles(), &vecDirection);  
  vecStop = vecStart + vecDirection * -96;
  UTIL_TraceLine( vecStart, vecStop, MASK_ALL, pPlayer, COLLISION_GROUP_NONE, &tr );
   
  vecStart=pSetup->origin;
   
  vecStop = vecStart+vecDirection*-96;
  UTIL_TraceLine( vecStart, vecStop, MASK_ALL, pPlayer, COLLISION_GROUP_NONE, &tr );
   
  if(tr.fraction != 1)
  {
  camCurrentY = -96 * tr.fraction + 10.0f;
  }
  else
  {
  camCurrentY=-96.0f;
  VectorMA( pSetup->origin, camCurrentY, camForward, pSetup->origin);
  }
}

Это создаст вид из-за плеча, который стандартно будет стоять из-за правого плеча. Это конечно не идеальный код, но для начала создания какого-нибудь интересного мода может и подойти.
Если не будет пространства справа, то произойдёт проверка и если пространство есть, то установиться x и z -16/+16 а затем проверяется расстояние позади. Если нет пространства слева, или справа, z устанавливается +32 и x 0. Это поместит камеру выше головы модели игрока, таким образом игрок всё ещё сможет видеть. Если будет недостаточно пространства выше, то камера будет помещена на уровне глаз. Все эти проверки нужны для корректного вида камеры, например если вы ползёте в вентиляционных трубах или того хуже, в канализации biggrin

Шаг 3 - Исправляем маленький баг
Существует маленький баг, который нужно исправить, если его не исправить, то анимация вашего персонажа при повороте камеры по сторонам, будет глючить.
Найдите и откройте c_sdk_player.cpp.
Найдите функцию void C_SDKPlayer::UpdateClientSideAnimation() и замените содержимое на:

Code
if ( this == C_SDKPlayer::GetLocalSDKPlayer() )
  m_PlayerAnimState->Update( EyeAngles()[YAW], EyeAngles()[PITCH] );
else
  m_PlayerAnimState->Update( m_angEyeAngles[YAW], EyeAngles()[PITCH] );

BaseClass::UpdateClientSideAnimation();

Теперь анимация должна быть корректной.
Для игр на движке HL2MP нужно сделать немного другое.
Найдите и откройте файл hl2mp_player.cpp.
Найдите функцию void CHL2MP_Player::PostThink( void ) и замените содержимое на:

Code
BaseClass::PostThink();
   
if ( GetFlags() & FL_DUCKING )
{
  SetCollisionBounds( VEC_CROUCH_TRACE_MIN, VEC_CROUCH_TRACE_MAX );
}

m_PlayerAnimState.Update();

QAngle angles = GetLocalAngles();

CBasePlayer *pPlayer = dynamic_cast<CBasePlayer*>(this);
if ( pPlayer )
{
  angles[PITCH] = EyeAngles()[PITCH];
  angles[YAW] = EyeAngles()[YAW];
}
else
{
  angles[PITCH] = EyeAngles()[PITCH];
  angles[YAW] = m_angEyeAngles[YAW];
}

SetLocalAngles( angles );

Теперь глюков быть не должно.

Шаг 4 - Саморегулирующийся прицел.
Найдите и откройте hud_crosshair.cpp. Он находиться в client.dll файлах.
Теперь найдите функцию void CHudCrosshair::Paint( void ).
Замените содержимое функции на:

Code
if ( !m_pCrosshair )
  return;

if ( !IsCurrentViewAccessAllowed() )
  return;  

C_BasePlayer *pPlayer = C_BasePlayer::GetLocalPlayer();
Vector vecStart, vecStop, vecDirection, vecCrossPos;
trace_t tr;
   
AngleVectors(pPlayer->EyeAngles(), &vecDirection);

vecStart= pPlayer->EyePosition();
vecStop = vecStart + vecDirection * MAX_TRACE_LENGTH;
   
UTIL_TraceLine( vecStart, vecStop, MASK_ALL, pPlayer , COLLISION_GROUP_NONE, &tr );
   
   
ScreenTransform(tr.endpos, vecCrossPos);

m_pCrosshair->DrawSelf( 0.5f*ScreenWidth()+0.5f*ScreenWidth()*vecCrossPos[0]-0.5f*m_pCrosshair->Width(),  
  0.5f*ScreenHeight()+(0.5f*ScreenHeight()*-vecCrossPos[1])-0.5f*m_pCrosshair->Height(),
  m_clrCrosshair );

Так как вид уже из-за плеча, координаты прицела должны поменяться вот это собственно мы и изменяем biggrin

Источник: http://developer.valvesoftware.com/wiki/Over_the_Shoulder_View

Категория: Туториалы по программированию (HL2) | Добавил: Snakeus (24.10.2009)
Просмотров: 2794 | Комментарии: 11 | Рейтинг: 4.5 |

Всего комментариев: 11
11 Noxter  
0
Работает криво! Когда к стене подходишь, чтобы стена была сзади, то игрока вообще не видно и прицел улетает в никуда.
Уж проще будет сделать на подобии этого http://www.interlopers.net/tutorials/29305

10 Igor  
0
привет всем.
а никто не может подсказать - как сделать динамический меш, который прикреплён к модели игрока? я покопался в коде для Alyx Gun - как она его вынимает - ничё не понял)))
просто раз есть вид от третьего лица - так хотел хоть пушку на спину повесить)))
или просто тупо к модели её приаттачить?

8 DetLeR  
0
Andreazzz, так же как и на эп1 только со своими ньюансами.

7 Andreazzz  
0
Народ, а как сделать отображение игрока в thirdperson на ep2???

9 Hitmen  
0
На CS Mapping это очень часто затрагивали. Попробуй там спросить, вроде решение было, как и туториал.

5 Snakeus  
0
Нет, это под старый движок HL2

4 Hitmen  
0
А что такого плохого? Было б хуже, если вообще не было туториала. happy

6 Andreazzz  
0
А что, было-бы лучше secondperson biggrin

3 Andreazzz  
0
Сделать бы по комманде happy как thirdperson и firstperson . Кста, этот код под еп2 идёт??

2 Snakeus  
1
Да, сразу будет вид из-за плеча =)

1 Andreazzz  
0
Как работает этот вид из-за плеча? тоесть сразу поевляешся, и всё? wacko

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Форма входа

Кто в Онлайн

Друзья сайта

Баннеры

  Сайт CrazyArts   Black   Сообщество сайтов о Half-Life   Самый   Только   Все   hl2 top 100     Rambler's Top100  

игры
игры

  Каталог сайтов Планета Топ 100 - Planet Top 100       ТОП ЛУЧШИХ ИГРОВЫХ САЙТОВ           Detroit Team Site :: Моды от Detroit Team, видео, новости.   Naruto-kun[Звезда Наруто]  


The idea of dising: Homie7