Hlavní navigace

Knihovna PyOpenGL (5)

Jakub Matys

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?