python - 为什么我的 OpenGL 程序无法加载 GLUT 位图字体?

标签 python opengl glut pyopengl opengl-compat

我想在 OpenGL 中的 3D 环境的 HUD 上显示一些简单的文本。 所有消息来源都说我应该使用 GLUT 中包含的位图字体,但是,我的程序似乎无法查找/加载字体。

我已经包含了所有正确的库,并仔细检查了 fonts.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 shows an error for 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 环境前面。

最佳答案

问题不是第一个参数GLUT_BITMAP_TIMES_ROMAN_24,而是第二个参数text[i]。参数为glutBitmapCharacter必须是整数值 (int),代表字符。
该字符必须通过 ord 转换为普通数字 (int) :

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

for c in text:
    glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, ord(c))
<小时/>

如果文本没有出现在屏幕上,则出于调试原因重置投影和模型 View 矩阵并在位置 (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()

另请参阅Immediate mode and legacy OpenGL

关于python - 为什么我的 OpenGL 程序无法加载 GLUT 位图字体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55957159/

相关文章:

c - glFlush() 不显示任何内容

python - 如何使用 Python Wand/ImageMagick 将 PSD 转换为 PNG?

python - Scrapy的爬虫中间件和下载器中间件有什么区别?

python - 如何在pygame和pyopengl中独立旋转2个对象

java - JOGL绘制VBO黑屏

java - 圆弧方程 - 了解速度?

python - Python 中的截断路径

python - mro 方法和类的 __mro__ 属性有什么区别?

c - 我如何在 cygwin 中链接到 glut32?

c++ - 如何在同一屏幕上将一个 OpenGL 窗口分成多个窗口?