预期 LP_c_float 实例而不是 glVertex3fv 中的元组

Posted

技术标签:

【中文标题】预期 LP_c_float 实例而不是 glVertex3fv 中的元组【英文标题】:expected LP_c_float instance instead of tuple in glVertex3fv 【发布时间】:2019-12-27 02:32:26 【问题描述】:

我正在使用 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 立方体需要什么。

【问题讨论】:

【参考方案1】:

glVertex3fv 的参数必须是 floats 的数组。

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

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

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

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

【讨论】:

以上是关于预期 LP_c_float 实例而不是 glVertex3fv 中的元组的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate Query.list 返回实际的 Object 实例而不是预期的类型

单元测试实战(四种覆盖详解测试实例)

为啥 JSLint 要我使用双引号而不是单引号?预期为 '"' 而看到的是 '''

如何使用子类而不是预期类?

为啥 Retrofit & Gson 返回 LinkedTreeMap 列表而不是我预期的类型?

表单出现错误“预期的表或查询集,而不是 str”