python - OpenGL python画圈小细节遗漏?
问题描述
我实现了一个画圈功能,它几乎完成了,但它是这样的:
def drawCicrcle(x, y, z, radius, numSides):
numVertices = numSides + 2
doublePi = 2.0 * math.pi
circleVerticesX = np.array([], dtype='f')
circleVerticesY = np.array([], dtype='f')
circleVerticesZ = np.array([], dtype='f')
circleVerticesX = np.insert(circleVerticesX, 0, x)
circleVerticesY = np.insert(circleVerticesX, 0, y)
circleVerticesZ = np.insert(circleVerticesX, 0, z)
for i in range(1, numVertices):
circleVerticesX = np.append(
circleVerticesX, x + (radius * math.cos(i * doublePi / numSides)))
circleVerticesY = np.append(
circleVerticesY, y + (radius * math.sin(i * doublePi / numSides)))
circleVerticesZ = np.append(circleVerticesZ, z)
allCircleVertices = np.array([], dtype='f')
for i in range(0, numVertices):
allCircleVertices = np.insert(
allCircleVertices, i*3, circleVerticesX[i])
allCircleVertices = np.insert(
allCircleVertices, (i*3) + 1, circleVerticesY[i])
allCircleVertices = np.insert(
allCircleVertices, (i*3) + 2, circleVerticesZ[i])
vboc = glGenBuffers(1)
glBindBuffer(GL_ARRAY_BUFFER, vboc)
glBufferData(GL_ARRAY_BUFFER, allCircleVertices, GL_STATIC_DRAW)
glVertexAttribPointer(0, 3, GL_FLOAT, False,
sizeof(ctypes.c_float)*9, ctypes.c_void_p(36))
glDrawArrays(GL_TRIANGLE_FAN, 0, numVertices)
我打电话给我的主要drawCicrcle(-0.5, 0.5, 0.0, 0.18, 360)
我错过了什么?
解决方案
circleVerticesX = np.array([numVertices], dtype='f')
没有做你期望它做的事情。它创建一个numpy数组,其中包含一个具有值的元素numVertices
(请参阅参考资料numpy.array
)。
使用顶点坐标创建一个列表,并从列表中创建一个 numpy 数组:
vertex_list = [...]
# [...]
allCircleVertices = np.array([vertex_list], dtype='f')
功能drawCicrcle
:
def drawCicrcle(x, y, z, radius, numSides):
numVertices = numSides + 2
doublePi = 2.0 * math.pi
vertex_list = [x, y, z]
for i in range(1, numVertices):
vertex_list.append(x + (radius * math.cos(i * doublePi / numSides)))
vertex_list.append(y + (radius * math.sin(i * doublePi / numSides)))
vertex_list.append(z)
allCircleVertices = np.array([vertex_list], dtype='f')
vboc = glGenBuffers(1)
glBindBuffer(GL_ARRAY_BUFFER, vboc)
glBufferData(GL_ARRAY_BUFFER, allCircleVertices, GL_STATIC_DRAW)
glVertexAttribPointer(0, 3, GL_FLOAT, False, 3*sizeof(ctypes.c_float), ctypes.c_void_p(0))
glDrawArrays(GL_TRIANGLE_FAN, 0, numVertices)
或者,创建一个包含元素的空numpy数组(请参阅 参考资料)并将顶点坐标分配给数组的字段:numVertices*3
numpy.empty
allCircleVertices = np.array([vertex_list], dtype='f')
allCircleVertices[0:3] = [x, y, z]
# [...]
功能drawCicrcle
:
def drawCicrcle(x, y, z, radius, numSides):
numVertices = numSides + 2
doublePi = 2.0 * math.pi
allCircleVertices = np.empty((numVertices*3), dtype='f')
allCircleVertices[0:3] = [x, y, z]
for i in range(1, numVertices):
vx = x + (radius * math.cos(i * doublePi / numSides))
vy = y + (radius * math.sin(i * doublePi / numSides))
allCircleVertices[i*3:i*3+3] = [vx, vy, z]
vboc = glGenBuffers(1)
glBindBuffer(GL_ARRAY_BUFFER, vboc)
glBufferData(GL_ARRAY_BUFFER, allCircleVertices, GL_STATIC_DRAW)
glVertexAttribPointer(0, 3, GL_FLOAT, False, 3*sizeof(ctypes.c_float), ctypes.c_void_p(0))
glDrawArrays(GL_TRIANGLE_FAN, 0, numVertices)
推荐阅读
- h5py - 具有两个组共有的维度的几个 hdf5 的串联
- php - 如何在 laravel 迁移表中添加 Array 或 json 类型的列?
- microservices - 如何定义 OpenFeign 响应对象?
- android - 使用 ConnectivityManager 请求先前连接的网络
- java - 理解 mapMulti 的问题
- vuetify.js - vuetify:以图像为标签的 v-checkbox
- python - 如何通过 ctypes 或 PyWin32 使用 SHChangeNotify
- devise - 通过 ruby-saml gem 的 omniauth:request.env['omniauth.auth'] 总是 nil
- mongodb - 如果对象 id 匹配则更新数据,否则在 mongodb mongoose 中创建一个新对象
- angular - Angular E2E 访问环境变量