CameraLook

Écrit le 04/07/2003 par *OgGiZ*
Dernière mise à jour : 06/02/2006

Vous allez avoir besoin de la classe tfVector qui se trouve dans les tutos section mathz !

Définissons 3 vecteurs selon la vision du joueur dans ce monde de brutes

tfVector forward, right, up;

Ici nous stockons l'origine du joueur

tfVector origin;

Ici nous sauvons l'angle de vision du joueur

float angles[3];

Commençons par initialiser notre caméra. Tous les angles sur 0, l'origin à 0, le viewofs avec 5u en plus vers le haut et le forward, etc.. selon les angles.

void CameraInit (void)
{
    angles[0] = angles[1] = angles[2] = 0.0f;

    origin = tfVector (0.0f, 0.0f, 0.0f);

    forward.SetForward (angles);
    right.SetRight (angles);
    up.SetUp (angles);
}

Important! Récupérons la position de la souris sur l'écran avec GetCursorPos(). Ecrire SCREENWIDTH >> 1 reviens a faire SCREENWIDTH / 2. ATTENTION : il faut que vous définissiez screenwidth / height !!! Ensuite on compare la position du curseur par rapport au centre de l'écran. Stockons ces valeurs dans dx et dy (on divise par 1000 pour éviter d'avoir un nombre énorme!). Resetons la souris pour placer le curseur au centre de l'écran (avec un SetCursorPos()). Ajoutons dx et dy au YAW et PITCH. Demandons ensuite la création des vecteurs forward, right et up suivant les angles PITCH et YAW. Pour comprendre les fonctions SetForward(), etc.. allez lire le tuto sur la classe tfVector.

void CameraMouseManager (void)
{
    POINT mousepos;
    GetCursorPos(&mousepos);

    int mx = SCREENWIDTH >> 1;
    int my = SCREENHEIGHT >> 1;

    float dx = (mx - mousepos.x)/1000.0f;
    float dy = (my - mousepos.y)/1000.0f;

    SetCursorPos (mx, my);

    angles[1] += dx;
    angles[0] -= dy;

    forward.SetForward (angles);
    right.SetRight (angles);
    up.SetUp (angles);
}

Ici on regarde juste quelles touches sont enfoncées. Déplaçons ensuite l'origine dans le sens right ou forward. Rappelons que right et forward sont les angles qui indique la direction dans le sens de notre angle de vision et vers la droite de notre angle de vision. A vous de définir factor pour éviter d'avancer trop vite. Moi je l'ai mis sur 0.1f.

void CameraKeyboardManager (void)
{
    if (GetAsyncKeyState (VK_LEFT))
        origin -= right*factor;

    if (GetAsyncKeyState (VK_RIGHT))
        origin += right*factor;

    if (GetAsyncKeyState (VK_DOWN))
        origin -= forward*factor;

    if (GetAsyncKeyState (VK_UP))
        origin += forward*factor;
}

Ici on se charge juste de dire à OpenGL depuis quel endroit et vers ou nous regardons. Remarquez que c'est le seul endroit ou nous utilisons up. A mon avis il serait judicieux d'utiliser up pour faire un view_ofs.

void CameraLook (void)
{
    gluLookAt (origin.x, origin.y, origin.z,
            forward.x+origin.x, forward.y+origin.y, forward.z+origin.z,
            up.x, up.y, up.z);
}

Il suffit d'appeler CameraUpdate() pour qu'il exécute les deux fonctions (d'abord la vue souris de préférence !!!)

void CameraUpdate (void)
{
    CameraMouseManager ();
    CameraKeyboardManager ();
}

Pour récapituler, il vous faut appeler CameraInit() dans l'init de votre programme et CameraUpdate() au début de votre fonction Render().