2012-01-13 13 views
2

私はクロスプラットフォームにする必要があるwxPython + pyOpenGLアプリケーションを持っています。 init_color_buffersのための今ウィンドウ上のpyOpenGLカラーピックアップ

if len(self.pick_color_array) == 0: 
    self.init_color_buffers(len(self.points)) 
glUseProgram(0) 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) 
glMatrixMode(GL_MODELVIEW) 
glLoadIdentity() 
glDisable(GL_BLEND) 
glDisable(GL_DITHER) 
glDisable(GL_FOG) 
glDisable(GL_LIGHTING) 
glDisable(GL_TEXTURE_1D) 
glDisable(GL_TEXTURE_2D) 
glDisable(GL_TEXTURE_3D) 
glShadeModel(GL_FLAT) 
glPushMatrix()   
glTranslate(self.x_translation_step,self.y_translation_step, 
         Z_DISTANCE + z_translation) 

glRotate(alpha_rotation, 0.0, 0.0, 1.0) 
glRotate(beta_rotation, 0.0, 1.0, 0.0) 
self.apply_connectivity_nose_correction() 
for i in range(len(self.points)): 
    glColor3ub(self.pick_color_array[i][0], self.pick_color_array[i][1], self.pick_color_array[i][2]) 
    glEnableClientState(GL_VERTEX_ARRAY) 
    glBindBuffer(GL_ARRAY_BUFFER, self.positions_buffers[i][0]) 
    glVertexPointer(3, GL_FLOAT, 0, None) 
    glBindBuffer(GL_ARRAY_BUFFER, self.positions_buffers[i][2]) 

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, self.positions_buffers[i][2]) 
    glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_SHORT, None) 
glPopMatrix() 
viewport = glGetIntegerv(GL_VIEWPORT) 
pixel = glReadPixels(self.control.mouse_x(), float(viewport[3] - float(self.control.mouse_y())), 1, 1, 
        GL_RGB, GL_UNSIGNED_BYTE) 
glUseProgram(self.shader.shader) 
glEnable(GL_BLEND) 
glEnable(GL_DITHER) 
glEnable(GL_FOG) 
glEnable(GL_LIGHTING) 
glEnable(GL_TEXTURE_1D) 
glEnable(GL_TEXTURE_2D) 
glEnable(GL_TEXTURE_3D) 
glShadeModel(GL_SMOOTH)  

glMatrixMode(GL_MODELVIEW) 
    glLoadIdentity() 
    self.pick_color_dict = {} 
    self.pick_color_array = [] 
    vertices = numpy.array([ 
     0.0, 1000.0, 0.0, 
     -1000.0, -1000.0, 1000.0, 
     1000.0, -1000.0, 1000.0, 
     0.0, 1000.0, 0.0, 
     1000.0, -1000.0, 1000.0, 
     1000.0, -1000.0, -1000.0, 
     0.0, 100.0, 0.0, 
     1000.0, -1000.0, -1000.0, 
     -1000.0, -1000.0, -1000.0, 
     0.0, 1000.0, 0.0, 
     -1000.0, -1000.0, -1000.0, 
     -1000.0, -1000.0, 1000.0 
    ], dtype=numpy.float32) 
    buffer_cube = glGenBuffers(1) 
    glBindBuffer(GL_ARRAY_BUFFER, buffer_cube) 
    glBufferData(GL_ARRAY_BUFFER, ADT.arrayByteCount(vertices), 
        ADT.voidDataPointer(vertices), GL_STATIC_DRAW) 
    glUseProgram(0) 
    glDisable(GL_BLEND) 
    glDisable(GL_DITHER) 
    glDisable(GL_FOG) 
    glDisable(GL_LIGHTING) 
    glDisable(GL_TEXTURE_1D) 
    glDisable(GL_TEXTURE_2D) 
    glDisable(GL_TEXTURE_3D) 
    glMatrixMode(GL_MODELVIEW) 
    glLoadIdentity()  
    glShadeModel(GL_FLAT) 
    for i in range(nr_points): 
     self.pick_color_array.append((numpy.uint8(255.0/nr_points*i), 
             numpy.uint8(255 - 255.0/nr_points*i), 
             numpy.uint8(255.0/nr_points*i))) 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) 
     glColor3ub(self.pick_color_array[i][0], self.pick_color_array[i][1], self.pick_color_array[i][2]) 
     glEnableClientState(GL_VERTEX_ARRAY) 
     glBindBuffer(GL_ARRAY_BUFFER, buffer_cube) 
     glVertexPointer(3, GL_FLOAT, 0, None) 
     glDrawArrays(GL_TRIANGLES, 0, 12) 
     pixel = glReadPixels(10, 10, 1, 1, 
        GL_RGB, GL_UNSIGNED_BYTE) 
     from binascii import hexlify 
     bit_repr = bin(int(b"1" + hexlify(pixel), 16))[3:]  
     color_0 = 0 
     for bit in bit_repr[:8]: 
      color_0 = color_0 * 2 + numpy.uint8(bit) 
     color_1 = 0 
     for bit in bit_repr[8:16]: 
      color_1 = color_1 * 2 + numpy.uint8(bit) 
     color_2 = 0 
     for bit in bit_repr[16:]: 
      color_2 = color_2 * 2 + numpy.uint8(bit)    
     self.pick_color_dict[(color_0, color_1, color_2)] = i 

は今これが書かれていたとMacOSの上で完全に働いた今、選択のために、私は次の基本的には、スキームを選ぶ色を実装しました。しかし、今、私が窓でそれを試すと、まったく動作しません。作成されるカラーディクショナリは{(0、0、0):last_index}だけで、いずれかのアイテムのクリックも(0、0、0)を返します。今、私はここで間違っていることについて本当に困惑しています。特に、MacOSでは全てがうまく動作するからです。私の唯一の推測は、いずれかのglReadPixelsがWindows上で正しく動作しないか、Windows上のwxPythonが何とかそれを台無しにしたことでしょうか?

ご協力いただければ幸いです。

よろしく、 ボグダン

答えて

1

あなたはglReadPixelsへの呼び出しは()黒画素を返す理由かもしれないこと、init_color_buffers内の任意のビューポートを設定されていません。また、投影行列が設定されていません。おそらく、呼び出しの順序は、MacとWindowsで少し異なります(完全なソースコードなしでは難しい)。

ウィンドウでは、glViewport()は通常、OpenGLが初期化された後、ウィンドウが最初に表示されるポイントで呼び出されます。これは、init_color_buffersが呼び出された時点の後にある可能性があります。 glReadPixels()が何かを返すためには、ウィンドウは一般的に見えるべきです。

遅延初期化を使用してください(ウィンドウがinit_color_buffersを呼び出す前に表示されていることを確認してください)。

また、GL_RED_BITS、GL_GREEN_BITS、およびGL_BLUE_BITSと共にglGetIntegerv()を使用すると、リードバックを必要とせずに正しい色を計算できます(コードではすべての色を使用しているわけではなく、 8ビットのRGBでは、2^24色を表示することができます)。

+0

アドバイスをいただき、ありがとうございます。私はすべての色を使用しているわけではないことを知っていますが、最大120色しか必要ないので、私はそれ以上複雑にしたくありませんでした。 – Bogdan

+0

また、投影行列は、gluPerspective(45.0、ratio、0.1、800.0)でこれらのいずれかの前に呼び出されたinitGlで1回設定され、その後はまったく変更されません。私はまだinit_color_buffersで再び呼び出すべきですか? – Bogdan

+0

その必要はありません。それはMac上で動作する場合でもWindows上で動作するはずです。私はあなたの頂点データに小さな誤差があることにも気付きました.6番目の頂点のy座標は100で、おそらく1000になるはずです。しかし、それは何にも影響しません。 –

関連する問題