Hlavní navigace

Knihovna PyOpenGL (4)

Jakub Matys

V dnešním dílu budeme vykreslovat přímky. Znovu si předvedeme příklad v C a také jeho verzi přepsanou do Pythonu. Nakonec si povíme něco o funkcích, které se v příkladech vyskytují.

Příklad v C:

#include <GL/gl.h>
#include <GL/glu.h>


#define   drawOneLine(x1,y1,x2,y2) glBegin(GL_LINES); \

   glVertex2f ((x1),(y1)); glVertex2f ((x2),(y2)); glEnd();


void display(void)
{
    int i;

    glClearColor (0.0, 0.0, 0.0, 0.0);
    glShadeModel (GL_FLAT);

    glClear (GL_COLOR_BUFFER_BIT);
    glColor3f (1.0, 1.0, 1.0);


    glEnable (GL_LINE_STIPPLE);
    glLineStipple (1, 0x0101);
    drawOneLine (50.0, 125.0, 150.0, 125.0);
    glLineStipple (1, 0x00FF);
    drawOneLine (150.0, 125.0, 250.0, 125.0);
    glLineStipple (1, 0x1C47);
    drawOneLine (250.0, 125.0, 350.0, 125.0);

    glLineWidth (5.0);
    glLineStipple (1, 0x0101);
    drawOneLine (50.0, 100.0, 150.0, 100.0);
    glLineStipple (1, 0x00FF);
    drawOneLine (150.0, 100.0, 250.0, 100.0);
    glLineStipple (1, 0x1C47);
    drawOneLine (250.0, 100.0, 350.0, 100.0);
    glLineWidth (1.0);

    glLineStipple (1, 0x1C47);
    glBegin (GL_LINE_STRIP);
    for (i = 0; i < 7; i++)
    glVertex2f (50.0 + ((GLfloat) i * 50.0), 75.0);
    glEnd ();

    for (i = 0; i < 6; i++) {
    drawOneLine (50.0 + ((GLfloat) i * 50.0),
       50.0, 50.0 + ((GLfloat)(i+1) * 50.0), 50.0);
    }

    glLineStipple (5, 0x1C47);
    drawOneLine (50.0, 25.0, 350.0, 25.0);
    glFlush ();
}

Příklad v Pythonu:

#!/usr/bin/env python
import sys
from OpenGL.GLUT import *
from OpenGL.GL import *

def drawOneLine(x1, y1, x2, y2):
    glBegin(GL_LINES)
    glVertexf(x1, y1)
    glVertexf(x2, y2)
    glEnd()

def display():
    glClearColor(0.0, 0.0, 0.0, 0.0)
    glShadeModel(GL_FLAT)

    glClear(GL_COLOR_BUFFER_BIT)
    glColorf(1.0, 1.0, 1.0)


    glEnable(GL_LINE_STIPPLE)
    glLineStipple(1, 0x0101)
    drawOneLine(50.0, 125.0, 150.0, 125.0)
    glLineStipple(1, 0x00FF)
    drawOneLine(150.0, 125.0, 250.0, 125.0)
    glLineStipple(1, 0x1C47)
    drawOneLine(250.0, 125.0, 350.0, 125.0)


    glLineWidth(5.0)
    glLineStipple(1, 0x0101)
    drawOneLine(50.0, 100.0, 150.0, 100.0)
    glLineStipple (1, 0x00FF)
    drawOneLine(150.0, 100.0, 250.0, 100.0)
    glLineStipple(1, 0x1C47)
    drawOneLine(250.0, 100.0, 350.0, 100.0)
    glLineWidth(1.0);


    glLineStipple(1, 0x1C47)
    glBegin(GL_LINE_STRIP)
    for i in range(7):
        glVertexf(50.0 + (i * 50.0), 75.0)
    glEnd ()


    for i in range(6):
        drawOneLine(50.0 + (i * 50.0), 50.0,
                     50.0 + ((i+1) * 50.0), 50.0)


    glLineStipple(5, 0x1C47);
    drawOneLine(50.0, 25.0, 350.0, 25.0);
    glFlush();


glutInit(sys.argv)
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA)
glutCreateWindow("Primky")
glutReshapeWindow(400, 150)
glutPositionWindow(0, 0)
glutDisplayFunc(display)
glutMainLoop()

glShadeModel

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

Parametry funkce jsou hodnoty GL_FLAT a GL_SMOOTH (výchozí). Funkce nastavuje typ stínování na objektech, je možné používat konstantní a Gouraudovo stínovaní. Konstantní stínování se zapne předáním hodnoty GL_FLAT, Gouraudovo pak hodnotou GL_SMOOTH. Při konstantním stínování je pro každou plošku spočítána jen jedna barva a ploška je poté touto barvou vykreslena. Gouraudovo stínování řeší problém tak, že se spočítají barvy na vrcholech plošky a vnitřek se vyplní přechodem mezi těmito barvami.

glEnable

void glEnable(GLenum cap);
glEnable(cap) -> None
void glDisable(GLenum cap);
glDisable(cap) -> None
GLboolean glIsEnabled(GLenum cap);
glIsEnabled(cap) -> boolean

Funkce glEnable a glDisable slouží k povolování nebo zakazování možností knihovny, které jsou vypsány v následující tabulce. glIsEnabled vrací pravdivostní hodnotu podle toho, jestli je daná možnost povolena, či zakázána.

PyOpenGL-4
GL_ALPHA_TEST GL_AUTO_NORMAL GL_BLEND
GL_CLIP_PLANE GL_COLOR_LOGIC_OP GL_COLOR_MATERIAL
GL_COLOR_TABLE GL_CONVOLUTION_1D GL_CONVOLUTION_2D
GL_CULL_FACE GL_DEPTH_TEST GL_DITHER
GL_FOG GL_HISTOGRAM GL_INDEX_LOGIC_OP
GL_LIGHT GL_LIGHTING GL_LINE_SMOOTH
GL_LINE_STIPPLE GL_MAP1_COLOR4 GL_MAP1_INDEX
GL_MAP1_NORMAL GL_MAP1_TEXTU­RE_COORD1 GL_MAP1_TEXTU­RE_COORD2
GL_MAP1_TEXTU­RE_COORD3 GL_MAP1_TEXTU­RE_COORD4 GL_MAP1_VERTEX3
GL_MAP1_VERTEX4 GL_MAP2_COLOR4 GL_MAP2_INDEX
GL_MAP2_NORMAL GL_MAP2_TEXTU­RE_COORD1 GL_MAP2_TEXTU­RE_COORD2
GL_MAP2_TEXTU­RE_COORD3 GL_MAP2_TEXTU­RE_COORD4 GL_MAP2_VERTEX3
GL_MAP2_VERTEX4 GL_MINMAX GL_NORMALIZE
GL_POINT_SMOOTH GL_POLYGON_OF­FSET_FILL GL_POLYGON_OF­FSET_LINE
GL_POLYGON_OF­FSET_POINT GL_POLYGON_SMOOTH GL_POLYGON_STIPPLE
GL_POST_COLOR_MAT­RIX_COLOR_TAB­LE GL_POST_CONVO­LUTION_COLOR_TAB­LE GL_RESCALE_NORMAL
GL_SEPARABLE_2D GL_SCISSOR_TEST GL_STENCIL_TEST
GL_TEXTURE_1D GL_TEXTURE_2D GL_TEXTURE_3D
GL_TEXTURE_GEN_Q GL_TEXTURE_GEN_R GL_TEXTURE_GEN_S
GL_TEXTURE_GEN_T

Více informací naleznete v manuálových stránkách (man glEnable).

glLineStipple

void glLineStipple( GLint factor, GLushort pattern);
glLineStipple(factor,  pattern) -> None

Tato funkce umožňuje maskovat kreslenou úsečku. Funkci je předána šestnáctibitová maska, která je „nanesena“ na úsečku. Bity, které jsou nastaveny na 1, jsou vykresleny, nulové ne. Maska je funkci předána parametrem pattern. factor je faktor zvětšení masky ve směru úsečky. Maskování musíte nejdříve povolit příkazem

glEnable(GL_LINE_STIPPLE)

glLineWidth

void glLineWidth(GLfloat width);
glLineWidth(width) -> None

Funkce nastavuje šířku přímky(defaultně 1.0 – 1 pixel).

Našli jste v článku chybu?