2017-06-09 22 views
2

私は3つのボタンを持つメインメニューを作成しました。最初の2つのボタンは2Dグラフをプロットします。 "backspace"または "escape"を押すと、3つのボタンでメインメニューに戻ります。最後の(3番目の)ボタンは、STLファイルから3Dメッシュをプロットします。 main menu ____________________ 図1:メインメニュー。 ____________________ A button pressed. ____________________ 図2:「A」ボタンが押されたとき。 ____________________ B button pressed. ____________________________ 図3: "3D" ボタンがOpenGLとpygameで3Dメッシュの後に2D画像をプロットするには?

_____________________問題をを押すと:私は非常に簡単にナビゲートすることができ、 "B" ボタンが _____________________ 3D button pressed. ____________________________ 図4を押下第1ボタンと第2ボタンの間にあるが、私が少なくとも1回3Dメッシュをプロットしたら、もう1番目と2番目のボタンを押すことができる。 3Dメッシュをプロットする

コード:(残念ながら私は原因プライベートデータにコード全体をアップロードすることはできませんよ。)

def main(): 
pygame.init() 
pygame.display.set_mode(display, DOUBLEBUF|OPENGL) 

# Using depth test to make sure closer colors are shown over further ones 
glEnable(GL_DEPTH_TEST) 
glDepthFunc(GL_LESS) 

# Default view 
glMatrixMode(GL_PROJECTION) 
gluPerspective(45, (display[0]/display[1]), 0.5, 40) 
glTranslatef(0.0,0.0,-17.5) 



inc_x = 0 
inc_y = 0 
accum = (1,0,0,0) 

intro = True 
while intro: 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      pygame.quit() 
      quit() 


     if event.type == pygame.KEYDOWN: 
      #Rotating about the x axis 
      if event.key == pygame.K_UP: 
       inc_x = pi/100 
      if event.key == pygame.K_DOWN: 
       inc_x = -pi/100 

      # Rotating about the y axis 
      if event.key == pygame.K_LEFT: 
       inc_y = pi/100 
      if event.key == pygame.K_RIGHT: 
       inc_y = -pi/100 
      # Reset to default view 
      if event.key == pygame.K_SPACE: 
       accum = (1,0,0,0);inc_x = 0.0;inc_y = 0.0; 



      if event.key == K_BACKSPACE or event.key == pygame.K_ESCAPE: 
       intro = False; 

       glDisable(GL_DEPTH_TEST) 
       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_ACCUM_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 
       glMatrixMode(GL_MODELVIEW) 
       game_intro(); 



     if event.type == pygame.KEYUP: 
      # Stoping rotation 
      if event.key == pygame.K_UP or event.key == pygame.K_DOWN: 
       inc_x = 0.0 
      if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT: 
       inc_y = 0.0 

     if event.type == pygame.MOUSEBUTTONDOWN: 
      if event.button == 1: 
       inc_y = pi/100 

      if event.button == 3: 
       inc_y = -pi/100 

      if event.button == 4: 
       inc_x = pi/100 

      if event.button == 5: 
       inc_x = -pi/100 



    rot_x = normalize(axisangle_to_q((1.0,0.0,0.0), inc_x)) 
    rot_y = normalize(axisangle_to_q((0.0,1.0,0.0), inc_y)) 
    accum = q_mult(accum,rot_x) 
    accum = q_mult(accum,rot_y) 

    glMatrixMode(GL_MODELVIEW) 
    glLoadMatrixf(q_to_mat4(accum)) 

    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT) 
    triangle() 
    pygame.display.flip() 
    pygame.time.wait(10) 
    game_intro() 

問題についての私の考え:私は私を引き受けます私のアプリケーションでポリゴンをレンダリングすると深さテストとブレンドが有効になるため、問題があります。 深度テストとブレンドを無効にしようとしました。

  glDisable(GL_DEPTH_TEST) 
      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_ACCUM_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 
      glMatrixMode(GL_MODELVIEW) 
      game_intro(); 

はまた、私は通常の2Dモードに戻るために、同様の機能のglDrawPixelsとglCopyPixelsを使用しようとしましたが、それはうまくいきませんでした。

答えて

1

ボタンAとボタンBがスクリーンの平面内にプロットを描画するように呼びます(これは、オーログラフィック投影が必要な2Dレンダリングです)。コードに基づいて、ボタンCはコールをトリガーして3Dモデルをパースペクティブビューマトリックスでレンダリングします。

レンダリングコールを切り替えるときは、ビューマトリックスを適切にリセットする必要があります(ボタンA/Bレンダリングコードが呼び出される前に、オルソグラフィック投影マトリックスを設定する必要があります)。ボタンA/Bでトリガーされたレンダリングコードの前に、ビューマトリックスをオーログラフィック投影に設定するのを忘れているようです。したがって、ボタンCの結果の後にボタンAとボタンBを押すと、以前に設定されたパースペクティブ投影行列を使用してレンダリングを試みて、奇妙な結果が得られます。

正射影投影行列を作成し、2Dでレンダリングする前にロードする必要があります。これは、3DコードスニペットのgluPerspectiveへの呼び出しと同様に、2Dコードスニペットで行列モードを設定した後にgluOrtho2Dを呼び出して設定できます。 This page describes in great detail詳細な説明とサンプルコードについては、正射投影行列を作成する方法(投影行列(GL_PROJECTION)セクションにナビゲートする方法)を参照してください。

+0

ありがとうございました。私は正射投影と透視図マトリックスについて同じ考えを持っていました。それが上記の質問の理由ですが、私は透視図の表示をオフにし、正投影をONにする機能を知らなかったのです。私はopenGlを2週間も使っていないので、とても新しいです。あなたが示唆しているように、私は次のコードを実行しようとしましたが、残念ながら問題は同じままです。 glMatrixMode(GL_PROJECTION); gluOrtho2D(45、(ディスプレイ[0] /ディスプレイ[1])、0。5、40) –

+0

パラメータをgluOrtho2Dに正しく設定してください。 apiを確認すると、署名は:gluOrtho2D(GLdouble left、GLdouble right、GLdouble bottom、GLdouble top)です。使用する座標系に基づいてこれらを設定する必要があります。例えば。 (0、0)、右下角(1,1)、左下角(-1、-1)の座標系に対して(-1,1、-1,1)このことは、プロットを描画するために使用される座標と一貫していなければなりません。私。この例のようにスクリーン座標を使用するか-1を1にするかを指定します。 – sparkplug

関連する問題