Article     Discussion     Modifier     Historique     Forums     Salon IRC

OpenGL:Camera à la troisième personne

Un article de Games Creators Network.

La classe de caméra utilisée dans cet article est celle de "Développer un RPG en C++ avec OpenGL". Vous pourrez aussi trouver ces sources dans l'article connexe intitulé "Caméra à la première personne".

Sommaire

[modifier] Concept

Pour réaliser notre caméra à la troisième personne, nous allons donc réutiliser une classe de caméra existante.

[modifier] Mise en Oeuvre

[modifier] Création de notre caméra

Pour créer notre caméra, nous avons seulement à déclarer et instancier notre objet, en passant comme paramètre au constructeur les coordonnées de la caméra.

TCamera* Camera = new TCamera(150, 75, 150);

[modifier] Récupérer les mouvement du curseur

Commençons par déclarer

POINT Curseur;

Qui nous servira à stoquer les coordonnées de notre souris. Ajoutons l'événement win32 suivant, afin de stoquer la position de notre souris à chaque fois qu'elle bouge.

case WM_MOUSEMOVE: {
                   Curseur.x = LOWORD(lParam);
                   Curseur.y = HIWORD(lParam);
                   return 0;
}

[modifier] Utiliser les coordonnées de la souris

Nous allons maintenant traiter les coordonnées de la souris que nous avons récupérés, puis nous apellerons des méthodes de la caméra adéquates :

float x,y;
    y = -(Curseur.y-((float)APP_RESOY/2.f))/8.f;
    x = (Curseur.x-((float)APP_RESOX/2.f))/3.f;
    Camera->RotationZX(y);
    Camera->RotationY(x);
    SetCursorPos((int)(APP_RESOX/2),(int)(APP_RESOY/2));

La formule "-(Curseur.y-((float)APP_RESOY/2.f))" représente en fait la distance parcourue en y par rapport à la moitié de l'écran. La formule "(Curseur.x-((float)APP_RESOX/2.f))" représente elle la distance en x parcourue par la souris par rapport au centre de l'écran. Les divisions qu'on applique ensuite à ces formules permettent de ralentir la vitesse de défilement. La fonction RotationZX() de notre classe de caméra sert à effectuer une rotation "verticale" autour de notre objet, alors que la fonction RotationY() sert à faire une rotation "horizontale". Notez que l'on replace le curseur au centre de l'écran après nos traitements. (Ne le faites pas dans la routine de récupération des coordonnées du curseur dans le WM_MOUSEMOVE, vous feriez un cycle infini de messages).

[modifier] Initialisation

Nous créons un espace mémoire pour la focalisation de notre caméra.

Point3D* Focal = new Point3D;
Focal->x = 0;
Focal->y = 0;
Focal->z = 0;
 
Camera->SetFocalisation(Focal);

[modifier] Pour terminer

Il ne reste plus qu'à appeler

Camera->Focalise();

A chaque loop afin de positionner notre caméra.

[modifier] Téléchargements

--NewbiZ 11 sep 2005 à 00:38 (CEST)

 

Rechercher
Installer l'extension de recherche Plus d'informations

 

Comprendre
Tu me dis, j'oublie. Tu m'enseignes, je me souviens. Tu m'impliques, j'apprends. - Benjamin Franklin

 

Partager
La connaissance est la seule chose qui s'accroit lorsqu'on la partage. - Sacha Boudjema

 

Créer
L'imagination est plus importante que la connaissance. - Albert Einstein

 

 

Le wiki en images Le wiki en images Image du mois: «Snowball: un prototype de jeu développé avec NeL.