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

0

Решение

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

Прежде всего, вы не делаете это на Unix, но, скорее всего, используете X11. Также я уверен, что ваша ОС — это вариант Linux, который не Unix (a… 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. Матрицы просмотра модели и проекции имеют свои собственные стеки в OpenGL и должны передаваться / извлекаться по отдельности.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]