我有什么似乎是一个非常丑陋的小的一段代码,我似乎继续诉诸回到每当我试图与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()
如果你使用'D型= np.float32 '和用于顶点和颜色单独的阵列,则不需要'flatten'(将数据复制到连续的存储器),或使用'astype'(创建一个全新的阵列),将指针只是'vertices_gl = verticesArray.ctypes.data'等 – eryksun 2013-03-25 00:24:25