2010-01-14 18 views
4

J'ai le code suivant pour rendre le texte dans mon application, d'abord je reçois les coordonnées de la souris dans le monde, puis utiliser ces coordonnées pour placer mon texte dans le monde, il suivra ma position de la souris:Déplacement d'objets à l'écran par pixel avec glRasterPos()

Edit: ajouté la fonction buildfont() dans l'exemple de code:

GLvoid BuildFont(GLvoid)        // Build Our Bitmap Font 
{ 
    HFONT font;          // Windows Font ID 
    HFONT oldfont;         // Used For Good House Keeping 

    base = glGenLists(96);        // Storage For 96 Characters 

    font = CreateFont( -12,       // Height Of Font 
         0,        // Width Of Font 
         0,        // Angle Of Escapement 
         0,        // Orientation Angle 
         FW_NORMAL,      // Font Weight 
         FALSE,       // Italic 
         FALSE,       // Underline 
         FALSE,       // Strikeout 
         ANSI_CHARSET,     // Character Set Identifier 
         OUT_TT_PRECIS,     // Output Precision 
         CLIP_DEFAULT_PRECIS,   // Clipping Precision 
         ANTIALIASED_QUALITY,   // Output Quality 
         FF_DONTCARE|DEFAULT_PITCH,  // Family And Pitch 
         "Verdana");      // Font Name (if not found, its using some other font) 

    oldfont = (HFONT)SelectObject(hDC, font);   // Selects The Font We Want 
    wglUseFontBitmaps(hDC, 32, 96, base);    // Builds 96 Characters Starting At Character 32 
    SelectObject(hDC, oldfont);       // Selects The Font We Want 
    DeleteObject(font);         // Delete The Font 
} 

GLvoid glPrint(const char *fmt, ...){ 
    char text[256]; 
    va_list ap; 
    if (fmt == NULL) return; 
    va_start(ap, fmt); 
     vsprintf(text, fmt, ap); 
    va_end(ap); 
    glPushAttrib(GL_LIST_BIT); 
    glListBase(base - 32); 
    glCallLists(strlen(text), GL_UNSIGNED_BYTE, text); 
    glPopAttrib(); 
} 

... 

glPushMatrix(); 
    glColor4f(0,0,0,1); 
    // X-1 wont work because these are the world coordinates: 
    glRasterPos2d(MousePosX-1, MousePosY); 
    glPrint("TEST"); 

    glColor4f(1,1,0,1); 
    glRasterPos2d(MousePosX, MousePosY); 
    glPrint("TEST"); 
glPopMatrix(); 

Mais je veux rendre textes multilignes, ou des textes avec des "frontières" (comme dans le code ci-dessus j'ai essayé) ou texte avec le fond (ainsi je pourrais les distinguer mieux de l'arrière - plan) So ho w je fais ça? J'ai juste besoin de savoir comment je peux le déplacer en pixels, donc je pourrais modifier précisément la position sur mon écran SANS utiliser la projection 2d sur ma projection de rendu 3D ... Je veux juste le rendre aussi simple possible.

J'ai essayé de dessiner un quad sous le texte, mais bien sûr cela ne fonctionne pas car il utilise toujours les coordonnées du monde ... alors quand je tourne mon appareil photo le texte ne bouge pas sur le fond du texte ... crains que la seule solution est de créer une autre projection sur le dessus de la projection 3D ...

+0

Ce qui est dans la liste d'affichage, je comprends que c'est une sorte de glyphes, mais comment la liste est-elle générée? –

+0

oh attends, j'ai édité maintenant mon premier post. Je ne pense pas que cela importe, puisque je veux dessiner des quads, etc, pas seulement la police ... –

Répondre

2

est ici un petit bout de code que j'utilise pour rendre un texte de débogage dans une petite application:

void 
renderText(float x, float y, const char* text) { 
    int viewport[4]; 
    glGetIntegerv(GL_VIEWPORT, viewport); 
    glMatrixMode(GL_PROJECTION); 
    glPushMatrix(); 
    glLoadIdentity(); 
    glOrtho(viewport[0], viewport[2], viewport[1], viewport[3], -1, 1); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    glRasterPos2f(x, viewport[3] - y); 
    const int length = (int)strlen(text); 
    for (int i = 0; i < length; ++i) { 
     glutBitmapCharacter(GLUT_BITMAP_9_BY_15, text[i]); 
    } 
    glMatrixMode(GL_PROJECTION); 
    glPopMatrix(); 
    glMatrixMode(GL_MODELVIEW); 
    glPopMatrix(); 
} 

x et y est les coordonnées de fenêtre souhaitées de la chaîne. glutBitmapCharacter(GLUT_BITMAP_9_BY_15, ...) est juste une fonction utilitaire de GLUT qui rend un grand caractère bitmap de 9 x 15 pixels.

+0

bien que c'est fondamentalement même que ce que j'utilise maintenant: une autre couche de "fenêtre" avec le mode de projection 2d sur le rendu 3D mode. –

+0

@Newbie Y a-t-il une raison particulière pour laquelle vous ne voulez pas avoir une projection séparée pour le texte? –

+0

je pensais qu'il pourrait y avoir une autre façon ... pas de problème, je vais juste utiliser la projection 2d sur le dessus de la 3d :) –