domingo, 8 de janeiro de 2012

Classe Camera (UnrealScript)

A classe Camera é utilizada para definir o ponto de visão do jogador no mundo 3D do jogo. Para mover a camera durante o jogo basta ajustar suas propriedades Location e Rotation. A classe Camera trabalha em conjunto com as classes Pawn e PlayerController para controlar sua posição e efeitos que ocorram durante o jogo.

No jogo Unreal Tournament a câmera padrão utilizada é em primeira pessoa. Essa câmera é bem simples de definir pois só precisamos obter o ponto de visão relacionado aos olhos do Actor que representa o jogador. Isto é feito através desta função da classe Pawn:
GetActorEyesViewPoint( out vector out_Location, out Rotator out_Rotation )

A câmera em terceira pessoa é usada em algumas situações no jogo Unreal Tournament, por exemplo quando o jogador entra em um veículo. Definir uma câmera em terceira pessoa é bem mais complexo, pois também é preciso levar em conta se não há algum obstáculo entre a câmera e o jogador que esteja atrapalhando a visão. O código que calcula a posição para esta câmera se encontra nesta função da classe UTPawn:
bool CalcThirdPersonCam( float fDeltaTime, out vector out_CamLoc, out rotator out_CamRot, out float out_FOV )

A classe Camera possui uma função chamada UpdateCamera(float DeltaTime) que é chamada a cada frame. Esta função chama outra função DoUpdateCamera(float DeltaTime) que chama a UpdateViewTarget(out TViewTarget OutVT, float DeltaTime). A função UpdateViewTarget permite que a classe Pawn possa definir a posição da câmera chamando sua função CalcCamera() no trecho de código abaixo:
//Dentro de Camera.UpdateViewTarget(out TViewTarget OutVT, float DeltaTime):
                
 TPawn = Pawn(OutVT.Target);
 // Give Pawn Viewtarget a chance to dictate the camera position.
 // If Pawn doesn't override the camera view, then we proceed with our own defaults
 if( TPawn == None || !TPawn.CalcCamera(DeltaTime, OutVT.POV.Location, OutVT.POV.Rotation, OutVT.POV.FOV) )
 { 
   //camera default...
 }

O código abaixo é da função CalcCamera da classe UTPawn:
simulated function bool CalcCamera( float fDeltaTime, out vector out_CamLoc, out rotator out_CamRot, out float out_FOV )
{
    // Handle the fixed camera

    if (bFixedView)
    {
        out_CamLoc = FixedViewLoc;
        out_CamRot = FixedViewRot;
    }
    else
    {
        if ( !IsFirstPerson() )    // Handle BehindView
        {
            CalcThirdPersonCam(fDeltaTime, out_CamLoc, out_CamRot, out_FOV);
        }
        else
        {
            // By default, we view through the Pawn's eyes..
            GetActorEyesViewPoint( out_CamLoc, out_CamRot );
        }

        if ( UTWeapon(Weapon) != none)
        {
            UTWeapon(Weapon).WeaponCalcCamera(fDeltaTime, out_CamLoc, out_CamRot);
        }
    }
    return true;
}

No final deste código podemos observar que a função permite que a arma em uso possa fazer algum tipo de ajuste na câmera através da função WeaponCalcCamera(). Procurei nas classes de armas do UTDemo que acompanha o UDK e nenhuma delas implementa esta função. Um exemplo de arma que deve fazer esse ajuste é a Sniper Rifle em modo Zoom.

Para mais informações sobre Câmera:

Sniper Rifle Zoom em UT2004