Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python OpenGL不会渲染四边形中的每个三角形_Python_Python 3.x_Opengl_Pygame - Fatal编程技术网

Python OpenGL不会渲染四边形中的每个三角形

Python OpenGL不会渲染四边形中的每个三角形,python,python-3.x,opengl,pygame,Python,Python 3.x,Opengl,Pygame,我有一些在OpenGL中用纹理渲染平面的代码。同样的框架让我渲染立方体,但是平坦的表面似乎渲染了三个三角形,它们连接在正方形的中间。效果似乎是一个信封形状 我已经改变了纹理图像。我试着用3个通道而不是4个通道加载图像。相同的框架渲染立方体没有问题 我可以再次渲染同一个正方形并旋转它或使用三角形,但我更愿意理解这个问题 ##Python 3.7 ##OpenGL对象在pygame中可视化 从OpenGL.GL导入* 从OpenGL.GLU导入* 导入pygame 从pygame.locals导入*

我有一些在OpenGL中用纹理渲染平面的代码。同样的框架让我渲染立方体,但是平坦的表面似乎渲染了三个三角形,它们连接在正方形的中间。效果似乎是一个信封形状

我已经改变了纹理图像。我试着用3个通道而不是4个通道加载图像。相同的框架渲染立方体没有问题

我可以再次渲染同一个正方形并旋转它或使用三角形,但我更愿意理解这个问题

##Python 3.7
##OpenGL对象在pygame中可视化
从OpenGL.GL导入*
从OpenGL.GLU导入*
导入pygame
从pygame.locals导入*
导入系统
将numpy作为np导入
进口cv2
cwd='C:/Users/berta/Desktop/Python/opengl/'
coords=np.array([
[0.,1.],
[1.,1.],
[1.,0.],
[0.,0.]
])
图形名称=[
“地面”
]
地面顶点=np.array([
[-10, -1.5, 10],
[10, -1.5, 10],
[-10, -1.5, -300],
[10, -1.5, -300]
],dtype=np.64)
def loadGraphics(图形名称):
输出_dict={}
对于图形名称中的f:
img=cv2.imread(cwd+'Images/'+f+'.png',cv2.imread_不变)
如果img.shape[2]==3:
alpha=np.uint8(np.one(img.shape[:2])*255)
img=np.dstack((img,alpha))
textureSurface=pygame.Surface(img.shape[:2],pygame.SRCALPHA)
bv=textureSurface.get_buffer()
write(img.tostring(),0)
textureData=pygame.image.tostring(textureSurface,“RGBA”,1)
宽度=纹理表面。获取宽度()
高度=纹理表面。获取高度()
输出_dict[f]=(纹理数据、宽度、高度)
返回输出命令
图形=加载图形(图形名称)
def loadTexture(纹理数据、宽度、高度):
glEnable(GL_混合)
glBlendFunc(GL_SRC_ALPHA,GL_ONE_减去GL_SRC_ALPHA)
glEnable(GL_纹理_2D)
GLTEXAGE2D(GL_纹理_2D,0,GL_RGBA,宽度,高度,
0,GL_RGBA,GL_无符号字节,纹理数据)
GLTEX参数F(GL_纹理\u 2D、GL_纹理\u包裹、GL_重复)
GLTEX参数F(GL_纹理\u 2D、GL_纹理\u包裹、GL_重复)
glTexParameterf(GL_纹理2D,GL_纹理MAG_过滤器,GL_最近)
glTexParameterf(GL\u纹理\u 2D,GL\u纹理\u最小\u过滤器,GL\u最近)
返回
类平面:
def_uuuinit_uuuu(self、纹理名称、输入顶点、n_x、n_z):
self.texture\u name=纹理\u name
self.vertices=输入\顶点
#确定平面并创建平铺正方形
找到的平面尺寸=假
对于范围(3)中的i:
如果np.all(self.vertices[:,i]==self.vertices[0,i]):
找到的平面尺寸=真
自平坦尺寸=i
打破
如果没有(找到平面尺寸):
打印('未找到平面尺寸!')
自平尺寸=1
self.y_const=np.mean(self.vertices[:,self.flat_dim])
x_not_done=真
对于范围(3)中的i:
如果我自动调平尺寸:
如果x_未完成:
self.min_x=np.min(self.vertices[:,i])
max_x=np.max(自顶点[:,i])
self.x_dim=i
x_未_完成=错误
其他:
self.min_z=np.min(self.vertices[:,i])
max_z=np.max(自顶点[:,i])
self.z_dim=i
self.tiles=[]
self.tile\u x\u width=浮动(max\u x-self.min\u x)/浮动(n\u x)
self.tile_z_width=浮动(max_z-self.min_z)/浮动(n_z)
对于范围内的x(n_x):
对于范围内的z(n_z):
self.tiles.append(self.make_tile(x,z))
self.tiles=np.array(self.tiles,dtype=np.float64)
打印(自动平铺)
def make_平铺(自、x、z):
#为边界形状中的某个索引创建方形平铺
冲浪=[]
tile=np.数组([0,0,0])
平铺[self.flat\u dim]=自平常数
平铺[self.x\u dim]=self.min\u x+x*self.tile\u x\u宽度
平铺[self.z_dim]=self.min_z+z*self.tile_z_宽度
surf.append(tile.copy())
平铺[self.z_dim]+=self.tile_z_宽度
surf.append(tile.copy())
平铺[self.x_dim]+=self.tile_x_宽度
平铺[self.z_dim]-=self.tile_z_宽度
surf.append(tile.copy())
平铺[self.z_dim]+=self.tile_z_宽度
surf.append(tile.copy())
回浪
def牵引(自):
#加载纹理并绘制每个正方形
loadTexture(*图形[self.texture\u name])
glBegin(GLU四边形)
对于在self.tiles中冲浪:
对于顶点,zip中的坐标(冲浪,坐标):
glTexCoord2f(*coord)
glVertex3fv(顶点)
##阻止信封出现的可耻的黑客行为
#对于顶点,zip中的坐标(surf[:-1],坐标):
#glTexCoord2f(*coord)
#glVertex3fv(顶点)
格伦德()
def main():
pygame.init()
显示=(1200800)
pygame.display.set_模式(显示,DOUBLEBUF | OPENGL | OPENGLBLIT)
透视图(45,(显示[0]/显示[1]),0.99,20.0)
GLTRANSTEF(0,0.-10.)
glRotate(0,0,0,0)
x_move=0
z_move=0
速度=0.01
地面=平面(“地面”,地面顶点,4,62)
尽管如此:
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
pygame.quit()
sys.exit()
m=glGetDoublev(GL_模型视图_矩阵)#透视矩阵
glClear(GL_颜色_缓冲区_位| GL_深度_缓冲区_位)
地面
glTranslate(x_移动、0、z_移动+速度)
pygame.display.flip()
pygame.时间.等等(10)
main()
四边形的坐标如下所示,如预期:

[[5.-1.-5]
[   5.   -1.    0.]
[  10.   -1.   -5.]
[  10.   -1.    0.]]
[[   5.   -1.    0.]
[   5.   -1.    5.]
[  10.   -1.    0.]
[  10.   -1.    5.]]
[[   5.   -1.    5.]
[   5.   -1.   10.]
[  10.
1---2
|   |
3---4
1---2
|   |
4---3