Я пытался добавить базовый HUD-подобный текст в мой проект OpenGL / C ++.
Поэтому я решил
glutBitmapCharacter( type, character)
быть моим оружием выбора.
Я понял, что для простоты использования я должен добавить 2D-матрицу к моей предыдущей области рендеринга.
glPushMatrix();
glLoadIdentity();
gluOrtho2D(0, 10, 0, 10);
Это должно дать мне приятный 10 * 10 2D куб для игры.
Теперь возникла проблема, когда glutBitmapCharacter запоминает свою последнюю позицию символа, чтобы добавить следующую. Довольно умный, пока он пишет строку, он, очевидно, запоминает эту позицию и заставляет мой текст летать по экрану один раз 🙂 Непослушный.
glRasterPos2f(x,y);
должно быть — как я слышал — нормальная вещь для сброса этой штуки — (хотя я не совсем понимаю, почему функция gl контролирует функцию glu, но это просто sidenote).
Теперь происходит странная вещь, когда я запускаю код:
glPushMatrix();
glLoadIdentity();
gluOrtho2D(0, 10, 0, 10);
string message ="mmh... Pie...";
float poss[3];
glRasterPos3f(0.0, 0.0, 0.0);
glGetFloatv(GL_CURRENT_RASTER_POSITION, poss);
std::cout<< "X" <<(GLfloat) poss[0] << " Y"<<poss[1] << " Z"<<poss[2] << std::endl;
for( size_t i = 0; i < message.size(); ++i ) {
glutBitmapCharacter(GLUT_BITMAP_HELVETICA_18, message[i]);
}
glPopMatrix();
Мой текст не отображается. На самом деле в результате X, Y и Z
(даже не уверен, что Z необходим .. должно быть 0 в любом случае) все inf (бесконечно).
Если я не установлю свой собственный glRasterPos, все будет хорошо, кроме того, что я уйду с экрана. Мои возвращающиеся позиции — повышающие X и 0, 0 — как ожидалось.
Так в чем же дело, что именно я делаю не так?
вы создали большую ошибку сегментации: glGetFloatv (GL_CURRENT_RASTER_POSITION, poss) возвращает 4 значения, поэтому вы должны использовать:
float poss[4];
Кроме того, ваш код отлично работает на моей машине и возвращает:
X0 Y0 Z0.5
Так что, похоже, ошибка не в коде, который вы разместили здесь. Тебе стоит попробовать&скопируйте его в простую программу «HelloWorld» -GL и посмотрите, работает ли он там. Будьте осторожны, что некоторые команды OpenGL работают только после инициализации корректной поверхности рисования — я полагаю, вы это сделали?
Других решений пока нет …