OpenGL python绘图圈缺少小细节?

2024-05-14 10:58:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我实现了一个画圈函数,几乎完成了,但它看起来是这样的:

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) 我错过了什么


Tags: npmatharrayinsertdtypeglappendradius
1条回答
网友
1楼 · 发布于 2024-05-14 10:58:12

circleVerticesX = np.array([numVertices], dtype='f')不会做你期望它做的事情。它创建一个numpy数组,其中包含一个值为numVertices(请参见^{})的元素

使用顶点坐标创建列表,并从列表中创建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数组(请参见^{}),并将顶点坐标指定给数组的字段:

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)

相关问题 更多 >

    热门问题