gpt4 book ai didi

python - 3d 立方体未正确显示 pyglet 写入

转载 作者:太空宇宙 更新时间:2023-11-03 19:00:00 24 4
gpt4 key购买 nike

最近,我开始从这个网站学习openGL => http://3dgep.com/?p=2365
我遇到了一个问题。那是我没有看到网站显示的场景。

我在此网站上发布了我的代码:

import pyglet
from pyglet.gl import *
from pyglet import clock, window

'''
http://www.learnersdictionary.com/search/aspect
a dictionary site

http://www.opengl.org/sdk/docs/man2/
opengl api reference

'''

def vector(type, *args):
'''
return a ctype array
GLfloat
GLuint
...
'''
return (type*len(args))(*args)



class model:
def __init__(self, vertices, colorMatrix, indice):
self.vertices = vertices
self.colorMatrix = colorMatrix
self.indice = indice
self.angle = 0

def update(self):
self.angle += 1
self.angle %= 360

def draw(self):
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()

glRotatef(self.angle, 1, 1, 0)


glEnableClientState(GL_VERTEX_ARRAY)
glEnableClientState(GL_COLOR_ARRAY)

glColorPointer(3, GL_FLOAT, 0, vector(GLfloat, *self.colorMatrix))
glVertexPointer(3, GL_FLOAT, 0, vector(GLfloat, *self.vertices))

glDrawElements(GL_QUADS, len(self.indice), GL_UNSIGNED_INT, vector(GLuint, *self.indice))


glDisableClientState(GL_COLOR_ARRAY)
glDisableClientState(GL_VERTEX_ARRAY)



class world:
def __init__(self):
self.element = []

def update(self, dt):
for obj in self.element:
obj.update()

def addModel(self, model):
self.element.append(model)

def draw(self):
for obj in self.element:
obj.draw()


def setup():
# look for GL_DEPTH_BUFFER_BIT
glEnable(GL_DEPTH_TEST)







win = window.Window(fullscreen=False, vsync=True, resizable=True, height=600, width=600)
mWorld = world()

cube = (
1, 1, 1, #0
-1, 1, 1, #1
-1, -1, 1, #2
1, -1, 1, #3
1, 1, -1, #4
-1, 1, -1, #5
-1, -1, -1, #6
1, -1, -1 #7
)


color = (
1, 0, 0,
1, 0, 0,
1, 0, 0,
1, 0, 0,
0, 1, 0,
0, 1, 0,
0, 0, 1,
0, 0, 1
)

indice = (
0, 1, 2, 3, # front face
0, 4, 5, 1, # top face
4, 0, 3, 7, # right face
1, 5, 6, 2, # left face
3, 2, 6, 7 # bottom face
#4, 7, 6, 5 #back face
)

obj = model(cube, color, indice)
mWorld.addModel(obj)


@win.event
def on_resize(width, height):
glViewport(0, 0, width, height)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
glOrtho(-10, 10, -10, 10, -10, 10)
glMatrixMode(GL_MODELVIEW)
return pyglet.event.EVENT_HANDLED

@win.event
def on_draw():
glClearColor(0.2, 0.2, 0.2, 0.8)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
mWorld.draw()


pyglet.clock.schedule(mWorld.update)
clock.set_fps_limit(30)
setup()
pyglet.app.run()

我想也许我错过了一些重要的概念,所以我无法得到正确的结果。谁能教我我犯了什么错误? :(

此外,还有一点奇怪。

indice = (
0, 1, 2, 3, # front face
0, 4, 5, 1, # top face
4, 0, 3, 7, # right face
1, 5, 6, 2, # left face
3, 2, 6, 7 # bottom face
#4, 7, 6, 5 #back face
)

如果我取消注释这一行来自

#4, 7, 6, 5 #back face
 4, 7, 6, 5 #back face
屏幕将不显示任何内容...

最佳答案

0.0 好吧,这很奇怪。我尝试将此代码翻译成 C++ 并且它显示正确。我使用 opengl、glut 和 c++。所以,我认为这可能是 pyglet 的问题。任何,我可以继续学习 openGL :)

终于找到让这段代码正确运行的方法了!!在这里更改代码

self.vertices = vector(GLfloat, *vertices)
self.colorMatrix = vector(GLfloat, *colorMatrix)
self.indice = vector(GLuint, *indice)

glColorPointer(3, GL_FLOAT, 0, self.colorMatrix)
glVertexPointer(3, GL_FLOAT, 0, self.vertices)
glDrawElements(GL_QUADS, len(self.indice), GL_UNSIGNED_INT, self.indice)

那么,关键点是垃圾回收吗?我认为

self.vertices = vector(GLfloat, *vertices)

这种方式使得有一个对象来引用向量,因此当我调用 glDrawElements(...) 和其他需要 c 类型数组的函数时它不会被释放

关于python - 3d 立方体未正确显示 pyglet 写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16263727/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com