18.10.2013

OpenGL v Pythonu

Jednoduchý návod pro práci s OpenGL v jazyce Python. Vytvoření jednoduché aplikace pomocí knihovny pyglet.

V tomto článku se zaměříme na vytvoření jednoduché aplikace pro vykreslení 3D scény pomocí OpenGL. OpenGL sámo o sobě neumí vytvořit okno a zpracovávat události - prvky GUI. Proto použijeme jako nástavbu pythonovskou knihovku pyglet. Tato knihovna nám umožní pracovat se základními grafickými prvky, což jsou události myši, klávesnice a okna pro vykreslení scény, popřípadě taky multimediální soubory (obrázky, zvuk, atd).

Nejprve si nainstalujeme pyglet, možností je několik, buď z repozitáře vašeho systému nebo z pip repozitáře.

# ubuntu:
sudo apt-get install python-pyglet
# pip
sudo pip install pyglet
# fedora
sudo yum install python-pyglet

Celou naši aplikaci si zabalíme do hlavní třídy, aby se nám s ní lépe pracovalo

import pyglet #install python-pyglet

class UI:
    def __init__(self):
        self.win = pyglet.window.Window()

        @self.win.event
        def on_draw():
            self.win.clear()

    def run(self):
        pyglet.app.run()


if __name__=="__main__":
    ui = UI().run()

V příkladu vidíme už první práci s událostmi a to on_draw, která se zašle vždy když dojde ke změně sceny. Dekotárot @self.sin.event nám slouží pro registraci této události na volání dané funkce. Podobně budeme pracovat i s ostatními událostmi. Pro ty kdo se nesetkali s dekorátory, tak v jednoduchosti se jedná o označení funkce jinou funkcí, která se zavolá před a po jejím spuštění. :)

Práce s událostmi pak vypadá následovně, jen je potřeba dodržovat názvy method/funkcí. Zde si uvedeme zpracování většiny potřebných událostí.

class UI:
    def __init__(self):
        self.win = pyglet.window.Window()

        @self.win.event
        def on_draw():
            self.win.clear()

        @self.win.event
        def on_key_press(symbol, modifiers):
            print "key press (%s %s)" % (symbol, modifiers)

        @self.win.event
        def on_mouse_press(x, y, button, modifiers):
            print "mouse press: ", x, y, button, modifiers

        @self.win.event
        def on_mouse_release(x, y, button, modifiers):
            print "mouse release ", x, y, button, modifiers

        @self.win.event
        def on_mouse_motion(x, y, dx, dy):
            print "mouse move: (%s, %s) -> (%s, %s) " % ( x, y, dx, dy)

Názvy funkcí mluví dostatečně, ale raději si ještě popíšeme. Volání funkce on_key_press se provede vždy když stiskneme nějakou klávesnice. Funkce on_mouse_press pak v případě stisknutí tlačítka myši, rozlišujeme pak klik na levé a pravé tlačítko myši. Tato událost se nám vyvolá i v případě že držíme tlačíko myši delší dobu. K tomu nám pak dobře poslouží funkce on_mouse_release která je zavolána jakmile tlačítko myši pustíme. Funkce on_mouse_motion je volána vždy když dojde ke změně kurozru, tedy pohybu myši, a to počáteční souřadnice a konečné. Nulové souřadnice jsou určeny levým horním bodem.

A máme jednoduchou aplikaci která nám zpracovává události GUI. Teď ještě něco vykreslit, ale na to se podíváme příště.