Source SDK

Source SDK

Not enough ratings
Camera Bob (Motor Source 2013)
By Oitnemood
Este tutorial repasará los fundamentos de la creación de un balanceo de la cámara para cuando un jugador camina. El resultado es una simulación bastante realista de un movimiento de la cabeza que casi coincide con la velocidad y los sonidos de caminar por defecto de HL2. Este tutorial sólo ha sido probado con el OB HL2MP y la plantilla SDK beta del OB, pero debería funcionar para la mayoría de las demás versiones del código fuente de Valve con unos pocos ajustes. Un agradecimiento especial a sharkkk (archivado) y Winston (archivado) de los Foros de Steam por averiguar todo esto.

Sources:
sharkkk's code (archived)
Winston's code (archived)
   
Award
Favorite
Favorited
Unfavorite
El Código
En gamemovement.cpp, antes de la lista de definiciones alrededor de las líneas 65 más o menos, añade lo siguiente:
// Camera Bob ConVar cl_viewbob_enabled ( "cl_viewbob_enabled", "1", 0, "Oscillation Toggle" ); ConVar cl_viewbob_timer ( "cl_viewbob_timer", "10", 0, "Speed of Oscillation" ); ConVar cl_viewbob_scale ( "cl_viewbob_scale", "0.02", 0, "Magnitude of Oscillation" );

Todo lo que estamos haciendo aquí es declarar nuestros ConVars, bools y floats para nuestro código de movimiento de la cámara a continuación.

En el mismo archivo, encuentra la función void CGameMovement::WalkMove( void ) y añade lo siguiente al principio de la función:

if ( cl_viewbob_enabled.GetBool() && !engine->IsPaused() ) { float xoffset = sin( gpGlobals->curtime * cl_viewbob_timer.GetFloat() ) * player->GetAbsVelocity().Length() * cl_viewbob_scale.GetFloat() / 100; float yoffset = sin( 2 * gpGlobals->curtime * cl_viewbob_timer.GetFloat() ) * player->GetAbsVelocity().Length() * cl_viewbob_scale.GetFloat() / 400; player->ViewPunch( QAngle( xoffset, yoffset, 0 ) ); }
Lo que hace es utilizar la velocidad del jugador y los ConVars para hacer oscilar la vista del jugador en una figura de 8 utilizando un ViewPunch.

ViewPunch es parte de CBasePlayer, que permite perforar las vistas del jugador en un ángulo especificado.

Nota: ¡Esto sólo está disponible en los objetos que derivan de CBasePlayer!
//----------------------------------------------------------------------------- // Propósito: Perforar la vista del jugador en el QAngle especificado // Entrada : angleOffset- Angulo a perforar //----------------------------------------------------------------------------- void CBasePlayer::ViewPunch( const QAngle &angleOffset ) { //Ver si suprimimos el puñetazo de la vista if ( sv_suppress_viewpunch.GetBool() ) return; // No permitimos los golpes de vista en el vehículo if ( IsInAVehicle() ) return; m_Local.m_vecPunchAngleVel += angleOffset * 20; }

Ejemplos De ViewPunch
//This example gets the player, then punches their view and shoves them backwards. //Then it shows you how to drop an object (pTarget) from the players hands. CBasePlayer *pPlayer = ToBasePlayer( pTarget ); if ( pPlayer != NULL ) { //Kick the player angles pPlayer->ViewPunch( QAngle( 20, 20, -30 ) ); Vector dir = pPlayer->WorldSpaceCenter() - WorldSpaceCenter(); VectorNormalize( dir ); dir.z = 0.0f; Vector vecNewVelocity = dir * 250.0f; vecNewVelocity[2] += 128.0f; pPlayer->SetAbsVelocity( vecNewVelocity ); color32 red = {128,0,0,128}; UTIL_ScreenFade( pPlayer, red, 1.0f, 0.1f, FFADE_IN ); } // Player takes less damage float flDamage = ( pPlayer == NULL ) ? 250 : sk_hunter_dmg_charge.GetFloat(); // If it's being held by the player, break that bond Pickup_ForcePlayerToDropThisObject( pTarget ); // Calculate the physics force Hunter_ApplyChargeDamage( this, pTarget, flDamage );

//Este ejemplo toma al jugador, golpea su vista //lo empuja hacia atrás CBasePlayer *pPlayer = ToBasePlayer( pHurt ); if ( pPlayer != NULL ) { //Patear los ángulos del jugador if ( !(pPlayer->GetFlags() & FL_GODMODE ) && pPlayer->GetMoveType() != MOVETYPE_NOCLIP ) { pPlayer->ViewPunch( viewPunch ); Vector dir = pHurt->GetAbsOrigin() - GetAbsOrigin(); VectorNormalize(dir); QAngle angles; VectorAngles( dir, angles ); Vector forward, right; AngleVectors( angles, &forward, &right, NULL ); //Push the target back pHurt->ApplyAbsVelocityImpulse( - right * shove[1] - forward * shove[0] ); } }