Hlavní navigace

Knihovna PyOpenGL (5)

Jakub Matys 12. 5. 2005

V dnešním dílu si zase na krátkém příkladu ukážeme funkce knihovny PyOpenGL. Bude se jednat o funkce pracující s transformační maticí.

from OpenGL.GL import *
from OpenGL.GLUT import *
from sys import argv

def reshape(width, height):
    glViewport(0,0,width,height)
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    glOrtho(-8.0,8.0,-8.0,8.0,-8.0,8.0)
    glMatrixMode(GL_MODELVIEW)

def draw():
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    glLoadIdentity()
    glTranslatef(-2.5, 0.0, 0.0)
    glRotatef(-30, 1.0, 0.0, 0.0)
    glRotatef(30, 0.0, 1.0, 0.0)
    glRotatef(30, 0.0, 0.0, 1.0)

    glColor3f(1.0, 0.0, 1.0)

    glBegin(GL_TRIANGLE_FAN)
    glVertex3d(0,4,0)
    glVertex3d(0,-4,-4)
    glVertex3d(-4,-4,4)
    glVertex3d(4,-4,4)
    glVertex3d(0,-4,-4)
    glEnd()

    glColor3f(0.0, 1.0, 1.0)

    glBegin(GL_TRIANGLES)
    glVertex3d(0,-4,-4)
    glVertex3d(-4,-4,4)
    glVertex3d(4,-4,4)
    glEnd()

    glLoadIdentity()
    glTranslatef(2.5, 0.0, 0.0)
    glRotatef(45, 1.0, 0.0, 0.0)
    glRotatef(45, 0.0, 1.0, 0.0)
    glRotatef(45, 0.0, 0.0, 1.0)

    glColor3f(0.0, 1.0, 0.0)

    glBegin(GL_QUAD_STRIP)
    glVertex3d(3,3,-3)
    glVertex3d(3,-3,-3)
    glVertex3d(-3,3,-3)
    glVertex3d(-3,-3,-3)
    glVertex3d(-3,3,3)
    glVertex3d(-3,-3,3)
    glVertex3d(3,3,3)
    glVertex3d(3,-3,3)
    glVertex3d(3,3,-3)
    glVertex3d(3,-3,-3)
    glEnd()

    glColor3f(0.0, 0.0, 1.0)

    glBegin(GL_QUADS)
    glVertex3d(-3,-3,-3)
    glVertex3d(3,-3,-3)
    glVertex3d(3,-3,3)
    glVertex3d(-3,-3,3)
    glVertex3d(-3,3,-3)
    glVertex3d(3,3,-3)
    glVertex3d(3,3,3)
    glVertex3d(-3,3,3)
    glEnd()
    glFlush()

glutInit(argv)
glutCreateWindow('Knihovna PyOpenGL(5)')
glutReshapeWindow(500, 500)
glutPositionWindow(100,100)
glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH)

glClearColor(0.0, 0.0, 0.0, 0.0)
glShadeModel(GL_FLAT)
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)
glEnable(GL_DEPTH_TEST)

glutReshapeFunc(reshape)
glutDisplayFunc(draw)
glutMainLoop() 

glViewport

void glViewport(    GLint x, GLint y, GLsizei width, GLsizei height); 

Souřadnice vrcholů jsou transformovány do tzv. normalizovaných souřadnic pomocí modelovací a projekční transformace. glViewport tyto normalizované souřadnice transformuje zase do souřadnic okna. Funkce specifikuje část okna, do kterého se bude zobrazovat scéna.

Parametry x, y specifikují levý spodní okraj ViewPortu (v pixelech). width a height specifikují zase šířku a výšku plochy. Tyto rozměry jsou při spuštění programu nastaveny na velikost okna. Je možné definovat i více ViewPortů pro jedno okno.

glMatrixMode

void glMatrixMode(GLenum mode);
glMatrixMode(mode) -> None 

Tato funkce nastaví matici, kterou chceme měnit. Funkce může přebírat čtyři různé hodnoty:

  • GL_MODELVIEW – Změny se budou projevovat v modelovací matici.
  • GL_PROJECTION – Změny se budou projevovat v projekční matici.
  • GL_TEXTURE – Změny se budou projevovat v texturové matici.
  • GL_COLOR – Změny budou patrné v matici barev.

V daném okamžiku lze modifikovat pouze jednu matici (tzv. aktuální), před každým blokem operací musíte tedy nastavit požadovanou matici. Pro další operace s maticí musíte mít někde v paměti již uložené transformační matice, ty mohou být buď přinásobeny k aktuální matici, nebo mohou aktuální matici úplně nahradit. Pro násobení matice použijte funkci glMultMatrix[fd]. Ta vynásobí matici zprava parametrem a výsledek nastaví jako aktuální transformační matici. Nahrazení matice můžete provést funkcí glLoadMatrix[fd], jejíž parametr bude nastaven. K uložení matice použijeme funkci glGetFloatv s parametrem GL_MODELVIEW_MAT­RIX, GL_PROJECTION_MAT­RIX, GL_TEXTURE_MATRIX nebo GL_COLOR_MATRIX, která vrátí seznam s daty matice.

glLoadIdentity

void glLoadIdentity();
glLoadIdentity() -> None 

Metoda nahraje do aktuální transformační matice koeficienty jednotkové matice. Tento proces se většinou používá před dalšími transformacemi matice.

glOrtho

void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
glOrtho(left, right, bottom, top, zNear, zFar) -> None 

Funkce nastavuje ortografickou kameru, viz Grafická knihovna OpenGL (13). Parametry left, right, top a bottom specifikují ořezávací okno v průmětně (rovina xy), near a far určují vzdálenost ořezávacích rovin na ose z. Stěny kvádru omezující zobrazovanou část scény se při promítání chovají jako ořezávací roviny, tzn. vše, co leží za nimi, není zobrazeno.

PyOpenGL 5

glTranslate

void glTranslated(GLdouble x, GLdouble y, GLdouble z);

void glTranslatef(GLfloat x, GLfloat y, GLfloat z);
glTranslated(x, y, z) -> None
glTranslatef(x, y, z) -> None 

Funkce měnící matici specifikuje posun o vektor (x, y, z). Při manipulaci se vytvoří dočasná matice, kterou je aktuální matice vynásobena.

Našli jste v článku chybu?

12. 5. 2005 14:51

Chtěl bych se zeptat, jak je to s výkonem aplikací v PyOpenGL oproti nativní implementaci v C. Máte s tím někdo zkušenosti?
Lupa.cz: Proč firmy málo chrání data? Chovají se logicky

Proč firmy málo chrání data? Chovají se logicky

Podnikatel.cz: Vrátí zvýhodnění, ale výrazně omezí paušály

Vrátí zvýhodnění, ale výrazně omezí paušály

120na80.cz: Rakovina oka. Jak ji poznáte?

Rakovina oka. Jak ji poznáte?

Měšec.cz: U levneELEKTRO.cz už reklamaci nevyřídíte

U levneELEKTRO.cz už reklamaci nevyřídíte

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

Vitalia.cz: Jsou čajové sáčky toxické?

Jsou čajové sáčky toxické?

Měšec.cz: Finančním poradcům hrozí vracení provizí

Finančním poradcům hrozí vracení provizí

DigiZone.cz: Sony KD-55XD8005 s Android 6.0

Sony KD-55XD8005 s Android 6.0

Vitalia.cz: Znáte „černý detox“? Ani to nezkoušejte

Znáte „černý detox“? Ani to nezkoušejte

Vitalia.cz: Dáte si jahody s plísní?

Dáte si jahody s plísní?

Vitalia.cz: Chtějí si léčit kvasinky. Lék je jen v Německu

Chtějí si léčit kvasinky. Lék je jen v Německu

Vitalia.cz: Mondelez stahuje rizikovou čokoládu Milka

Mondelez stahuje rizikovou čokoládu Milka

120na80.cz: Pánové, pečujte o svoje přirození a prostatu

Pánové, pečujte o svoje přirození a prostatu

Vitalia.cz: Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Podnikatel.cz: Babiš: E-shopy z EET možná vyjmeme

Babiš: E-shopy z EET možná vyjmeme

Lupa.cz: Insolvenční řízení kvůli cookies? Vítejte v ČR

Insolvenční řízení kvůli cookies? Vítejte v ČR

Podnikatel.cz: Babiše přesvědčila 89letá podnikatelka?!

Babiše přesvědčila 89letá podnikatelka?!

Lupa.cz: Seznam mění vedení. Pavel Zima v čele končí

Seznam mění vedení. Pavel Zima v čele končí

Root.cz: Vypadl Google a rozbilo se toho hodně

Vypadl Google a rozbilo se toho hodně

Měšec.cz: Jak vymáhat výživné zadarmo?

Jak vymáhat výživné zadarmo?