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_MATRIX, GL_PROJECTION_MATRIX, 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.

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.