Перемещение объектов на экране на основе пикселей с помощью glRasterPos () - PullRequest
4 голосов
/ 14 января 2010

У меня есть следующий код для визуализации текста в моем приложении, сначала я получаю координаты мыши в мире, а затем использую эти координаты, чтобы разместить текст в мире, чтобы он следовал моему положению мыши:

Редактировать: добавлена ​​функция buildfont () в примере кода:

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();

Но я хочу визуализировать многострочные тексты или тексты с «границами» (как в приведенном выше коде, который я пробовал) или текст с фоном (чтобы я мог лучше отличить их от фона) Так как мне это сделать?

Мне просто нужно знать, как я могу переместить его в пикселях, чтобы я мог точно изменить положение на моем экране БЕЗ использования 2-мерного проекции поверх моей 3D-визуализации ... Я просто хочу сделать это так просто, как возможно.

Я пытался нарисовать квадрат под текстом, но, конечно, он не работает, поскольку он все еще использует мировые координаты ... поэтому, когда я поворачиваю камеру, текст не перемещается по фону текста ... я боюсь, единственное решение - создать еще одну проекцию поверх трехмерной проекции ...

1 Ответ

2 голосов
/ 14 января 2010

Вот небольшой фрагмент кода, который я использую для визуализации отладочного текста в небольшом приложении:

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 и y - требуемые координаты окна строки. glutBitmapCharacter(GLUT_BITMAP_9_BY_15, ...) - это просто служебная функция от GLUT, которая отображает растровый символ размером 9 x 15 пикселей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...