4

ピグレットで配列を描画しようとするときはいつでも、次の形式の非常に醜い小さなコードのように見えるものがあります。

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

これは、numpy と pyglet を使用して見つけたいくつかのリソースに基づいてまとめました。c_floats として numpy 配列へのポインターを取得するよりエレガントな方法はありますか?

私が書いた小さな例のコンテキストでの上記のコードは次のとおりです。

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()
4

2 に答える 2

3

データのアドレスを float ポインターに変換する必要はないと思います。アドレスを直接渡すことができます。

gl.glVertexPointer(2, gl.GL_FLOAT, 0, vertPoints.ctypes.data)
gl.glColorPointer(3,  gl.GL_FLOAT, 0, vertColors.ctypes.data)
于 2013-03-24T22:59:40.953 に答える
2

Numpy float 配列を頂点バッファー オブジェクトで直接使用できます。ただし、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)
于 2013-03-24T21:06:15.170 に答える