Ecrire du texte 2d sur anim 3d [Résolu]

Signaler
Messages postés
136
Date d'inscription
samedi 1 mai 2004
Statut
Membre
Dernière intervention
26 mai 2007
-
Messages postés
136
Date d'inscription
samedi 1 mai 2004
Statut
Membre
Dernière intervention
26 mai 2007
-
Bonjour,


J'ai une fenetre OpenGL sur laquel se dessine des briques en 3D. La
souris permet de tourner autour, zoomer, translater... bref les
fonctions habituelle que tout le monde connait lorsque l'on créer un
monde en 3D et qu'on veut se balader dedans.

J'aimerai cependant écrire une ligne de texte en bas a gauche de la
fenetre pour qu'il y soit tout le temps a cette endroit quelque soit la
rotation ou trnalsation effectué. Le texte doit etre collé a la fenetre
et non faire partie du monde... si vous voyez ce que je veux dire. un
peu comme la barre de vie dans un jeu qui reste toujours a sa place
pour qu'on la voit

Mon probleme c'est que soit mon texte ne s affiche pas, soit il ny a que le texte qui s affiche et pas mes briques!

Voici le code que j'ai ecrit:

GLvoid BuildFont(GLvoid)

{

    HFONT font;

    HFONT oldfont;


    FontDispList = glGenLists(RENDER_FONT_MAXCHAR);


    font = CreateFont(    -18,

                        0,

                        0,

                        0,

                        0,

                        false,

                        false,

                        false,

                        ANSI_CHARSET,

                        OUT_TT_PRECIS,

           
           
CLIP_DEFAULT_PRECIS,

           
           
ANTIALIASED_QUALITY,

           
           
FF_DONTCARE|DEFAULT_PITCH,

                        "Arial");


    oldfont = (HFONT)SelectObject(hDC, font);

    wglUseFontBitmaps(hDC, 0, RENDER_FONT_MAXCHAR-1, FontDispList);

    SelectObject(hDC, oldfont);

    DeleteObject(font);

}


GLvoid KillFont(GLvoid)

{

    glDeleteLists(FontDispList, RENDER_FONT_MAXCHAR);

}


GLvoid glPrint(int x, int y, const char *MyString, ...)

{

    char        text[256];

    va_list        ap;

    if(MyString == NULL)

        return;


    va_start(ap,MyString);

        vsprintf(text, MyString, ap);

    va_end(ap);


    glMatrixMode(GL_PROJECTION);

    glLoadIdentity();

    glMatrixMode(GL_MODELVIEW);

    glLoadIdentity();

    glViewport(x, y,0,0);

    glRasterPos4f(0,0,0,1);

    glPushAttrib(GL_LIST_BIT);

    glListBase(FontDispList);


    glCallLists(strlen(text), GL_UNSIGNED_BYTE, text);

    glPopAttrib();

}

int InitGL(GLvoid)       
           
    // All Setup For OpenGL Goes Here

{

    glShadeModel(GL_SMOOTH);            // Enables Smooth Shading

    glClearColor(0.5f,0.0f,0.0f,0.0f);    // Medium Red Background


    //DEPTH  BUFFER

    glClearDepth(1.0f);   
           
    // Depth Buffer Setup

    glEnable(GL_DEPTH_TEST);            // Enables Depth Testing

    glDepthFunc(GL_LEQUAL);   
            // The type of
Depth Test To Do


    //REALLY NICE PERSPECTIVE CALCULATION

    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);

    BuildFont();

   

    return TRUE;       
           
    // INITIALISATION WENT OK

}


int DrawGLScene(GLvoid)       
            // THIS IS
WHERE WE DO ALL THE DRAWING

{

    // CLEAR THE SCREEN AND THE DEPTH BUFFER

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glLoadIdentity();   
           
    // Reset the current modelview matrix

   

//ECRIRE MON TEXTE

    glPrint(2,2,"Coucou mon texte!!!");

   

    gluLookAt(0,0,eloignement,0,0,0,0,1,0);

    glTranslatef(position_x,0,0);

    glRotatef(orientation_x, 1.0f, 0.0f, 0.0f);

    glTranslatef(0,0,position_y);

    glRotatef(orientation_y, 0.0f, 1.0f, 0.0f);


    DrawQuads(floor1); // Fonction qui dessine mes briques


    DrawGrille();

    DrawAxes();

    return TRUE;       
           
    // Everything went ok

}


Mon KillFont est dnas mon KillGLWindow()


Merci beaucoup pour votre aide!

18 réponses

Messages postés
136
Date d'inscription
samedi 1 mai 2004
Statut
Membre
Dernière intervention
26 mai 2007

J'ai finalement trouvé!!!

Voici pour tout ceux qui aimerait savoir comment faire, un jolie tuto

http://glinfrench.apinc.org/article.php3?id_article=13


Je l'ai suivi et en 2 temps 3 mouvements ca a marché... enfin! pfiou!


Merci a toutes et a tous qui ont essayé de m'aider!
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Tu passes en perspective 2D après avoir afficher ta scène, tu désactives le zbuffer, et tu affiches ce que tu veux.
Messages postés
136
Date d'inscription
samedi 1 mai 2004
Statut
Membre
Dernière intervention
26 mai 2007

Et comment je fais ca?

Mes fonctions sont juste? Il me suffit dans DrawGLScene d afficher tout
ce queje veux, et a la fin de passer en perspective 2D, de desactiver
le zbuffer et ensuite ecrire mon texte?

Comment je pass en 2D et desactive le zbuffer?


Merci
Messages postés
136
Date d'inscription
samedi 1 mai 2004
Statut
Membre
Dernière intervention
26 mai 2007

Et comment je fais ca?

Mes fonctions sont juste? Il me suffit dans DrawGLScene d afficher tout
ce queje veux, et a la fin de passer en perspective 2D, de desactiver
le zbuffer et ensuite ecrire mon texte?

Comment je pass en 2D et desactive le zbuffer?


Merci
Messages postés
212
Date d'inscription
dimanche 3 avril 2005
Statut
Membre
Dernière intervention
28 mai 2011
1
passer en 2D utilise gluOrtho2D pour desactiver le test de profendeur :glDisable(GL_DEPTH_TEST)

n'oubli pas de le reactiver apres si non tes figures 3D seront traités sans le test de profendeur.
Messages postés
136
Date d'inscription
samedi 1 mai 2004
Statut
Membre
Dernière intervention
26 mai 2007

Merci vraiment pour ton aide, cependant ca ne fonctionne toujours pas, uniquement le texte s affiche en bas a droite!

Voici la fonction comme je l'ai reecrite apres tes indications


int DrawGLScene(GLvoid)       
            // THIS IS
WHERE WE DO ALL THE DRAWING
{
    // CLEAR THE SCREEN AND THE DEPTH BUFFER
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glLoadIdentity();   
           
    // Reset the current modelview matrix
 
    gluLookAt(0,0,eloignement,0,0,0,0,1,0);
    glTranslatef(position_x,0,0);
    glRotatef(orientation_x, 1.0f, 0.0f, 0.0f);
    glTranslatef(0,0,position_y);
    glRotatef(orientation_y, 0.0f, 1.0f, 0.0f);

    DrawQuads(floor1); // Fonction qui dessine mes briques

    DrawGrille();
    DrawAxes();


    gluOrtho2D(0.0,640.0,480.0,10.0);

    glDisable(GL_DEPTH_TEST);

    glPrint(2,2,"coucou Mon texte");


    glEnable(GL_DEPTH_TEST);



    return TRUE;   
           
        // Everything went ok
}
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Fait attention a la matrice que tu transformes !

    DrawGrille();
    DrawAxes();

glLoadIdentity();

glMatrixMode(GL_PROJECTION);

glPushMatrix();

    glLoadIdentity();

    gluOrtho2D(0.0,640.0,480.0,10.0);


    glDisable(GL_DEPTH_TEST);
    glPrint(2,2,"coucou Mon texte"); <= elle sort d'ou cette fonction, une création perso ?


glPopMatrix();


glMatrixMode(GL_MODELVIEW);
    glEnable(GL_DEPTH_TEST);

    return TRUE;   
           
        // Everything went ok
Messages postés
136
Date d'inscription
samedi 1 mai 2004
Statut
Membre
Dernière intervention
26 mai 2007

Ca ne marche pas! :(

La fonction glPrint vient d'un code source de ce site , le
win32_3Dviewer, je l'ai integré dans mon code en suivant le tuto nehe
en plus!
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
gluOrtho2D(0.0,640.0,0.0,480.0); <= plutot non ?


ET puis essai d'afficher un polygon en 2D avant d'essayer ton texte pour vérifier que ca marche bien.
Messages postés
136
Date d'inscription
samedi 1 mai 2004
Statut
Membre
Dernière intervention
26 mai 2007

jpense que si j arrivai a afficher un truc simple en 2D j arriverai le texte! :)
Messages postés
136
Date d'inscription
samedi 1 mai 2004
Statut
Membre
Dernière intervention
26 mai 2007

j'ai reussi l affichage d'un rectangle 2D qui reste en place meme si la camera se deplace


en ajoutant a la fin de mon DrawGLScene()


    glDepthFunc(GL_ALWAYS);       

    glLoadIdentity();   

    glBegin(GL_QUADS);

        glVertex3f(0.23f, -0.4f,-1.0f);

        glVertex3f(0.53f, -0.4f,-1.0f);

        glVertex3f(0.53f, -0.25f,-1.0f);

        glVertex3f(0.23f, -0.25f,-1.0f);

    glEnd();       

    glDepthFunc(GL_LEQUAL);

Seulement ca ne m 'aide pas pour le reste, j'ai essayé pour le texte mais ca ne marche toujour pas!


Quelqu'un a une solution ou sait comment ecrire du texte comme je cherche a le faire?
Messages postés
14958
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
26 mai 2020
91
Salut tout le monde,
Voici du code qui me permet d'écrire du texte 2D en OpenGL. Si cela peut t'aider Jojo...

// Affichage des données numériques
glDisable(GL_TEXTURE_2D);
glColor4f(1.0,1.0,1.0,1.0);

// Nombre de simplifications effectuées
string strsimpl("Nb Simplifications : ");
char simpls[6];
_itoa(m_NbSimplifications,simpls,10);
strsimpl.append(string(simpls));
glPushMatrix();
glLoadIdentity();
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho(-1.0,1.0,-1.0,1.0,-1.0,1.0);

glRasterPos2f(0.80,-0.96);
for (i=0;i<(int)strsimpl.size();i++)
{
  glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_10,strsimpl[i]);
}

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage
Messages postés
136
Date d'inscription
samedi 1 mai 2004
Statut
Membre
Dernière intervention
26 mai 2007

Je te remercie pour ton aide, mais il me manque certaine declaration telque "string" ou "strsimpl" ... elle sortent d ou?


Merci pour ton aide Buno, en esperant que ca fonctionnera bien sur mon truc :D
Messages postés
14958
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
26 mai 2020
91
string se trouve dans la STL (Standard Template Library). Il faut rajouter en début de fichier:
#include <string>
using namespace std;

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage
Messages postés
136
Date d'inscription
samedi 1 mai 2004
Statut
Membre
Dernière intervention
26 mai 2007

marche po :(
Messages postés
14958
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
26 mai 2020
91
???
Quels sont les messages d'erreur?
Bien entendu, il faut adapter le code à tes besoins...

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage
Messages postés
136
Date d'inscription
samedi 1 mai 2004
Statut
Membre
Dernière intervention
26 mai 2007

bah y a plusieur param qu'il ne reconnait pas!

error C2065: 'm_NbSimplifications' : undeclared identifier

error C2065: 'glutBitmapCharacter' : undeclared identifier

error C2065: 'GLUT_BITMAP_TIMES_ROMAN_10' : undeclared identifier
Messages postés
14958
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
26 mai 2020
91
- le 1er, c'est normal, c'est un morceau de mon code qu'il faut adapter
- pour les 2 autres, j'utilise glut (GL Utility Toolkit), une extension d'OpenGL qui facilite le dev

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage