首页 > 解决方案 > 预期 LP_c_float 实例而不是 glVertex3fv 中的元组

问题描述

我正在使用 Python、OpenGL 和 Pyglet 渲染一个 3D 立方体,所以我在一个元组中定义verticesedges变量

vertices = (
    (1, -1, -1),
    (1, 1, -1),
    (-1, 1, -1),
    (-1, -1, -1),
    (1, -1, 1),
    (1, 1, 1),
    (-1, -1, 1),
    (-1, 1, 1))

edges = (
    (0, 1),
    (0, 3),
    (0, 4),
    (2, 1),
    (2, 3),
    (2, 7),
    (6, 3),
    (6, 4),
    (6, 7),
    (5, 1),
    (5, 4),
    (5, 7))

之后我定义了一个函数def Cube(),使用我上面定义的这些坐标创建这个 3D 立方体

def Cube():
    glBegin(GL_LINES)
    for edge in edges:
        for vertex in edge:
            glVertex3fv(vertices[vertex])
    glEnd()

所以我创建了一个带有on_draw()函数的窗口,它调用了该Cube()函数。

当我使用命令在我的 Linux 终端上运行此应用程序时,我python3 main.py收到以下错误

ctypes.ArgumentError:参数 1::预期 LP_c_float 实例而不是元组

所以我猜这段代码的主要错误是行glVertex3fv(vertices[vertex])

我想知道正确绘制这个 3D 立方体需要什么。

标签: pythonopenglpygletopengl-compat

解决方案


to 的参数必须glVertex3fv是 s 的数组float

要解决问题,请使用glVertex3f并传递 3 个分隔值:

glVertex3f(vertices[vertex][0], vertices[vertex][1], vertices[vertex][2])

或者使用 pythonsctypes模块生成一个floats 数组。
元素的数据类型是c_float,并且可以通过 -operator 生成Array*

import ctypes
glVertex3fv( (ctypes.c_float * 3)(*vertices[vertex]) )

推荐阅读