Растровые шрифты GLUT имеют неожиданное положение

Я делаю игру в OpenGL, используя GLUT в UNIX. Это 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);
}

person Olin    schedule 11.06.2013    source источник


Ответы (1)


Я делаю игру в OpenGL, используя GLUT в UNIX.

Прежде всего, вы делаете это не в 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, но у него есть pushMatrix и popMatrix, и если я предполагаю, что это просто glPushMatrix и glPopMatrix, тогда ваш код ошибается

glPushMatrix();
glLoadIdentity()

…

glPopMatrix();

блок, действующий на матрицу Modelview. Матрицы Modelview и Projection имеют свои собственные стеки в OpenGL и должны перемещаться/извлекаться отдельно.

person datenwolf    schedule 11.06.2013