过剩的位图字体有意想不到的位置

GLUT bitmap fonts have unexpected position

本文关键字:意想不到 位置 位图 字体      更新时间:2023-10-16

我正在使用UNIX上的GLUT在OpenGL中制作游戏。这是一款3D游戏,玩家可以左右移动(x轴),跳跃(y轴),不断前进,必须避免迎面而来的障碍(在我的执行中,玩家实际上是静止不动,而世界不断向玩家移动)。

我在尝试绘制带有位图文本的HUD时遇到了麻烦。我曾尝试创建一个正交视图,然后绘制文本,但它总是在x轴上的随机点结束,并不断向z轴上的玩家移动。一旦它经过玩家,它就会消失(游戏邦注:这是所有世界对象为了减少处理而发生的情况)。我想让文本在一个地方,并留在那里。

gameSpeed = Accumulator*6;
DrawRobot(); //player
ModelTrans.loadIdentity(); //ModelTrans has helper functions to manipulate
ModelTrans.pushMatrix();   //the current matrix stack
ModelTrans.translate(vec3(0, 0, -gameSpeed)); //move the whole world

…然后我绘制了一些游戏对象…

这里我尝试做一些位图字体。禁用深度测试有助于将文本放在所有其他对象的前面,但创建正交视图的其他代码实际上可以被注释掉,我仍然会遇到同样的问题。

ModelTrans.popMatrix();
glDisable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
ModelTrans.pushMatrix();
glLoadIdentity();
gluOrtho2D(0, WindowWidth, 0, WindowHeight);
glScalef(1, -1, 1);
glTranslatef(0, -WindowHeight, 0);
glMatrixMode(GL_MODELVIEW);
std::string str = "sup";
renderBitmapString(0.5 + xText, 5.0, GLUT_BITMAP_HELVETICA_18, str);
//xText adjusts for the moving left and right of the player
glMatrixMode(GL_PROJECTION);
ModelTrans.popMatrix();
glMatrixMode(GL_MODELVIEW);
glUseProgram(0);
glutSwapBuffers();
glutPostRedisplay();
printOpenGLError();

下面是一些可能有用的代码:

void renderBitmapString(float x, float y, void *font, std::string s)
{
   glRasterPos2f(x, y);
   for (string::iterator i = s.begin(); i != s.end(); ++i)
   {
      char c = *i;
      glutBitmapCharacter(font, c);
   }
}
void Timer(int param)
{
    Accumulator += StepSize * 0.001f;
    glutTimerFunc(StepSize, Timer, 1);
}
void Reshape(int width, int height)
{
    WindowWidth = width;
    WindowHeight = height;
    glViewport(0, 0, width, height);
}

我正在使用UNIX上的GLUT在OpenGL中制作游戏

首先,您不是在Unix上进行操作,而很可能使用X11。我也很确定你的操作系统是Linux的一个变种,它是而不是 Unix(嗯…BSD将是一个真正的Unix)。

无论如何,在这个代码片段中,您调整的是投影,而不是模型视图矩阵

glMatrixMode(GL_PROJECTION);
ModelTrans.pushMatrix();
glLoadIdentity();
gluOrtho2D(0, WindowWidth, 0, WindowHeight);
glScalef(1, -1, 1);
glTranslatef(0, -WindowHeight, 0);
glMatrixMode(GL_MODELVIEW);
std::string str = "sup";
renderBitmapString(0.5 + xText, 5.0, GLUT_BITMAP_HELVETICA_18, str);
//xText adjusts for the moving left and right of the player
glMatrixMode(GL_PROJECTION);
ModelTrans.popMatrix();
glMatrixMode(GL_MODELVIEW);

我不完全确定ModelTrans是什么,但它有pushMatrixpopMatrix,如果我假设,这些只是glPushMatrixglPopMatrix,那么你的代码中有一个

glPushMatrix();
glLoadIdentity()
…
glPopMatrix();

块作用于Modelview矩阵。模型视图和投影矩阵在OpenGL中有自己的堆栈,必须单独推送/弹出