3

私はpythonとpythonopenglでいくつかのテキストを印刷するためにこの関数を書きました

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

3 に答える 3

3

多くのOpenGLプログラマーがこれに巻き込まれます(私自身も含まれます)。

glRasterPosはピクセル座標をとるように見えますが、実際には、使用前にモデルビューと投影行列によって変換されます。テキストを3D空間に配置しようとしている場合に便利ですが、ある種のオーバーレイコンソールやHUDが必要な場合にはあまり役に立ちません。

これを回避する古い方法は、投影行列とモデルビュー行列の両方をプッシュし、両方をIDに設定し、テキストを描画し、両方をポップすることでした。

Mesa3DのBrianPaulは、これはばかげていると考え、ウィンドウ内の実際のピクセル座標を取得する新しい呼び出しglWindowPosを追加しました。OpenGL1.4程度で標準になりました。glRasterPosをglWindowPosに置き換えて、問題が解決するかどうかを確認します。

于 2012-10-11T22:37:31.497 に答える
0

私はこのように投影を切り替えることで解決しました:

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を試してみます

于 2012-10-12T06:24:46.013 に答える
0

gultStrokeCharacterを使用する方が適切です。線を描画して文字を形成するため、文字を回転および拡大縮小できます。

于 2019-11-04T14:02:23.730 に答える