On Mon, Jun 1, 2009 at 1:16 AM, Chris Marshall <krizt...@comcast.net> wrote:

> First of all, what is the difference between CAM_Think() and
> CAM_ThirdThink()? I was looking to see which one to override in the sdk
> files but it appears that CAMThirdThink() is never called.


Again I don't know about the standard sources but mine are set up so that
CAM_Think() is called all the time and CAM_ThirdPersonThink() is called only
if the player is in third person.

Secondly, if I override CAM_Think, I don't see how I can control the
> "location" of the camera except for distance away from the player. I
> thought about how I could do some trig and set the pitch and yaw to
> move the camera, but then I'd have to rotate the camera itself back to
> look forward. I guess what I'm saying is that I don't see how I can
> rotate the camera relative to itself instead of the player. Do I _have_
> to use the overrideview function? Can I use trig to set the proper
> location of the camera in CAM_Think and then override _only_ the view
> angles in OverrideView()?


Thinking about it again I doubt what I said before. I'll just show you what
my sources do and let you figure it out, I don't want to confuse you.

void CSDKInput::CAM_SetUpCamera( Vector& vecOffset, QAngle& angCamera )
{
    VectorCopy( m_vecCamera, vecOffset );
    VectorCopy( m_angCamera, angCamera );
}

void ClientModeSDKNormal::OverrideView( CViewSetup *pSetup )
{
    QAngle camAngles;

    // Let the player override the view.
    C_BasePlayer *pPlayer = C_BasePlayer::GetLocalPlayer();
    if(!pPlayer)
        return;

    pPlayer->OverrideView( pSetup );

    if( SDKInput()->CAM_IsThirdPerson() )
    {
        SDKInput()->CAM_SetUpCamera( pSetup->origin, pSetup->angles );
    }
    else if (::input->CAM_IsOrthographic())
    {
        pSetup->m_bOrtho = true;
        float w, h;
        ::input->CAM_OrthographicSize( w, h );
        w *= 0.5f;
        h *= 0.5f;
        pSetup->m_OrthoLeft   = -w;
        pSetup->m_OrthoTop    = -h;
        pSetup->m_OrthoRight  = w;
        pSetup->m_OrthoBottom = h;
    }
}

void CSDKInput::CAM_Think( void )
{
    VPROF("CSDKInput::CAM_Think");

    if(!C_BasePlayer::GetLocalPlayer())
        return;

    C_SDKPlayer* pPlayer = C_SDKPlayer::GetLocalSDKPlayer();

    if (!pPlayer)
        return;

    if (pPlayer->IsKnockedOut())
        CAM_ToThirdPerson();

    if( !m_fCameraInThirdPerson )
        return;

    Vector vecFollowCamera;
    QAngle angFollowCamera;
    Vector vecThirdCamera;
    QAngle angThirdCamera;

    m_flCameraWeight = Approach(pPlayer->IsInFollowMode()?1:0,
m_flCameraWeight, gpGlobals->frametime * (1/cam_switchtime.GetFloat()));

    if (m_flCameraWeight > 0.0f)
    {
        //if (pPlayer->IsInFollowMode() && !m_bWasInFollowMode)
        //    CAM_ResetFollowModeVars();

        m_bWasInFollowMode = pPlayer->IsInFollowMode();

        CAM_FollowModeThink(vecFollowCamera, angFollowCamera);
    }

    if (m_flCameraWeight < 1.0f)
    {
        CAM_ThirdPersonThink(vecThirdCamera, angThirdCamera);
    }

    float flWeight = Gain(m_flCameraWeight, 0.8f);

    m_vecCamera = vecFollowCamera * flWeight + vecThirdCamera *
(1-flWeight);
    m_angCamera = angFollowCamera * flWeight + angThirdCamera *
(1-flWeight);
}

The weight is used in order to transfer from follow mode to regular third
person mode smoothly, and you probably won't need it. Other than that if you
set m_vecCamera and m_angCamera then it should work properly. The method of
finding the proper values for those two involves just doing some math. Start
with the player origin, add a little bit of height (vecCamera.z += 10 or
whatever) and then do something like this:

    QAngle angEngine;
    engine->GetViewAngles( angEngine );
    Vector vecEngineForward, vecEngineRight, vecEngineUp;
    AngleVectors(angEngine, &vecEngineForward, &vecEngineRight,
&vecEngineUp);

    vecCamera -= vecEngineForward * 20;
    vecCamera += vecEngineRight * 10;

That's probably the simplest over-the-shoulder camera you can get. Probably
a good idea to set those numbers to cvars so that you can modify them ingame
and see what looks best, but that's the general idea. As for the angles they
are most of the time best set to whatever the player's view angles are. This
way the camera is always behind and a little to the side of the player, and
facing the same way the player is. Is that what you want?

As for the muzzle flashes, either your player character has contracted EUTS
(Explosive Urinary Tract Syndrome) or you are trying to retrieve an
attachment from the wrong model. You should either instruct your player
character on the dangers of STDs or make sure you are calling
GetAttachment() on the w model and not the v model or player model.

-- 
Jorge "Vino" Rodriguez
_______________________________________________
To unsubscribe, edit your list preferences, or view the list archives, please 
visit:
http://list.valvesoftware.com/mailman/listinfo/hlcoders

Reply via email to