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

C++ Discussion :

[débat] Pourquoi ne pas faire de GUI avec des objet 3D ?


Sujet :

C++

  1. #1
    Invité
    Invité(e)
    Par défaut [débat] Pourquoi ne pas faire de GUI avec des objet 3D ?
    Salut et puis bonne année a tous

    Alors voila je voulais avoir votre avis a tous. Dans le cadre d'un jeu vidéo en 3D. On fait en général ca GUI en 2D en important des images .png. Mais pourquoi ne pas utiliser d'objet 3D (comme des planes, plans en français) auxquelles on appliquerait la texture en .png. L'utilisateur au final n'y verrai que du feux puisque les objets serait projeté face à la caméra.

    J'y vois plusieurs avantage:

    - une texture est généralement carré ou rectangulaire et si l'on veut faire une boussole ou une mini carte en cercle par exemple comment on fait. Certes il suffit de mettre les bords de la texture en opacité visuellement on n'y verra que du feu mais si par contre je veux que ma boussole soit séléctionnable ben les bord en opacité le seront aussi .

    - lorsque l'on change la résolution de l'écran, les objets 3D sont redimensionné en conséquence ce qui est bien. Par contre les .png que l'on importe garde toujours la meme taille que l'on a défini sous photoshop et ca quelque soit la résolution de l'écran. Le fait que la GUI soit en 3D permettrait qu'elle soit redimensionné également.

    - Enfin en 3D on a un axe Z et pas en 2D. Moi j'utilise irrlicht et il n'y a pas de notion d'avant plan, d'arrière-plan.etc. L'axe Z permettrai de simuler comme des calques et avoir des élément de GUi qui se supperpose.


    D'ailleurs il me semble que sous Ogre la GUI est en 3D.

    voila

    Alors qu'en pensez vous ?
    ++

  2. #2
    Membre éclairé
    Avatar de buggen25
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    554
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2008
    Messages : 554
    Points : 709
    Points
    709
    Par défaut
    Bonne année.
    Il me semble que des API comme OpenGL ou Direct3D consomme beaucoup de ressources, donc si on veut afficher des boutons en 3D et en rajouter des accés aux bases de données ça va etre limite au niveau des performances, Non ?
    If you type Google into Google, you Can break the internet" - The IT Crowd

  3. #3
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par buggen25 Voir le message
    Bonne année.
    Il me semble que des API comme OpenGL ou Direct3D consomme beaucoup de ressources, donc si on veut afficher des boutons en 3D et en rajouter des accés aux bases de données ça va etre limite au niveau des performances, Non ?
    C'est vrai qu'afficher des planes et des primitive de base c'est l'horreur. surtout avec les config actuel....

  4. #4
    Membre éclairé
    Avatar de buggen25
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    554
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2008
    Messages : 554
    Points : 709
    Points
    709
    Par défaut
    Citation Envoyé par dragonblood Voir le message
    C'est vrai qu'afficher des planes et des primitive de base c'est l'horreur. surtout avec les config actuel....
    Tu vois on achète un nouvel ordinateur et un an apres il devient obselete. exemple Oracle11g qui est une base de donnée bine connu, necessite 1 GO de RAM !!!!!! plus un utilisation demusuré de l'UC, alors si on se decide a ajouter des glVertex3f(,,) ou des IDirect3DDevice9 on serait vite saturé au niveau des resources.
    On voit bien que les logiciels depasse tres vite les ressources materiel, donc pouvoir un jour utiliser des API 3D pour des GUI serait vraiment chimèrique
    If you type Google into Google, you Can break the internet" - The IT Crowd

  5. #5
    Invité
    Invité(e)
    Par défaut
    j'ai précisé dans le cadre d'un jeu (hormis MMO), pour un OS je comprendrais a la limite.j'ai pas non plus parlé de base de donné dans mon poste alors je vois pas pourquoi tu reste focalisé la dessus

    Tu vois on achète un nouvel ordinateur et un an apres il devient obselete. exemple Oracle11g qui est une base de donnée bine connu, necessite 1 GO de RAM !!!!!! plus un utilisation demusuré de l'UC
    Dans ce cas c'est la base de donné le problème... Si on pouvait revenir au sujet

  6. #6
    Membre éclairé
    Avatar de buggen25
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    554
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2008
    Messages : 554
    Points : 709
    Points
    709
    Par défaut
    Okay, désolé je viens de comprendre
    Tu veux utiliser des objets 3D ( un maillage de ploygones ) pour faire une interface graphique utilisateur (GUI) au lieu d'utiliser des images .png.
    Je pense que c'est difficile d'afficher un text comme "Quitter la partie ?" avec un maillage 3D. Sans oublier que les cartes graphiques dispose d'une memoire limitée. Donc pourquoi sacrifier des polygones pour l'interface utilisateur au dépend des personnages et des environnements ?
    If you type Google into Google, you Can break the internet" - The IT Crowd

  7. #7
    Invité
    Invité(e)
    Par défaut
    Tu veux utiliser des objets 3D ( un maillage de ploygones ) pour faire une interface graphique utilisateur (GUI) au lieu d'utiliser des images .png.
    Non. J'utilise des primitive (des planes) qui affiche des png. On utilise toujours des images comme texture.

    Je pense que c'est difficile d'afficher un text comme "Quitter la partie ?" avec un maillage 3D.
    Je n'ai pas dit que j'allais utiliser de la 3D pour chaque élément lol. Tu ne visualise pas ce que je dis. Simplement utiliser des planes pour les fenetres et appliquer des png comme texure. Je ne vais pas faire le texte en 3D lol.


    Donc pourquoi sacrifier des polygones pour l'interface utilisateur au dépend des personnages et des environnements ?
    Etant donné qu'une plane (forme primitive de base) n'utilise qu'un seul polygone (2 triangle) je ne vois pas ou est le prob.

    Je pense que tu n'as pas bien compris mon post ou alors tu visualise mal mon idée et les raisons du pourquoi sont expliqué au tout début.

  8. #8
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    J'ai peur qu'à moins de faire très attention, les calculs de plaquage de texture sur un plan ne la fasse apparaître qu'un peu floutée, par rapport à un simple affichage d'images 2D. Et si de vraies possibilités 3D sont mises en oeuvre, j'ai peur que ce soit finalement moins simple pour l'utilisateur. Regarde dans un jeu 3D la difficulté quand tu dois cliquer sur un objet en 3D dans la scène par rapport à cliquer sur l'interface.

    Après, la question, c'est quels seraient les avantages ?

    - Ton truc d'opacité, je n'ai pas trop compris. Faire du picking 2D reste bien plus simple que de faire du picking 3D, même avec gestion de transparence.

    - Résolution, pourquoi pas, mais on peut aussi appliquer ça sur des images 2D, en le redimensionnant une bonne fois pour toute au changement de résolution, et on peut même le faire avec des algorithmes plus coûteux et de meilleure qualité. Mais ce n'est pas forcément évident. Si j'augmente la résolution, ce n'est pas forcément pour que l'IHM prennet proportionellement la même place à l'écran, mais peut-être pour avoir une plus grande zone active.

    - Le Z-order existe dans tout système 2D, c'est l'ordre de dessin...
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  9. #9
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    ???
    ce n'est pas ce que fait CEGUI??

    Sinon les framework évolué comme Qt te permette de faire des ihm sur des fenêtres OpenGl :

    http://labs.trolltech.com/blogs/2008...s-with-opengl/
    http://labs.trolltech.com/blogs/2008...sion-wolfenqt/

  10. #10
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    C'est ce que font tous (ou presque) les moteurs de jeu ... utilisation du module "3D" par le module "GUI" ...
    Rien de bien compliqué à faire (sans parler des possibilités d'animations de boutons et d'effets spéciaux).
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  11. #11
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Ben +1...
    Tu n'as pas vraiment inventé la poudre sur le coup, hein, dragonblood. C'est très courant comme approche.

    Certains jeux vont même plus loin, ils profitent du menu pour initialiser leur moteur 3D, et c'est des vrais niveau du jeu qui tournent en arrière-plan, sous le texte. (Half-Life 2, Far Cry, Psychonauts)...

    Je n'en ai jamais codé personnellement, mais je suppose qu'il faut:

    1) Tracer la scène en arrière plan
    2) Mettre la caméra en mode orthographique, en se débrouillant pour que les coordonnées de la souris correspondent avec les x, y du repère monde.
    3) Tracer quelques quads en z = 0 avec des textures pour le menu.
    4) ???
    5) Profit

    Plus sérieusement, si tu veux coder ta GUI de A à Z je recommande de lire ce tutorial au moins jusqu'à l'item 3, puis d'étudier le code source fourni avec. Pour ce que je me souviens, il est simple, clair, bien fichu et permet de construire une GUI sur des bases saines.

    Cependant...

    Moi j'utilise irrlicht
    Ben pourquoi s'embêter alors
    Irrlicht possède déjà un GUI Editor non ?

  12. #12
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Bon, par curiosité je suis allé voir le code source d'Irlicht. Il ressemble très fortement au code donné avec le tutorial de Daniel Protopopov.

    Pour rajouter ses propres éléments de GUI, il semble que tout revient à dériver la classe GUIElement en réécrivant la fonction draw et OnEvent.

    Par exemple, supposons que l'on veuille utiliser un objet 3D, une boussole, comme un élément de GUI. Alors si j'ai bien compris il faut :

    Creer une classe GUIBoussole qui dérive de GUIElement

    Dans draw(), tracer l'objet boussole, en utilisant les fonctions habituelles d'irrlicht.

    Dans OnEvent() gérer la sélection à la souris. Pour un objet 3D, je suppose qu'il y a deux écoles : Soit tout en 3D, il faut alors lancer un rayon à partir du curseur de la souris vers le fond et traverser le graphe de scène des objets en testant la collision avec ce rayon (du "picking" à la souris). Soit tout en 2D, car on connait la forme de la boussole, son emplacement, et les coordonnées de la souris (la boussole ressemble à peu près à un cercle, la fonction de sélection est donc assez simple).

    Personnellement je prendrais sans hésiter la solution 2, sauf si Irrlicht possède une fonction de picking particulièrement simple à utiliser. Et surtout, surtout ne pas implémenter soi même la fonction de picking juste pour ça. C'est particulièrement pénible à faire.

    Autre chose, en farfouillant un peu, j'ai noté que l'affichage des éléments purement 2D de la widgeterie (Bloc de texte, bouton, boite de message, scrollbar) se réduit toujours à l'appel de la fonction draw2DImage, qui fait à peu près ce que j'énonçais dans le post précédent. Sans surprise, Irrlicht utilise donc bien son moteur 3D pour tracer la GUI.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    // dans COpenglDriver.cpp
    // extrait de la fonction draw2DImage()
     
     
    // Passe en mode orthographique
    setRenderStates2DMode(color.getAlpha()<255, true, useAlphaChannelOfTexture);
     
    // on trace un quad
    	glColor4ub(color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha());
    	glBegin(GL_QUADS);
     
    // sur lequel on colle une texture
    	glTexCoord2f(tcoords.UpperLeftCorner.X, tcoords.UpperLeftCorner.Y);
    	glVertex2f(GLfloat(poss.UpperLeftCorner.X), GLfloat(poss.UpperLeftCorner.Y));
     
    	glTexCoord2f(tcoords.LowerRightCorner.X, tcoords.UpperLeftCorner.Y);
    	glVertex2f(GLfloat(poss.LowerRightCorner.X), GLfloat(poss.UpperLeftCorner.Y));
     
    	glTexCoord2f(tcoords.LowerRightCorner.X, tcoords.LowerRightCorner.Y);
    	glVertex2f(GLfloat(poss.LowerRightCorner.X), GLfloat(poss.LowerRightCorner.Y));
     
    	glTexCoord2f(tcoords.UpperLeftCorner.X, tcoords.LowerRightCorner.Y);
    	glVertex2f(GLfloat(poss.UpperLeftCorner.X), GLfloat(poss.LowerRightCorner.Y));
     
    	glEnd();
    detail de setRenderStates2DMode() avec le passage en mode ortho

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    glMatrixMode(GL_PROJECTION);
     
    		const core::dimension2d<s32>& renderTargetSize = getCurrentRenderTargetSize();
    		core::matrix4 m;
    		m.buildProjectionMatrixOrthoLH(f32(renderTargetSize.Width), f32(-renderTargetSize.Height), -1.0, 1.0);
    		m.setTranslation(core::vector3df(-1,1,0));
    		glLoadMatrixf(m.pointer());
     
    		glMatrixMode(GL_MODELVIEW);
    		glLoadIdentity();
    		glTranslatef(0.375, 0.375, 0.0);

  13. #13
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    L'idéal c'est un GUI à la Dead Space.
    C'est autant de la 3D que ça peut l'être.
    Boost ftw

Discussions similaires

  1. Faire une TList avec des objets
    Par arkhamon dans le forum Langage
    Réponses: 3
    Dernier message: 11/03/2012, 00h04
  2. Pourquoi ne pas créer une table avec tout les champs ?
    Par marty499 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 07/07/2009, 17h18
  3. Réponses: 0
    Dernier message: 06/06/2009, 19h10
  4. Je n'arrive pas à faire ma requete avec jointure voulue
    Par yann123456 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 17/02/2009, 20h02
  5. [SQL-Server] Je n'arrive pas à faire tourner php avec Sql server (2005)
    Par bluecurve dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 01/03/2006, 18h50

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