Я делаю игру в 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);
}
Я делаю игру в 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 и должны передаваться / извлекаться по отдельности.
Других решений пока нет …