Почему моя программа OpenGL не может загрузить растровые шрифты GLUT? - PullRequest
1 голос
/ 02 мая 2019

Я хочу отобразить простой текст в HUD моей 3D-среды в OpenGL.Все источники говорят, что я должен использовать растровые шрифты, включенные в GLUT, однако моя программа не может найти / загрузить шрифты.

Я включил все правильные библиотеки и дважды проверил, что шрифтыФайл .py определенно находится в каталоге ... \ Python37 \ ... \ OpenGL \ GLUT \, но когда я набираю GLUT_BITMAP_TIMES_ROMAN_24 (или любой другой растровый шрифт), он выделяется как ошибка в моем коде.

Это функция, которую я вызываю для отображения текста:

def text(self, x, y, r, g, b, text):

    glColor3f(r, g, b)

    glRasterPos2f(x, y)

    for i in range(len(text)):
        glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, text[i])

И вот как я вызываю функцию:

epoch_str = "Epoch: {0}".format(self.epoch)

self.text(x, y, 1.0, 1.0, 1.0, epoch_str)

Как уже упоминалось, GLUT_BITMAP_TIMES_ROMAN_24 подсвечивается в моей IDE (PyCharm) как ошибка, и я получаю следующую ошибку, если пытаюсь ее запустить:

C:\Users\mickp\AppData\Local\Programs\Python\Python37\python.exe C:/Users/mickp/PycharmProjects/Test/U_Matrix.py
Traceback (most recent call last):
  File "C:\Users\mickp\AppData\Local\Programs\Python\Python37\lib\site-packages\OpenGL\GLUT\special.py", line 130, in safeCall
    return function( *args, **named )
  File "C:/Users/mickp/PycharmProjects/Test/U_Matrix.py", line 142, in render
    self.text(x, y, 1.0, 1.0, 1.0, epoch_str)
  File "C:/Users/mickp/PycharmProjects/Test/U_Matrix.py", line 79, in text
    glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, text[i])
ctypes.ArgumentError: argument 2: <class 'TypeError'>: wrong type
GLUT Display callback <bound method U_MATRIX.render of <__main__.U_MATRIX object at 0x000002877FF45438>> with (),{} failed: returning None argument 2: <class 'TypeError'>: wrong type

Process finished with exit code 1

Я действительно не понимаю, в чем может быть проблема?

Редактировать: вышеуказанная ошибка была исправлена, это была отдельная проблема.Основная проблема с GLUT_BITMAP_TIMES_ROMAN_24 все еще существует.См .: IDE показывает ошибку для GLUT_BITMAP_TIMES_ROMAN_24

Редактировать 2: Полный код (это не слишком долго):

Редактировать 3: Удален полный код (это было слишкомдолго).Добавление следующего исправило мою проблему:

# added before
glMatrixMode(GL_PROJECTION)
glPushMatrix()
glLoadIdentity()
gluOrtho2D(0.0, width, 0.0, height)
glMatrixMode(GL_MODELVIEW)
glPushMatrix()
glLoadIdentity()

# these two lines were here
epoch_str = "Epoch: {0}".format(self.epoch)
self.text(x+10, y+10, 0.0, 1.0, 0.0, epoch_str)

# added after
glMatrixMode(GL_MODELVIEW)
glPopMatrix()
glMatrixMode(GL_PROJECTION)
glPopMatrix()
glEnable(GL_TEXTURE_2D)

Текст на самом деле был просто скрыт, поскольку я рендерил его в 3D-среду за объектом, а не перед 3D-средой.

1 Ответ

0 голосов
/ 02 мая 2019

Проблема не в первом параметре GLUT_BITMAP_TIMES_ROMAN_24, а во втором параметре text[i]. Параметр glutBitmapCharacter должен быть целым значением (int), представляющим символ.
Символ должен быть преобразован в обычное число (int) на ord:

glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, ord(text[i]))

или

for c in text:
    glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, ord(c))

Если текст не появляется на экране, сбросьте матрицу проекции и вида модели и нарисуйте текст в позиции (0, 0) по причинам отладки:

glMatrixMode(GL_PROJECTION)
glPushMatrix()
glLoadIdentity()

glMatrixMode(GL_MODELVIEW)
glPushMatrix()
glLoadIdentity()

self.text(0.0, 0.0, 1.0, 1.0, 1.0, epoch_str)

glMatrixMode(GL_PROJECTION)
glPopMatrix()

glMatrixMode(GL_MODELVIEW)
glPopMatrix()
...