Ecrire du texte 2d sur anim 3d

Résolu
jojomillenium Messages postés 136 Date d'inscription samedi 1 mai 2004 Statut Membre Dernière intervention 26 mai 2007 - 16 oct. 2006 à 20:32
jojomillenium Messages postés 136 Date d'inscription samedi 1 mai 2004 Statut Membre Dernière intervention 26 mai 2007 - 17 oct. 2006 à 12:45
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

jojomillenium Messages postés 136 Date d'inscription samedi 1 mai 2004 Statut Membre Dernière intervention 26 mai 2007
17 oct. 2006 à 12:45
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!
3
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
16 oct. 2006 à 21:01
Tu passes en perspective 2D après avoir afficher ta scène, tu désactives le zbuffer, et tu affiches ce que tu veux.
0
jojomillenium Messages postés 136 Date d'inscription samedi 1 mai 2004 Statut Membre Dernière intervention 26 mai 2007
16 oct. 2006 à 21:36
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
0
jojomillenium Messages postés 136 Date d'inscription samedi 1 mai 2004 Statut Membre Dernière intervention 26 mai 2007
16 oct. 2006 à 21:36
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
goast_tu Messages postés 212 Date d'inscription dimanche 3 avril 2005 Statut Membre Dernière intervention 28 mai 2011 2
16 oct. 2006 à 22:29
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.
0
jojomillenium Messages postés 136 Date d'inscription samedi 1 mai 2004 Statut Membre Dernière intervention 26 mai 2007
16 oct. 2006 à 22:41
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
}
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
16 oct. 2006 à 23:31
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
0
jojomillenium Messages postés 136 Date d'inscription samedi 1 mai 2004 Statut Membre Dernière intervention 26 mai 2007
16 oct. 2006 à 23:38
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!
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
17 oct. 2006 à 00:20
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.
0
jojomillenium Messages postés 136 Date d'inscription samedi 1 mai 2004 Statut Membre Dernière intervention 26 mai 2007
17 oct. 2006 à 00:23
jpense que si j arrivai a afficher un truc simple en 2D j arriverai le texte! :)
0
jojomillenium Messages postés 136 Date d'inscription samedi 1 mai 2004 Statut Membre Dernière intervention 26 mai 2007
17 oct. 2006 à 09:21
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?
0
BunoCS Messages postés 15304 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 27 septembre 2022 103
17 oct. 2006 à 10:00
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
0
jojomillenium Messages postés 136 Date d'inscription samedi 1 mai 2004 Statut Membre Dernière intervention 26 mai 2007
17 oct. 2006 à 11:51
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
0
BunoCS Messages postés 15304 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 27 septembre 2022 103
17 oct. 2006 à 12:04
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
0
jojomillenium Messages postés 136 Date d'inscription samedi 1 mai 2004 Statut Membre Dernière intervention 26 mai 2007
17 oct. 2006 à 12:09
marche po :(
0
BunoCS Messages postés 15304 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 27 septembre 2022 103
17 oct. 2006 à 12:11
???
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
0
jojomillenium Messages postés 136 Date d'inscription samedi 1 mai 2004 Statut Membre Dernière intervention 26 mai 2007
17 oct. 2006 à 12:14
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
0
BunoCS Messages postés 15304 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 27 septembre 2022 103
17 oct. 2006 à 12:23
- 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
0