Python 停止GL_三角形_带连接最后一个顶点和第一个顶点?
我一直在尝试从OpenGL构建一个地形可视化工具,并使用simplex noise的高度图。我对生成器进行了排序,它生成彩色和非彩色图像,我只想可视化彩色图像。然而,有一个奇怪的肿块,我相信这是由于GL_三角带 人工制品图片,红色轮廓的奇怪之处:Python 停止GL_三角形_带连接最后一个顶点和第一个顶点?,python,python-3.x,opengl,pyglet,Python,Python 3.x,Opengl,Pyglet,我一直在尝试从OpenGL构建一个地形可视化工具,并使用simplex noise的高度图。我对生成器进行了排序,它生成彩色和非彩色图像,我只想可视化彩色图像。然而,有一个奇怪的肿块,我相信这是由于GL_三角带 人工制品图片,红色轮廓的奇怪之处: 我最好的猜测是连接第一个和最后一个顶点的GL_三角形_带,但我不知道 这是我的密码: import pyglet from pyglet.gl import * from pyglet.window import key import math f
我最好的猜测是连接第一个和最后一个顶点的GL_三角形_带,但我不知道 这是我的密码:
import pyglet
from pyglet.gl import *
from pyglet.window import key
import math
from PIL import Image
class Model:
def get_points_in_list(self, fp):
img = Image.open(fp)
self.points = [[0 for x in range(img.width)] for y in range(img.height)]
for y in range(img.height):
for x in range(img.width):
self.points[y][x] = ((x, img.getpixel((x, y))[3], y), img.getpixel((x, y)))
def add_points_to_batch(self):
ysiz = len(self.points)
xsiz = len(self.points[0])
# color1[0], color1[1], color1[2], color2[0], color2[1], color2[2]
for yy in range(ysiz-1):
for xx in range(xsiz):
pos = self.points[yy][xx][0]
x, y, z = pos[0], pos[1], pos[2]
pos1 = self.points[yy+1][xx][0]
X, Y, Z = pos1[0], pos1[1], pos1[2]
color1 = (self.points[yy][xx][1][0], self.points[yy][xx][1][1], self.points[yy][xx][1][2])
color2 = (self.points[yy+1][xx][1][0], self.points[yy+1][xx][1][1], self.points[yy+1][xx][1][2])
self.batch.add(2, GL_TRIANGLE_STRIP, None,
('v3f', (x, y, z, X, Y, Z)),
('c3B', (color1[0], color1[1], color1[2], color2[0], color2[1], color2[2]))
)
def __init__(self):
self.batch = pyglet.graphics.Batch()
self.points = None
self.get_points_in_list('Output_colored.png')
self.add_points_to_batch()
def draw(self):
self.batch.draw()
class Player:
def __init__(self, pos=(0, 0, 0), rot=(0, 0)):
self.pos = list(pos)
self.rot = list(rot)
def mouse_motion(self, dx, dy):
dx /= 8
dy /= 8
self.rot[0] += dy
self.rot[1] -= dx
if self.rot[0]>90:
self.rot[0] = 90
elif self.rot[0] < -90:
self.rot[0] = -90
def update(self,dt,keys):
sens = 1
s = dt*100
rotY = -self.rot[1]/180*math.pi
dx, dz = s*math.sin(rotY), math.cos(rotY)
if keys[key.W]:
self.pos[0] += dx*sens
self.pos[2] -= dz*sens
if keys[key.S]:
self.pos[0] -= dx*sens
self.pos[2] += dz*sens
if keys[key.A]:
self.pos[0] -= dz*sens
self.pos[2] -= dx*sens
if keys[key.D]:
self.pos[0] += dz*sens
self.pos[2] += dx*sens
if keys[key.SPACE]:
self.pos[1] += s
if keys[key.LSHIFT]:
self.pos[1] -= s
class Window(pyglet.window.Window):
def push(self,pos,rot):
glPushMatrix()
rot = self.player.rot
pos = self.player.pos
glRotatef(-rot[0],1,0,0)
glRotatef(-rot[1],0,1,0)
glTranslatef(-pos[0], -pos[1], -pos[2])
def Projection(self):
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
def Model(self):
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
def set2d(self):
self.Projection()
gluPerspective(0, self.width, 0, self.height)
self.Model()
def set3d(self):
self.Projection()
gluPerspective(70, self.width/self.height, 0.05, 1000)
self.Model()
def setLock(self, state):
self.lock = state
self.set_exclusive_mouse(state)
lock = False
mouse_lock = property(lambda self:self.lock, setLock)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.set_minimum_size(300,200)
self.keys = key.KeyStateHandler()
self.push_handlers(self.keys)
pyglet.clock.schedule(self.update)
self.model = Model()
self.player = Player((0.5,1.5,1.5),(-30,0))
def on_mouse_motion(self,x,y,dx,dy):
if self.mouse_lock: self.player.mouse_motion(dx,dy)
def on_key_press(self, KEY, _MOD):
if KEY == key.ESCAPE:
self.close()
elif KEY == key.E:
self.mouse_lock = not self.mouse_lock
def update(self, dt):
self.player.update(dt, self.keys)
def on_draw(self):
self.clear()
self.set3d()
self.push(self.player.pos,self.player.rot)
self.model.draw()
glPopMatrix()
if __name__ == '__main__':
window = Window(width=400, height=300, caption='Terrain Viewer', resizable=True)
glClearColor(0, 0, 0, 1)
glEnable(GL_DEPTH_TEST)
pyglet.app.run()
导入pyglet
从pyglet.gl导入*
从pyglet.window导入密钥
输入数学
从PIL导入图像
类别模型:
def获取_列表中的_点(自我,fp):
img=图像打开(fp)
self.points=[[0表示范围内的x(img.width)]表示范围内的y(img.height)]
对于范围内的y(惯性高度):
对于范围内的x(img.宽度):
self.points[y][x]=((x,img.getpixel((x,y))[3],y),img.getpixel((x,y)))
def将_点添加到_批次(自身):
ysiz=len(自身点)
xsiz=len(自身点[0])
#color1[0],color1[1],color1[2],color2[0],color2[1],color2[2]
对于范围内的yy(ysiz-1):
对于范围内的xx(xsiz):
pos=自身积分[yy][xx][0]
x、 y,z=位置[0],位置[1],位置[2]
pos1=自身积分[yy+1][xx][0]
十、 Y,Z=pos1[0],pos1[1],pos1[2]
color1=(自点[yy][xx][1][0]、自点[yy][xx][1][1]、自点[yy][xx][1][2])
color2=(自身积分[yy+1][xx][1][0],自身积分[yy+1][xx][1][1],自身积分[yy+1][xx][1][2])
自.批.添加(2,GL\U三角形\U带,无,
('v3f',(x,y,z,x,y,z)),
('c3B',(color1[0],color1[1],color1[2],color2[0],color2[1],color2[2]))
)
定义初始化(自):
self.batch=pyglet.graphics.batch()
self.points=无
self.get\u列表中的\u点('Output\u colored.png'))
self.add_points_to_batch()
def牵引(自):
self.batch.draw()
职业球员:
定义初始化(self,pos=(0,0,0),rot=(0,0)):
self.pos=列表(pos)
self.rot=列表(rot)
定义鼠标运动(自身、dx、dy):
dx/=8
dy/=8
self.rot[0]+=dy
self.rot[1]=dx
如果self.rot[0]>90:
self.rot[0]=90
elif self.rot[0]<-90:
self.rot[0]=-90
def更新(自身、dt、密钥):
sens=1
s=dt*100
rotY=-self.rot[1]/180*math.pi
dx,dz=s*math.sin(rotY),math.cos(rotY)
如果键[key.W]:
self.pos[0]+=dx*sens
自身位置[2]=dz*sens
如果键[key.S]:
self.pos[0]=dx*sens
self.pos[2]+=dz*sens
如果键[key.A]:
自身位置[0]=dz*sens
self.pos[2]=dx*sens
如果键[key.D]:
self.pos[0]+=dz*sens
self.pos[2]+=dx*sens
如果键[key.SPACE]:
self.pos[1]+=s
如果键[key.LSHIFT]:
self.pos[1]=s
类窗口(pyglet.Window.Window):
def推送(自身、位置、旋转):
glPushMatrix()
rot=self.player.rot
pos=self.player.pos
glRotatef(-rot[0],1,0,0)
glRotatef(-rot[1],0,1,0)
glTranslatef(-pos[0],-pos[1],-pos[2])
def投影(自):
glMatrixMode(GL_投影)
glLoadIdentity()
def型号(自):
glMatrixMode(GLU模型视图)
glLoadIdentity()
def set2d(自):
self.Projection()
透视图(0,self.width,0,self.height)
self.Model()
def set3d(自):
self.Projection()
透视图(70,自宽/自高,0.051000)
self.Model()
def设置锁(自身、状态):
self.lock=状态
self.set_exclusive_鼠标(状态)
锁=假
鼠标锁定=属性(lambda self:self.lock,setLock)
定义初始化(self,*args,**kwargs):
super()
自设置最小尺寸(300200)
self.keys=key.KeyStateHandler()
self.push_处理程序(self.keys)
pyglet.clock.schedule(self.update)
self.model=model()
self.player=玩家((0.5,1.5,1.5),(-30,0))
鼠标运动时的def(自身、x、y、dx、dy):
如果self.mouse\u lock:self.player.mouse\u运动(dx,dy)
def on_键按(自身、键、模式):
如果KEY==KEY.ESCAPE:
self.close()
elif KEY==KEY.E:
self.mouse\u lock=非self.mouse\u lock
def更新(自我,dt):
self.player.update(dt,self.keys)
def on_牵引(自):
self.clear()
self.set3d()
self.push(self.player.pos、self.player.rot)
self.model.draw()
GLPOP矩阵()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
窗口=窗口(宽度=400,高度=300,标题='Terrain Viewer',可调整大小=True)
glClearColor(0,0,0,1)
glEnable(GL_深度_测试)
pyglet.app.run()文件