OpenGL旋转看不到背面

时间:2018-11-04 12:00:24

标签: opengl pyopengl

我试图绘制一个网格面并响应鼠标输入向各个方向旋转它,我的代码包括启用GL_DEPTH_TESTGL_NORMALIZE,我用glEnableClientState(GL_VERTEX_ARRAY)绘制了网格面,glEnableClientState(GL_NORMAL_ARRAY)

GL_VERTEX_ARRAY的抽奖经过测试,但是启用GL_CULL_FACE时,旋转看不到背面,这是正面和背面。

这是初始化OpenGL的代码:

 def initializeGL(self):
    glEnable(GL_DEPTH_TEST)   # Depth testing must be turned on
    glEnable(GL_LIGHTING)     # Enable lighting calculations
    glEnable(GL_LIGHT0)      # Turn on light #0.

    glEnable(GL_NORMALIZE)

    # Setup polygon drawing
    glShadeModel(GL_SMOOTH)
    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);

    glEnable(GL_CULL_FACE)   # question sentence
    glCullFace(GL_BACK)

    # Clear to black
    glClearColor(0.0, 0.2, 0.3, 1.0)

这是绘制的功能:

 def drawTriangles(data):
    # data shape like (n,3,3), only the triangles vertex data
    N = np.cross(data[:, 0, :] - data[:, 1, :], data[:, 0, :] - data[:, 2, :])
    N = N / np.linalg.norm(N)
    N = N.reshape([-1, 1, 3])
    N = np.hstack([N, N, N]).reshape([-1, 3])
    glEnableClientState(GL_VERTEX_ARRAY)
    glEnableClientState(GL_NORMAL_ARRAY)
    glVertexPointer(3, GL_DOUBLE, 0, data)
    #specify the normal vector for every triangle, N shape like (n,3)
    glNormalPointer(GL_FLOAT, 0, N)
    glDrawArrays(GL_TRIANGLES, 0, data.shape[0] * data.shape[1])
    glDisableClientState(GL_VERTEX_ARRAY)
    glDisableClientState(GL_NORMAL_ARRAY)

其他信息:我使用PyOpenGL + PyQt

1 个答案:

答案 0 :(得分:4)

  

但是当我启用GL_CULL_FACE时,旋转看不到背面,这是正面和背面。

这是面部剔除的全部目的:抑制基本体特定侧面的渲染。如果想同时看到两面,则必须 禁用面部剔除。