void C_HLTVCamera::SetPrimaryTarget( int nEntity ) { if ( m_iTraget1 == nEntity ) return; m_iTraget1 = nEntity; if ( GetMode() == OBS_MODE_ROAMING ) { Vector vOrigin; QAngle aAngles; float flFov; CalcChaseCamView( vOrigin, aAngles, flFov ); } else if ( GetMode() == OBS_MODE_CHASE ) { C_BaseEntity* target = ClientEntityList().GetEnt( m_iTraget1 ); if ( target ) { QAngle eyeAngle = target->EyeAngles(); prediction->SetViewAngles( eyeAngle ); } } m_flLastDistance = m_flDistance; m_flLastAngleUpdateTime = -1; }
void C_Camera::CalcChaseCamView(Vector& eyeOrigin, QAngle& eyeAngles, float& fov) { C_SDKPlayer *pLocal = C_SDKPlayer::GetLocalSDKPlayer(); C_BaseEntity *pTarget = NULL; if ((pLocal->m_nButtons & IN_ZOOM) && !pLocal->IsObserver() && g_PR->GetTeamPosType(GetLocalPlayerIndex()) == POS_GK && GetMatchBall() && Sign(GetMatchBall()->GetLocalOrigin().y - SDKGameRules()->m_vKickOff.GetY()) == pLocal->GetTeam()->m_nForward) { CalcHawkEyeView(eyeOrigin, eyeAngles, fov); return; } if (pLocal->IsObserver()) pTarget = GetTarget(); else pTarget = pLocal; if (!pTarget || !pTarget->GetBaseAnimating() && !pTarget->GetModel()) { CalcRoamingView( eyeOrigin, eyeAngles, fov ); return; } eyeOrigin = pTarget->EyePosition(); eyeAngles = pTarget->EyeAngles(); const QAngle camAngles = ::input->GetCameraAngles(); Vector &camOffset = ::input->GetCameraOffset(); float dist = cl_cam_firstperson.GetBool() ? -10 : cl_cam_dist.GetFloat(); float height = cl_cam_firstperson.GetBool() ? 8 : cl_cam_height.GetFloat(); if (pLocal->IsObserver() && GetCamMode() == CAM_MODE_LOCKED_CHASE && !dynamic_cast<C_MatchBall *>(pTarget)) { camOffset[PITCH] = eyeAngles[PITCH]; camOffset[YAW] = eyeAngles[YAW]; } else { camOffset[PITCH] = camAngles[PITCH]; camOffset[YAW] = camAngles[YAW]; } if (camOffset[PITCH] >= 0) { camOffset[ROLL] = dist; } else { float coeff = clamp(cos(DEG2RAD(camOffset[PITCH] + 90)), 0.001f, 1.0f); camOffset[ROLL] = min((VEC_VIEW.z + height - 5) / coeff, dist); } eyeAngles[PITCH] = camOffset[PITCH]; eyeAngles[YAW] = camOffset[YAW]; eyeAngles[ROLL] = 0; Vector camForward, camRight, camUp; AngleVectors(eyeAngles, &camForward, &camRight, &camUp); VectorMA(eyeOrigin, -camOffset[ROLL], camForward, eyeOrigin); eyeOrigin.z += height; if (!pLocal->IsObserver()) { // Apply a smoothing offset to smooth out prediction errors. Vector vSmoothOffset; pLocal->GetPredictionErrorSmoothingVector( vSmoothOffset ); eyeOrigin += Vector(vSmoothOffset.x, vSmoothOffset.y, 0); } fov = pLocal->GetFOV(); }