[Python] PyGame, Pywin32 API and PyOpenGL transparency error

Discussão em 'Python' iniciado por Stack, Outubro 2, 2024.

  1. Stack

    Stack Membro Participativo

    I am trying to make a transparent screen by hide the background color with win32api It work with pygame in 2D. However, when I use pyopengl to make a 3D platform, The back ground didn't transparent I use window 7 64bits, python 2.7

    Here is the code for the main.py:

    import sys, tran
    from pygame.locals import *
    from pygame.constants import *
    from OpenGL.GL import *
    from OpenGL.GLU import *
    import os
    import pygame as pg

    # IMPORT OBJECT LOADER
    from objLoader import *

    pg.init()
    viewport = (800,600)
    hx = viewport[0]/2
    hy = viewport[1]/2
    srf = pg.display.set_mode(viewport, OPENGL | DOUBLEBUF)

    glLightfv(GL_LIGHT0, GL_POSITION, (-40, 200, 100, 0.0))
    glLightfv(GL_LIGHT0, GL_AMBIENT, (0.2, 0.2, 0.2, 1.0))
    glLightfv(GL_LIGHT0, GL_DIFFUSE, (0.5, 0.5, 0.5, 1.0))
    glEnable(GL_LIGHT0)
    glEnable(GL_LIGHTING)
    glEnable(GL_COLOR_MATERIAL)
    glEnable(GL_DEPTH_TEST)
    glShadeModel(GL_SMOOTH)

    obj = OBJ('T80obj.obj', swapyz=True)

    clock = pg.time.Clock()

    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    width, height = viewport
    gluPerspective(90.0, width/float(height), 1, 100.0)
    glEnable(GL_DEPTH_TEST)
    glMatrixMode(GL_MODELVIEW)

    rx, ry = (0,0)
    tx, ty = (0,0)
    zpos = 5
    rotate = move = False

    hwnd = pg.display.get_wm_info()["window"]

    r,g,b = 0,0,0

    while 1:
    clock.tick(30)
    for e in pg.event.get():
    if e.type == QUIT:
    sys.exit()
    elif e.type == KEYDOWN and e.key == K_ESCAPE:
    sys.exit()
    elif e.type == MOUSEBUTTONDOWN:
    if e.button == 4: zpos = max(1, zpos-1)
    elif e.button == 5: zpos += 1
    elif e.button == 1: rotate = True
    elif e.button == 3: move = True
    elif e.type == MOUSEBUTTONUP:
    if e.button == 1: rotate = False
    elif e.button == 3: move = False
    elif e.type == MOUSEMOTION:
    i, j = e.rel
    if rotate:
    rx += i
    ry += j
    if move:
    tx += i
    ty -= j

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

    glLoadIdentity()

    # RENDER OBJECT
    glTranslate(tx/20., ty/20., - zpos)
    glRotate(ry, 1, 0, 0)
    glRotate(rx, 0, 1, 0)
    glCallList(obj.gl_list)
    pg.draw.rect(srf, (255,0,0), (50, 50, 100, 100), 2)

    r += 1;
    g += 1;
    b += 1;
    print(r,g,b)
    # tran.tran(hwnd,(r,g,b,));

    pg.display.flip()
    pg.draw.rect(srf, (255,0,0), (50, 50, 100, 100), 2)

    glClearColor(0, 0, 0, 0)
    tran.tran(hwnd,(0,0,0))


    objLoader.py

    import pygame
    from tqdm import tqdm
    from OpenGL.GL import *

    def MTL(filename):
    contents = {}
    mtl = None
    for line in open(filename, "r"):
    if line.startswith('#'): continue
    values = line.split()
    if not values: continue
    if values[0] == 'newmtl':
    mtl = contents[values[1]] = {}
    elif mtl is None:
    raise ValueError, "mtl file doesn't start with newmtl stmt"
    elif values[0] == 'map_Kd':
    # load the texture referred to by this declaration
    mtl[values[0]] = values[1]
    surf = pygame.image.load(mtl['map_Kd'])
    image = pygame.image.tostring(surf, 'RGBA', 1)
    ix, iy = surf.get_rect().size
    texid = mtl['texture_Kd'] = glGenTextures(1)
    glBindTexture(GL_TEXTURE_2D, texid)
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
    GL_LINEAR)
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
    GL_LINEAR)
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, ix, iy, 0, GL_RGBA,
    GL_UNSIGNED_BYTE, image)
    else:
    mtl[values[0]] = map(float, values[1:])
    return contents

    class OBJ:
    def __init__(self, filename, swapyz=False):
    """Loads a Wavefront OBJ file. """
    self.vertices = []
    self.normals = []
    self.texcoords = []
    self.faces = []

    material = None
    for line in open(filename, "r"):
    if line.startswith('#'): continue
    values = line.split()
    if not values: continue
    if values[0] == 'v':
    v = map(float, values[1:4])
    if swapyz:
    v = v[0], v[2], v[1]
    self.vertices.append(v)
    elif values[0] == 'vn':
    v = map(float, values[1:4])
    if swapyz:
    v = v[0], v[2], v[1]
    self.normals.append(v)
    elif values[0] == 'vt':
    self.texcoords.append(map(float, values[1:3]))
    elif values[0] in ('usemtl', 'usemat'):
    material = values[1]
    elif values[0] == 'mtllib':
    self.mtl = MTL(values[1])
    elif values[0] == 'f':
    face = []
    texcoords = []
    norms = []
    for v in values[1:]:
    w = v.split('/')
    face.append(int(w[0]))
    if len(w) >= 2 and len(w[1]) > 0:
    texcoords.append(int(w[1]))
    else:
    texcoords.append(0)
    if len(w) >= 3 and len(w[2]) > 0:
    norms.append(int(w[2]))
    else:
    norms.append(0)
    self.faces.append((face, norms, texcoords, material))

    self.gl_list = glGenLists(1)
    glNewList(self.gl_list, GL_COMPILE)
    glEnable(GL_TEXTURE_2D)
    glFrontFace(GL_CCW)
    for face in tqdm(self.faces):
    vertices, normals, texture_coords, material = face
    # print(self.mtl)
    mtl = self.mtl[material]
    if 'texture_Kd' in mtl:
    # use diffuse texmap
    glBindTexture(GL_TEXTURE_2D, mtl['texture_Kd'])
    else:
    # just use diffuse colour
    glColor(*mtl['Kd'])

    glBegin(GL_POLYGON)
    for i in range(len(vertices)):
    if normals > 0:
    glNormal3fv(self.normals[normals - 1])
    if texture_coords > 0:
    glTexCoord2fv(self.texcoords[texture_coords - 1])
    glVertex3fv(self.vertices[vertices - 1])
    glEnd()
    glDisable(GL_TEXTURE_2D)
    glEndList()


    You can use your own model, just need .obj and .mlt file then edit it in the line 33.

    In the result, you can see that the background didn't transparent.

    enter im

    For any help, thank you so much! thank you so much!

    Continue reading...

Compartilhe esta Página