更新粒子Python3使用Pyglet

问题描述 投票:0回答:1

我有一点点麻烦在我的Python的3D游戏项目更新粒子位置。我创建了一个粒子类的更新功能,但是当我运行更新的功能,颗粒的立场似乎并没有即使摄像机的位置不更新。

下面是一些代码(c表示计数,r是范围,t是质地这可能是一个有点明显,但以防万一):

class Particle:
    def get_tex(self, file):
        tex = pyglet.image.load(file).texture
        glTexParameterf(GL_TEXTURE_2D,  GL_TEXTURE_MIN_FILTER,GL_NEAREST)
        glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST)
        return pyglet.graphics.TextureGroup(tex)

    def __init__(self, x, y, z, c, r, t):
        self.x = x
        self.tex = self.get_tex(t)

        self.batch = pyglet.graphics.Batch()

        tex_coords = ('t2f', (1,0, 0,0, 0,1, 1,1, ))

        i = 0
        while i <= c:
            i += 1
            j = random.uniform((r*-0.5)-0.5,(r*0.5)-0.5)
            k = random.uniform((r*-0.5)-0.5,(r*0.5)-0.5)
            l = random.uniform((r*-0.5)-0.5,(r*0.5)-0.5)
            self.batch.add(4, GL_QUADS,self.tex,('v3f',(x+j, y+k, z+l, x+j+0.1, y+k, z+l+0.1, x+j+0.1, y+k+0.1, z+l+0.1, x+j, y+k+0.1, z+l,)), tex_coords)
            self.batch.add(4, GL_QUADS,self.tex,('v3f',(x+j, y+k, z+l+0.1, x+j+0.1, y+k, z+l, x+j+0.1, y+k+0.1, z+l, x+j, y+k+0.1, z+l+0.1,)), tex_coords)

    def update(self, dt):
        s = dt*10
        self.x -= s*0.1

    def draw(self):
        self.batch.draw()

这是粒子类^(再次可能相当明显...)

这是一些窗口类的代码片段,它的更新功能

class Window(pyglet.window.Window):
    def __init__(self,*args,**kwargs):
        super().__init__(*args,**kwargs)
        self.set_minimum_size(925, 500)
        self.keys = key.KeyStateHandler()
        self.push_handlers(self.keys)
        pyglet.clock.schedule(self.update)
        # DEFINING THE CAMERA
        self.player = Player((0.5,1.5,1.5),(-30,0))

        # DEFINING THE DRAWINGS
        self.part0 = Particle(0, 2, 0, 100, 1, 'textures\\particle1.png')

    def update(self,dt):
        self.player.update(dt,self.keys)
        self.part0.update(dt)
        self.part0.draw()

    def on_draw(self):
        self.clear()
        self.set3d()
        self.push(self.player.pos,self.player.rot)
        # DRAWING THE MODELS
        self.part0.draw()

以防万一你想看到的相机功能以及在这里为V

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/=4; dy/=4; 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):
        s = dt*10
        rotY = -self.rot[1]/180*math.pi
        dx,dz = s*math.sin(rotY),s*math.cos(rotY)
        if keys[key.W]: self.pos[0]+=dx*0.4; self.pos[2]-=dz*0.4
        if keys[key.S]: self.pos[0]-=dx*0.4; self.pos[2]+=dz*0.4
        if keys[key.A]: self.pos[0]-=dz*0.4; self.pos[2]-=dx*0.4
        if keys[key.D]: self.pos[0]+=dz*0.4; self.pos[2]+=dx*0.4
        if keys[key.SPACE]: self.pos[1]+=s*0.4
        if keys[key.LCTRL]: self.pos[1]-=s*0.4

谢谢你在前进的人谁可以帮助!


python 3d position pyglet particles
1个回答
0
投票

解决了!我把代码的人谁不想知道我是怎么固定它。

(我忘了加推矩阵在我最初的问题,并意识到这是关键)

首先,推动矩阵:

def push_p(self,pos,rot): glPushMatrix(); glRotatef(-rot[0],1,0,0); glRotatef(-rot[1],0,1,0); glTranslatef(-self.player.pos[0] - pos[0],-self.player.pos[1] + pos[1],-self.player.pos[2] - pos[2],)

其次,粒子类:

class Particle:
    def get_tex(self, file):
        tex = pyglet.image.load(file).texture
        glTexParameterf(GL_TEXTURE_2D,  GL_TEXTURE_MIN_FILTER,GL_NEAREST)
        glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST)
        return pyglet.graphics.TextureGroup(tex)

    def __init__(self, pos, rot, c, r, t):
        self.pos = list(pos)
        self.rot = list(rot)
        self.tex = self.get_tex(t)

        self.x = self.pos[0]
        self.y = self.pos[1]
        self.z = self.pos[2]

        self.batch = pyglet.graphics.Batch()

        tex_coords = ('t2f', (1,0, 0,0, 0,1, 1,1, ))

        i = 0
        while i <= c:
            i += 1
            j = random.uniform((r*-0.5)-0.5,(r*0.5)-0.5)
            k = random.uniform((r*-0.5)-0.5,(r*0.5)-0.5)
            l = random.uniform((r*-0.5)-0.5,(r*0.5)-0.5)
            self.batch.add(4, GL_QUADS,self.tex,('v3f',(self.pos[0]+j, self.pos[1]+k, self.pos[2]+l, self.pos[0]+j+0.3, self.pos[1]+k, self.pos[2]+l+0.3, self.pos[0]+j+0.3, self.pos[1]+k+0.3, self.pos[2]+l+0.3, self.pos[0]+j, self.pos[1]+k+0.3, self.pos[2]+l,)), tex_coords))
            self.batch.add(4, GL_QUADS,self.tex,('v3f',(self.pos[0]+j, self.pos[1]+k, self.pos[2]+l+0.3, self.pos[0]+j+0.3, self.pos[1]+k, self.pos[2]+l, self.pos[0]+j+0.3, self.pos[1]+k+0.3, self.pos[2]+l, self.pos[0]+j, self.pos[1]+k+0.3, self.pos[2]+l+0.3,)), tex_coords))
            self.batch.add(4, GL_QUADS,self.tex,('v3f',(self.pos[0]+j, self.pos[1]+k+0.3, self.pos[2]+l, self.pos[0]+j+0.3, self.pos[1]+k+0.3, self.pos[2]+l+0.3, self.pos[0]+j+0.3, self.pos[1]+k, self.pos[2]+l+0.3, self.pos[0]+j, self.pos[1]+k, self.pos[2]+l,)), tex_coords))
            self.batch.add(4, GL_QUADS,self.tex,('v3f',(self.pos[0]+j, self.pos[1]+k+0.3, self.pos[2]+l+0.3, self.pos[0]+j+0.3, self.pos[1]+k+0.3, self.pos[2]+l, self.pos[0]+j+0.3, self.pos[1]+k, self.pos[2]+l, self.pos[0]+j, self.pos[1]+k, self.pos[2]+l+0.3,)), tex_coords))

    def update(self, dt):
        s = dt*10
        self.pos[1] -= s*0.2
        self.pos[0] += s*0.1
        if self.pos[1] <= self.y - 15: self.pos[1] += 15
        if self.pos[0] >= self.x + 15: self.pos[0] -= 15


    def draw(self):
        self.batch.draw()

最后,在窗口中绘制:

    def on_draw(self):
        self.clear()
        self.set3d()

        self.push_p(self.part0.pos, self.player.rot)

        self.part0.draw()

        glPopMatrix()

欢迎你的人谁碰到这个来。

© www.soinside.com 2019 - 2024. All rights reserved.