Jak implementovat Z bufer – Python – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Jak implementovat Z bufer – Python – Fórum – Programujte.comJak implementovat Z bufer – Python – Fórum – Programujte.com

 

tomino
~ Anonymní uživatel
20 příspěvků
24. 6. 2021   #1
-
0
-

Ahoj, nevíte někdo jak v pythonu udělat Z-bufer?

Nahlásit jako SPAM
IP: 195.226.105.–
gna
~ Anonymní uživatel
1891 příspěvků
24. 6. 2021   #2
-
0
-

Já znám jen Z-buffer z grafiky. To je prostě pole vzdáleností pixelů a používá se k tomu, aby se vzdálenějšími pixely nepřekreslovaly ty bližší. Na tom nic není, není mi jasné, na co se ptáš.

class Buffer:
    def __init__(self, width, height):
        self.colorbuf = [[(0, 0, 0)] * width for _ in range(height)]
        self.depthbuf = [[-10000] * width for _ in range(height)]

    def putpixel(self, x, y, z, color):
        if self.depthbuf[y][x] < z:
            self.depthbuf[y][x] = z
            self.colorbuf[y][x] = color
Nahlásit jako SPAM
IP: 213.211.51.–
tomino
~ Anonymní uživatel
20 příspěvků
24. 6. 2021   #3
-
0
-

Děkuji, ale ještě bych potřeboval to nějak zobrazit.

Nahlásit jako SPAM
IP: 195.226.105.–
gna
~ Anonymní uživatel
1891 příspěvků
25. 6. 2021   #4
-
0
-

Tak když řešíš z-buffer, tak už asi nějak kreslit umíš. Tak v tom putpixel můžeš ten pixel místo ukládání rovnou vykreslit, nebo až nakonec vykreslit celý colorbuf (to bude rychlejší).

Takže třeba v Tkinteru (jen proto, že je ve standardní knihovně. Samozřejmě to bude pomalé a pro velké plochy úplně nepoužitelné. Např. Pygame umí pěkně blitnout celou plochu) nějak takhle:

import tkinter as tk


class Buffer:
    def __init__(self, width, height):
        self.colorbuf = [[(0, 0, 0)] * width for _ in range(height)]
        self.depthbuf = [[-10000] * width for _ in range(height)]

    def putpixel(self, x, y, z, color):
        if self.depthbuf[y][x] < z:
            self.depthbuf[y][x] = z
            self.colorbuf[y][x] = color

    def toimage(self):
        imagedata = " ".join(
            "{" + " ".join("#%02x%02x%02x" % color for color in row) + "}"
            for row in self.colorbuf
        )
        return imagedata


def main():
    width, height = 400, 400

    buffer = Buffer(width, height)

    def drawrect(x1, y1, x2, y2, z, color):
        for y in range(y1, y2 + 1):
            for x in range(x1, x2 + 1):
                buffer.putpixel(x, y, z, color)

    drawrect(50, 100, 350, 150, -10, (255, 0, 0))  # cerveny, -10
    drawrect(50, 250, 350, 300, -30, (0, 255, 0))  # zeleny, -30
    drawrect(175, 50, 225, 350, -20, (0, 0, 255))  # modry, -20 => za cervenym, pred zelenym

    root = tk.Tk()
    canvas = tk.Canvas(root, width=width, height=height)
    canvas.pack()

    image = tk.PhotoImage()
    image.put(buffer.toimage())
    canvas.create_image((0, 0), anchor=tk.NW, image=image)

    root.mainloop()


if __name__ == "__main__":
    main()

Jestli chceš kreslit dynamickou scénu, tak Python výkonostně není dobrá volba na grafiku po pixelech.

Nahlásit jako SPAM
IP: 213.211.51.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 3 hosté

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý