OpenGL python 绘图圆缺少细节?

OpenGL python drawing circle little detail missing?

我实现了一个画圈的功能,快完成了,但它是这样的:

def drawCicrcle(x, y, z, radius, numSides):
    numVertices = numSides + 2
    doublePi = 2.0 * math.pi
    circleVerticesX = np.array([], dtype='f')
    circleVerticesY = np.array([], dtype='f')
    circleVerticesZ = np.array([], dtype='f')

    circleVerticesX = np.insert(circleVerticesX, 0, x)
    circleVerticesY = np.insert(circleVerticesX, 0, y)
    circleVerticesZ = np.insert(circleVerticesX, 0, z)


    for i in range(1, numVertices):
        circleVerticesX = np.append(
            circleVerticesX, x + (radius * math.cos(i * doublePi / numSides)))
        circleVerticesY = np.append(
            circleVerticesY, y + (radius * math.sin(i * doublePi / numSides)))
        circleVerticesZ = np.append(circleVerticesZ, z)

    allCircleVertices = np.array([], dtype='f')

    for i in range(0, numVertices):
        allCircleVertices = np.insert(
            allCircleVertices, i*3, circleVerticesX[i])
        allCircleVertices = np.insert(
            allCircleVertices, (i*3) + 1, circleVerticesY[i])
        allCircleVertices = np.insert(
            allCircleVertices, (i*3) + 2, circleVerticesZ[i])

    vboc = glGenBuffers(1)
    glBindBuffer(GL_ARRAY_BUFFER, vboc)
    glBufferData(GL_ARRAY_BUFFER, allCircleVertices, GL_STATIC_DRAW)
    glVertexAttribPointer(0, 3, GL_FLOAT, False,
                          sizeof(ctypes.c_float)*9, ctypes.c_void_p(36))
    glDrawArrays(GL_TRIANGLE_FAN, 0, numVertices)

然后我打电话给我的主drawCicrcle(-0.5, 0.5, 0.0, 0.18, 360) 我错过了什么?

circleVerticesX = np.array([numVertices], dtype='f') 没有按照您的预期进行。它创建一个 numpy 数组,其中单个元素的值为 numVertices(参见 numpy.array)。

创建一个包含顶点坐标的列表,并从该列表创建一个 numpy 数组:

vertex_list = [...]
# [...]
allCircleVertices = np.array([vertex_list], dtype='f')

函数drawCicrcle:

def drawCicrcle(x, y, z, radius, numSides):
    numVertices = numSides + 2
    doublePi = 2.0 * math.pi

    vertex_list = [x, y, z]
    for i in range(1, numVertices):
        vertex_list.append(x + (radius * math.cos(i * doublePi / numSides)))
        vertex_list.append(y + (radius * math.sin(i * doublePi / numSides)))
        vertex_list.append(z)
    allCircleVertices = np.array([vertex_list], dtype='f')

    vboc = glGenBuffers(1)
    glBindBuffer(GL_ARRAY_BUFFER, vboc)
    glBufferData(GL_ARRAY_BUFFER, allCircleVertices, GL_STATIC_DRAW)
    glVertexAttribPointer(0, 3, GL_FLOAT, False, 3*sizeof(ctypes.c_float), ctypes.c_void_p(0))
    glDrawArrays(GL_TRIANGLE_FAN, 0, numVertices)

或者创建一个包含 numVertices*3 个元素的空 numpy 数组(参见 numpy.empty)并将顶点坐标分配给数组的字段:

allCircleVertices = np.array([vertex_list], dtype='f')
allCircleVertices[0:3] = [x, y, z]
# [...]

函数drawCicrcle:

def drawCicrcle(x, y, z, radius, numSides):
    numVertices = numSides + 2
    doublePi = 2.0 * math.pi

    allCircleVertices = np.empty((numVertices*3), dtype='f')
    allCircleVertices[0:3] = [x, y, z]
    for i in range(1, numVertices):
        vx = x + (radius * math.cos(i * doublePi / numSides))
        vy = y + (radius * math.sin(i * doublePi / numSides))
        allCircleVertices[i*3:i*3+3] = [vx, vy, z]

    vboc = glGenBuffers(1)
    glBindBuffer(GL_ARRAY_BUFFER, vboc)
    glBufferData(GL_ARRAY_BUFFER, allCircleVertices, GL_STATIC_DRAW)
    glVertexAttribPointer(0, 3, GL_FLOAT, False, 3*sizeof(ctypes.c_float), ctypes.c_void_p(0))
    glDrawArrays(GL_TRIANGLE_FAN, 0, numVertices)