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í.

Doba čtení: 3 minuty
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.

MIF18 tip v článku témata

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?