IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

DirectX Discussion :

HUD Pour FPS


Sujet :

DirectX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 13
    Par défaut HUD Pour FPS
    Bonjour les gens,

    Je viens poster ici car j'ai fouillé un peu partout sur le web et j'ai vraiment du mal a trouver ce que je voudrais en fait =).

    Pour resumer, on a un projet a faire en 2eme année de DUT info et on a choisi de faire un "FPS" avec directx.

    Mais qu'est-ce que qu'un FPS sans un HUD me diriez vous???? (BArre de vie, radar, cartouche et tout le bordel ^^)

    Donc en gros j'aimerais savoir comment afficher une image qui gere la transparence ( de type PNG par exemple ) par dessus une scene 3D =)

    J'ai entedu parlé de pas mal de choses, Billboarding, stencil, mask etc.. mais je m'y retrouve vraiment pas :]

    Merci d'avance pour votre aide
    Ciao :]

  2. #2
    Membre Expert

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Par défaut
    Charger le PNG dans une texture avec Alpha.

    Utiliser l'alpha test (ou alpha blend s'il y a plus d'un niveau de transparence) et tracer un/plusieurs polygones alignés sur l'écran avec la texture par dessus la scène.

    S'il s'agit d'un élément dynamique, vous pouvez soit utiliser de la géométrie plus compliquée (allonger/rétrécir le rectangle de la barre de vie) soit utiliser une texture dynamique (locker une texture systeme pour la modifier avec le CPU et mettre à jour le contenu de la texture en mémoire vidéo pour l'afficher)

    C'est bizarre un FPS complet c'est un peu plus compliqué que l'affiche d'une interface sur l'écran, on a du mal à imaginer que vous ne bloquiez que sur ça .

    LeGreg

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

  3. #3
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 34
    Par défaut
    Plutôt que de faire un long discours sur le Head-up display, je te conseille d'aller emprunter le livre DirectX 9 de Laurent Testud à ta B.U. ou au CDI.
    Tu trouveras tout ce qu'il te faut page 326 =)

    Tu peux donc soit utiliser les coordonnées RHW (XYZRHW dans ton custom vertex) ou la projection orthographique (XYZ). La première solution reste parfaite si tu n'as pas besoin d'appliquer un tas de transformations à tes sprites (translations, rotations, mise à l'échelle...) et donc te passer des matrices, quaternions et tout ça.

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 13
    Par défaut
    C'est bizarre un FPS complet c'est un peu plus compliqué que l'affiche d'une interface sur l'écran, on a du mal à imaginer que vous ne bloquiez que sur ça
    T'inquiete pas on a d'autre soucis, mais le truc c'est que on apprend Directx et on code en même temps donc on peut voir comment faire mais pas connaitres les primitives Directx pour realiser ce qu'on a en tete en fait :s

    Et sinon merci a vous deux, je vais etudier les deux solutions et voir ce que ça donne.. Le livre il me semble que je l'avais déja emprunté mais que c'etait pas assez concret donc je l'avais reposé ^^ (j'ai peut-être pas assez passez de temps la dessus ^^)

    Merci encore et je vous tiens au courant si j'y arrive ^^

    Ciao

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 13
    Par défaut
    Plutôt que de faire un long discours sur le Head-up display, je te conseille d'aller emprunter le livre DirectX 9 de Laurent Testud à ta B.U. ou au CDI.
    Tu trouveras tout ce qu'il te faut page 326 =)
    Oui donc j'ai le bookin sous les yeux et il se trouve que p326 il me parle d'activation du vertex shader (suite)
    Donc je vois pas trop le rapport en fait donc si tu pouvais expliciter un peu, ça serait génial

    Woot =)

    Edit: en fouillant un peu il se trouve qu'il a quelque chose P282 =) Donc voilà :]

  6. #6
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 34
    Par défaut
    héhé, t'as la première édition du bouquin. J'ai les deux, du moins j'avais acheté la première édition quand il était sorti et j'ai emprunté la deuxième édition à ma B.U pour avoir le cd avec les sources et les informations supplémentaires fournies dans le bouquin.

    Donc en effet il y a quelques indications page 282 mais c'est assez sommaire. Dans l'édition finale tu aurais eu toutes les informations sur ce que je t'ai dis plus haut. Malheureusement, le bouquin ne semble plus être disponible nul part, enfin j'ai pas cherché très longtemps sur le net...

    Je vais donc te résumer les techniques proposées dans ce bouquin pour réaliser facilement ton HUD :

    S'offre à toi deux choix. Soit tu utilises les coordonnées RHW, soit tu utilise la projection orthographique. Ton choix de l'une ou l'autre de ces techniques portera sur le fait que tu ai besoin ou non de transformer, animer (translations, rotations, mises à l'échelle) tes sprites.
    Si tu fais un FPS, il n'y aurait à priori pas besoin de transformer, mis à part si tu introduis un viseur libre, qui va lui devoir subir des translations.
    Ca dépend donc comment tu vois les choses, soit tu laisses le viseur au milieu de l'écran dans ta partie 2D (ton HUD) et tu orientes ta caméra avec la souris dans ta partie 3D comme dans la plupart des FPS, soit tu déplaces le viseur dans l'écran comme dans les jeux de shoot à la 3ème personne.
    Bref, RHW dans le premier cas et orthographique dans le second.

    Je ne sais pas en quel langage tu travailles mais je vais partir du principe que tu travailles en C++. Il sera facile de convertir les notions suivantes dans le langage cible, c'est toujours pareil.

    Coordonnées RHW :

    RHW signifie "Reciprocal Homogeneous W". C'est un nom assez barbare mais ce que tu dois retenir c'est que ces coordonnées sont en fait les coordonnées écran. L'avantage de l'utilisation de celles-ci est que tu va pouvoir ignorer complètement le monde 3D, afficher tes sprites où tu veux sur ton écran et ainsi te passer des matrices et tous les calculs mathématiques à faire.

    Dans la déclaration des données membres privées de ta classe qui va gérer tes objets 2D, tu vas devoir insérer la déclaration d'une structure Vertex correspondante et la déclaration du format de vertices utilisées (à mettre dans setFVF avant l'affichage via DrawPrimitive) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    struct VERTEXRHW
    {
          D3DXVECTOR4 coords; // ou 4 float x, y, z et w
          DWORD couleur; // couleur du vertex
          FLOAT tu, tv; // coordonnées de la texture
    };
     
    static const unsigned long D3DFVF_VERTEXRHW   = D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1; // FVF des vertices
    1) coords : en RHW, tu as nécessairement 4 coordonnées. x et y sont tes coordonnées écran (donc à toi de faire les calculs pour chaque vertex suivant la résolution utilisée), z doit être égal à 0 et w à 1 pour un affichage correct.

    2) couleur : la couleur de ton vertex ou 0xFFFFFFFF si tu ne veux pas en appliquer

    3) tu et tv : coordonnées x et y dans ta texture pour former une sélection sur une partie de celle-ci, grâce aux quatre vertices que tu va déclarer et donc obtenir ton sprite. Attention, les coordonnées vont de 0 à 1 (et non en nombre de pixels), donc prend soin d'effectuer les calculs nécessaires.

    Tu peux utiliser un vertex buffer qui contiendra uniquement tes objets 2D en plus de ton vertexbuffer pour la 3D mais switcher entre chaque vertexbuffer avec setStreamSource est assez lourd et si tu recherches à optimiser un max, il faudra partager ton unique vertexbuffer avec les "deux types" de ressources.

    Pour ce qui est du stockage des vertices dans ton vertexbuffer, construit 4 vertices formant ainsi un quad et fait un drawPrimitive en TRIANGLESTRIP sur ces 4 vertices.

    Exemple de création d'un quad :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    float tu1 = 0.0f;
    float tv1 = 0.0f;
    float tu2 = 31.0f / 255.0f;
    float tv2 = 31.0f / 255.0f;
     
    VERTEXRHW vertices[] =
    {
            { 0.0f, 0.0f, 0.0f, 1.0f, 0xffffffff, tu1, tv2 },
            { 0.0f, 31.0f, 0.0f, 1.0f, 0xffffffff, tu1, tv1 },
            {  31.0f, 0.0f, 0.0f, 1.0f, 0xffffffff, tu2, tv2 },
            {  31.0f, 31.0f, 0.0f, 1.0f, 0xffffffff, tu2, tv1 }
    };
    Cet exemple concerne une texture 256*256 où j'y prend un sprite 32*32 se trouvant en haut à gauche de celle-ci.

    Sinon tu peux passer par une liste de triangles (TRIANGLELIST) pour afficher tout d'un coup mais là tu devras créer 6 vertices. Il y en a 4 des 6 qui seront identiques. Un petit indexbuffer te permettra d'optimiser ça en signalant que le vertex a est le même que le vertex b. Mais bon, pour trois sprites qui se battent en duel, utilise directement du STRIP, tu te compliqueras moins la vie.

    Ensuite, t'envoies ça au vertex buffer. Avant d'afficher avec DrawPrimitive, indique bien quelle texture tu utilises avec setTexture (limite le nombre d'appels à setTexture pour améliorer les perfs, juste le nécessaire).

    Regroupe tes sprites dans une unique texture si tu peux.


    Projection Orthographique :

    Cette fois, on utilise des matrices !

    Déclaration de la structure vertex et le format :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    struct CUSTOMVERTEX
    {
          D3DXVECTOR3 coords; // ou 3 float x, y, z
          DWORD couleur; // couleur du vertex, D3DCOLOR possible
          FLOAT tu, tv; // coordonnées de la texture
    };
     
    static const unsigned long D3DFVF_CUSTOMVERTEX  = D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1; // FVF des vertices
    Bon pour ça, ça rejoint un peu ce qui a été expliqué avant. La coordonnée z tu la met toujours à 1. Et pour ce qui est de x et de y, cela dépend comment tu va créer ta matrice de projection.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    D3DXMATRIX matWorld;
    D3DXMatrixIdentity( &matWorld );
    deviceD3D->SetTransform( D3DTS_WORLD, &matWorld );
     
    D3DXMATRIX matView;
    D3DXMatrixIdentity(&matView);
    deviceD3D->SetTransform( D3DTS_VIEW, &matView );
     
    D3DXMATRIX matProj;
    D3DXMatrixOrthoLH( &matProj, (FLOAT)screen_width, (FLOAT)screen_height, 0.0f, 1.0f );
    deviceD3D->SetTransform( D3DTS_PROJECTION, &matProj );
    Tu initialises donc au préalable ta matrice monde et ta matrice de vue avec la matrice identité. Pour ce qui est de la matrice de projection, bein tu fais tel quel. D3DXMatrixOrthoLH te permettra de définir le repère au centre de l'écran avec les axes orientés façon "main gauche" (LH, left hand). screen_width correspond à ton axe X. La coordonnées x maximale sera screen_width/2 et la minimale sera -screen_width/2. Pareil pour y et screen_height. A toi de voir avec quelles coordonnées tu veux travailler, tu peux par exemple faire du -1 à +1 mais c'est plus énervant pour se repérer (à ton goût). Pour les deux paramètres qui suivent, c'est le znear et le zfar.

    Pour ce qui est de la création des vertices, c'est pareil qu'en RHW (en spécifiant bien z à 1.0f !).

    Pour les objets que tu auras à transformer, tu redéfinis la matrice monde avant l'affichage en lui appliquant la transformation désirée puis tu n'oublis pas de la réaffecter à la matrice identité après sinon tes autres objets vont aussi être transformés.


    Bref, je pense avoir fait le tour, après je t'invite à consulter la doc et quelques tutoriaux si tu n'es pas du tout familier avec DirectX.

    Ah oui, pour les deux méthodes, il faut quand même initialiser quelques renderstates et tout. Donc sauvegarde tes renderstates de ton monde 3D avec un stateblock (voir doc) et initialise tes renderstates pour ta 2D avant l'affichage de tes sprites.

    Ohw je viens de voir : http://jeux.developpez.com/faq/direc...CS_TEXTURES_2d

    Bon courage pour lire mon pavé.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 13
    Par défaut
    Serieusement respect =), je vais garder tout ça sous le bras et gerer ça dès que j'aurai le temps mais c'est exactement ce qu'il me fallait..

    Et en effet, j'ai une vieille version du livre et c'est beaucoup plus laconique que ce que tu me donne et j'avais un peu rien capté ^^.

    Et bien vu, c'est du C++ donc ça va me faciliter la tâche =)

    Encore merci et je passerai de temps en temps au cas ou j'ai des soucis =)

    WOOOOOOOT

Discussions similaires

  1. Hud pour avion
    Par black_hole dans le forum Développement 2D, 3D et Jeux
    Réponses: 6
    Dernier message: 15/10/2012, 12h31
  2. Server dédié linux pour FPS
    Par Acropole dans le forum Unity
    Réponses: 3
    Dernier message: 10/01/2012, 13h19
  3. Question généraliste pour FPS
    Par nyme92 dans le forum Développement 2D, 3D et Jeux
    Réponses: 3
    Dernier message: 19/05/2008, 12h58
  4. Moteur 3D pour FPS
    Par Comir dans le forum Projets
    Réponses: 9
    Dernier message: 21/01/2008, 14h49
  5. Developpement réseau pour FPS
    Par BenoitTCN dans le forum Général Java
    Réponses: 6
    Dernier message: 14/11/2007, 17h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo