Python 停止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

我一直在尝试从OpenGL构建一个地形可视化工具,并使用simplex noise的高度图。我对生成器进行了排序,它生成彩色和非彩色图像,我只想可视化彩色图像。然而,有一个奇怪的肿块,我相信这是由于GL_三角带

人工制品图片,红色轮廓的奇怪之处:


我最好的猜测是连接第一个和最后一个顶点的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()文件