我已经编写了这个函数,用于使用python和python OpenGL打印一些文本
def glut_print( x, y, font, text, r, g , b , a):
blending = False
if glIsEnabled(GL_BLEND) :
blending = True
#glEnable(GL_BLEND)
glColor3f(1,1,1)
glRasterPos2f(x,y)
for ch in text :
glutBitmapCharacter( font , ctypes.c_int( ord(ch) ) )
if not blending :
glDisable(GL_BLEND)
和渲染功能:
def Draw():
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT )
glut_print( 10 , 10 , GLUT_BITMAP_9_BY_15 , "Hallo World" , 1.0 , 1.0 , 1.0 , 1.0 )
# draw my scene ......
glutSwapBuffers()
结果什么都没有写,我正在查看我的几何和3D对象;但不是文本!问题出在哪里?
4条答案
按热度按时间gupuwyp21#
很多OpenGL程序员(包括我自己)都会被这个问题所困扰。
尽管glRasterPos看起来像是像素坐标,但它们实际上在使用之前是通过模型视图和投影矩阵进行转换的。如果你试图在3D空间中定位文本,这很有用,但当你想要某种覆盖控制台或HUD时,就不那么有用了。
解决这一问题的旧方法是同时推送投影和模型视图矩阵,将两者都设置为标识、绘制文本、弹出两者。
Mesa3D的Brian Paul认为这很愚蠢,他添加了一个新的调用glWindowPos,它在窗口中获取实际的像素坐标。它在OpenGL 1.4中成为了标准。用glWindowPos替换您的glRasterPos,看看这是否解决了问题。
kq4fsx7k2#
我已经通过像这样切换投影解决了问题:
打印完后,我又回到了普通的3D模型。
@拥抱...我也要试试glWindowPos
kzipqqlq3#
使用gutStrokeCharacter更好,字符可以旋转和缩放,因为它绘制线条来形成字符。
cdmah0mi4#
另一种解决方案(基于@Hugh Answer和版本PyOpenGL 3.1.6):
此外,对于Ubuntu 22.04,我必须
然后做
在您的.py文件中导入
OpenGL.GLUT
之前