【问题标题】:Displaying fixed location 2D text in a 3D OpenGL world using GLUT使用 GLUT 在 3D OpenGL 世界中显示固定位置的 2D 文本
【发布时间】:2013-09-17 10:14:45
【问题描述】:

我有一个 OpenGL 项目,它使用 GLUT(不是 freeglut),我想在固定位置的视口上显示 2D 文本。我的其余对象都在 3D 世界坐标中。

This answer 对一个相关的旧问题说,

GLUT 附带的位图字体是简单的 2D 字体,不适合在 3D 环境中显示。但是,它们非常适合需要覆盖在显示窗口上的文本。

我已经尝试了接受的答案中概述的方法,但它没有给我想要的输出。下面是显示函数的一段代码sn-p:

void display()
{
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

  glLoadIdentity();  
  glTranslatef(0.0, 0.0, -(dis+ddis));   //Translate the camera
  glRotated(elev+delev, 1.0, 0.0, 0.0);  //Rotate the camera
  glRotated(azim+dazim, 0.0, 1.0, 0.0);  //Rotate the camera

       .
       .
       .
  draw 3D scene
       .
       .
       .

  glMatrixMode(GL_PROJECTION);
  glPushMatrix();
  glLoadIdentity();
  gluOrtho2D(0.0, win_width, 0.0, win_height);
  glMatrixMode(GL_MODELVIEW);
  glPushMatrix();
  glLoadIdentity();
  glRasterPos2i(10, 10);
  string s = "Some text";
  void * font = GLUT_BITMAP_9_BY_15;
  for (string::iterator i = s.begin(); i != s.end(); ++i)
  {
    char c = *i;
    glColor3d(1.0, 0.0, 0.0);
    glutBitmapCharacter(font, c);
  }
  glMatrixMode(GL_MODELVIEW);
  glPopMatrix();
  glMatrixMode(GL_PROJECTION);
  glPopMatrix();

  glFlush();
  glSwapBuffers();
}

similar question 似乎已被问及我想要什么,但作者没有接受任何答案。

一般来说,答案似乎建议使用其他库(主要是操作系统特定的)来实现覆盖。但是,没有明确的迹象表明单独使用GLUT 是否可以实现这一点。能做到吗?

【问题讨论】:

  • 好吧,如果它旋转,您在glLoadIdentity()glutBitmapCharacter 之间有一些对glRotatefglMultMatrix 的调用。您应该只渲染您的 3D 场景,然后执行您发布的第一个答案所建议的一切。
  • 我已经尝试过了,但这会覆盖渲染的 3D 场景,并且只是在空白屏幕中显示文本。
  • 您不应该在两者之间致电 glClearswapBuffers。我们可以继续猜测问题是什么,或者您可以发布一个最小的代码示例来说明什么不起作用。
  • 您发布的代码对我有用,您的问题似乎出在其他地方。
  • 当你说它有效时,你是否在绘制 3D 场景并旋转相机时仍然得到覆盖?

标签: c++ opengl glut


【解决方案1】:

我在使用 glut 创建太阳系模型时遇到了同样的问题。这是我解决它的方法:(使用上面的代码)

glDisable(GL_TEXTURE_2D); //added this
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
gluOrtho2D(0.0, win_width, 0.0, win_height);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glRasterPos2i(10, 10);
string s = "Some text";
void * font = GLUT_BITMAP_9_BY_15;
for (string::iterator i = s.begin(); i != s.end(); ++i)
{
  char c = *i;
  glColor3d(1.0, 0.0, 0.0);
  glutBitmapCharacter(font, c);
}
glMatrixMode(GL_PROJECTION); //swapped this with...
glPopMatrix();
glMatrixMode(GL_MODELVIEW); //...this
glPopMatrix();
//added this
glEnable(GL_TEXTURE_2D);


你会注意到我在接近尾声时切换了glMatrixMode(GL_PROJECTION);glMatrixMode(GL_MODELVIEW);。我决定这样做是因为this website。我还必须用glDisable(GL_TEXTURE_2D)glEnable(GL_TEXTURE_2D) 包围代码部分。

希望有帮助 - 我为我工作。我的太阳系使用类来执行所有这些,我很乐意应要求分享更多详细信息。

【讨论】:

    【解决方案2】:

    正如我所说,您发布的代码运行良好。这是我用来测试它的代码:

    #ifdef __APPLE__
    #include <GLUT/glut.h>
    #else
    #include <GL/glut.h>
    #endif
    
    #include "GL/glu.h"
    //glm not required
    //#include <glm.hpp>
    //#include <gtc/matrix_transform.hpp>
    #include <string>
    
    int win_width = 500, win_height = 500;
    
    void renderScene(void) {
    
        static float dis=0, ddis=0, elev=0, delev=0, azim=0, dazim=0;
    
        azim += 0.5f;
        if (azim >= 360.0f){
            azim -= 360.0f;
        }
    
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
        glLoadIdentity();
        glTranslatef(0.0f, 0.0f, -(dis + ddis));
        glRotated(elev + delev, 1.0, 0.0, 0.0);
        glRotated(azim + dazim, 0.0, 1.0, 0.0);
        glScalef(2.0f,2.0f,2.0f);
    
        glBegin(GL_TRIANGLES);
            glColor3f(1.0f, 1.0f, 0.0f);
            glVertex3f(-0.5f, -0.5f, 0.0f);
            glColor3f(0.0f, 1.0f, 0.0f);
            glVertex3f(0.5f, 0.0f, 0.0f);
            glColor3f(0.0f, 0.0f, 1.0f);
            glVertex3f(0.0f, 0.5f, 0.0f);
        glEnd();
    
    
        glMatrixMode(GL_PROJECTION);
        glPushMatrix();
        glLoadIdentity();
        //I like to use glm because glu is deprecated
        //glm::mat4 orth= glm::ortho(0.0f, (float)win_width, 0.0f, (float)win_height);
        //glMultMatrixf(&(orth[0][0]));
        gluOrtho2D(0.0, win_width, 0.0, win_height);
        glMatrixMode(GL_MODELVIEW);
        glPushMatrix();
        glLoadIdentity();
        glColor3f(1.0f, 0.0f, 0.0f);//needs to be called before RasterPos
        glRasterPos2i(10, 10);
        std::string s = "Some text";
        void * font = GLUT_BITMAP_9_BY_15;
    
        for (std::string::iterator i = s.begin(); i != s.end(); ++i)
        {
            char c = *i;
            //this does nothing, color is fixed for Bitmaps when calling glRasterPos
            //glColor3f(1.0, 0.0, 1.0); 
            glutBitmapCharacter(font, c);
        }
        glMatrixMode(GL_MODELVIEW);
        glPopMatrix();
        glMatrixMode(GL_PROJECTION);
        glPopMatrix();
        glEnable(GL_TEXTURE_2D);
    
        glutSwapBuffers();
        glutPostRedisplay();
    }
    
    int main(int argc, char **argv) {
    
        // init GLUT and create Window
        glutInit(&argc, argv);
        glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
        glutInitWindowPosition(100, 100);
        glutInitWindowSize(win_width, win_height);
        glutCreateWindow("GLUT Test");
    
        // register callbacks
        glutDisplayFunc(renderScene);
    
        // enter GLUT event processing cycle
        glutMainLoop();
    
        return 1;
    }
    

    关于已弃用的固定功能管道和其他的常见免责声明适用。

    【讨论】:

    • 感谢您的代码。它帮助我调试了我的程序。我还没有准确地找到问题所在,但是我绘制的 3D 场景似乎存在一些问题。接受这个,因为它回答了问题。
    【解决方案3】:

    有一个棘手的方法可以解决您的问题。

    请在调用函数之前编写代码或如下所示:

    glutBitmaCharacter(font, ' ');// 
    

    是吗……!它应该可以工作......

    【讨论】:

      猜你喜欢
      • 2015-05-27
      • 1970-01-01
      • 2020-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-22
      • 1970-01-01
      相关资源
      最近更新 更多