使用Glut和PYTHON打印文本

syqv5f0l  于 2022-09-26  发布在  Python
关注(0)|答案(4)|浏览(152)

我已经编写了这个函数,用于使用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对象;但不是文本!问题出在哪里?

gupuwyp2

gupuwyp21#

很多OpenGL程序员(包括我自己)都会被这个问题所困扰。

尽管glRasterPos看起来像是像素坐标,但它们实际上在使用之前是通过模型视图和投影矩阵进行转换的。如果你试图在3D空间中定位文本,这很有用,但当你想要某种覆盖控制台或HUD时,就不那么有用了。

解决这一问题的旧方法是同时推送投影和模型视图矩阵,将两者都设置为标识、绘制文本、弹出两者。

Mesa3D的Brian Paul认为这很愚蠢,他添加了一个新的调用glWindowPos,它在窗口中获取实际的像素坐标。它在OpenGL 1.4中成为了标准。用glWindowPos替换您的glRasterPos,看看这是否解决了问题。

kq4fsx7k

kq4fsx7k2#

我已经通过像这样切换投影解决了问题:

glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluOrtho2D(0.0, 1.0, 0.0, 1.0)
glMatrixMode(GL_MODELVIEW)

glut_print( 10 , 10 , GLUT_BITMAP_9_BY_15 , "Hallo World" , 1.0 , 1.0 , 1.0 , 1.0 )

打印完后,我又回到了普通的3D模型。

@拥抱...我也要试试glWindowPos

kzipqqlq

kzipqqlq3#

使用gutStrokeCharacter更好,字符可以旋转和缩放,因为它绘制线条来形成字符。

cdmah0mi

cdmah0mi4#

另一种解决方案(基于@Hugh Answer和版本PyOpenGL 3.1.6):

class TextView():
    def __init__(self, x, y, color):
        self.x= x
        self.y= y
        self.color= color

    def print(self, text):
        glColor3fv(self.color)
        glPushMatrix();
        glWindowPos2f(self.x, self.y)
        for ch in text :
            glutBitmapCharacter( GLUT_BITMAP_TIMES_ROMAN_24 , ctypes.c_int( ord(ch) ) )
        glPopMatrix();

此外,对于Ubuntu 22.04,我必须

sudo apt install libosmesa6 freeglut3-dev

然后做

import os
os.environ['PYOPENGL_PLATFORM'] = 'osmesa'

在您的.py文件中导入OpenGL.GLUT之前

相关问题