2013-03-24 28 views
4
调用

我有什么似乎是一个非常丑陋的小的一段代码,我似乎继续诉诸回到每当我试图与pyglet画数组形式:使用numpy的阵列和ctypes的支持OpenGL在Pyglet

vertPoints = someArray.flatten().astype(ctypes.c_float) 
vertices_gl = vertPoints.ctypes.data_as(ctypes.POINTER(ctypes.c_float)) 

我根据我可以用pyglet使用numpy找到的一些资源拼凑在一起。有没有一种更优雅的方式来获得一个指向numpy数组的指针为c_floats?

下面的代码上面我写了一个小例子的情况下:

import numpy as np; import ctypes 
import pyglet; import pyglet.gl as gl 

def drawArray(someArray): 

    vertPoints = someArray[:,:2].flatten().astype(ctypes.c_float) 
    vertices_gl = vertPoints.ctypes.data_as(ctypes.POINTER(ctypes.c_float)) 

    vertColors = someArray[:,2:].flatten().astype(ctypes.c_float) 
    colors_gl = vertColors.ctypes.data_as(ctypes.POINTER(ctypes.c_float)) 

    gl.glVertexPointer(2, gl.GL_FLOAT, 0, vertices_gl) 
    gl.glColorPointer(3, gl.GL_FLOAT, 0, colors_gl) 
    gl.glDrawArrays(gl.GL_POINTS, 0, len(vertPoints) // 2) 

window = pyglet.window.Window(400,400) 

@window.event 
def on_draw(): 
    gl.glPointSize(10.0) 
    gl.glEnable(gl.GL_POINT_SMOOTH) 
    gl.glEnable(gl.GL_BLEND) 
    gl.glBlendFunc(gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA) 
    gl.glEnableClientState(gl.GL_VERTEX_ARRAY) 
    gl.glEnableClientState(gl.GL_COLOR_ARRAY) 

    points = np.random.random((50,5))*np.array([400,400,1,1,1]) 
    drawArray(points) 

pyglet.app.run() 
+2

如果你使用'D型= np.float32 '和用于顶点和颜色单独的阵列,则不需要'flatten'(将数据复制到连续的存储器),或使用'astype'(创建一个全新的阵列),将指针只是'vertices_gl = verticesArray.ctypes.data'等 – eryksun 2013-03-25 00:24:25

回答

2

你可以用顶点缓冲对象直接使用NumPy的浮标阵。虽然我没有在Pyglet的情况下使用它们。喜欢的东西:

from OpenGL.arrays import vbo 

# setup 
vertices_gl = vbo.VBO(vertPoints) 
colours_gl = vbo.VBO(vertPoints) 

# in drawing code 
vertices.bind() 
colours.bind() 
glVertexPointer(2, gl.GL_FLOAT, 0, vertices_gl) 
glColorPointer(2, gl.GL_FLOAT, 0, vertices_gl) 
+2

所以,据我所知,这不工作PyOpenGL,但不是在Pyglet因为不同的方式绑定生成。 PyOpenGL确实多了不少你在促进简单的接口而言的,而Pyglet预计的事情为ctypes的传递。由于这个原因,我考虑切换到PyOpenGL,在这一点上它变成了一件好奇的事情;必须有某种干净的语法来生成一个numpy数组中的c_float指针。 – TheONP 2013-03-24 21:24:46

3

我觉得你并不需要数据的地址转换为浮动指针,你可以通过直接在地址:

gl.glVertexPointer(2, gl.GL_FLOAT, 0, vertPoints.ctypes.data) 
gl.glColorPointer(3, gl.GL_FLOAT, 0, vertColors.ctypes.data)