Hlavní navigace

Knihovna PyOpenGL (4)

Jakub Matys 8. 4. 2005

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?
Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

Lupa.cz: Proč firmy málo chrání data? Chovají se logicky

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

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

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

Vitalia.cz: Z tohoto konopí dělají léčivé masti

Z tohoto konopí dělají léčivé masti

120na80.cz: Co všechno ovlivňuje ženskou plodnost?

Co všechno ovlivňuje ženskou plodnost?

Vitalia.cz: Paštiky plné masa ho zatím neuživí

Paštiky plné masa ho zatím neuživí

Měšec.cz: Kdy vám stát dá na stěhování 50 000 Kč?

Kdy vám stát dá na stěhování 50 000 Kč?

DigiZone.cz: Recenze Westworld: zavraždit a...

Recenze Westworld: zavraždit a...

DigiZone.cz: ČT má dalšího zástupce v EBU

ČT má dalšího zástupce v EBU

Měšec.cz: Jak levně odeslat balík přímo z domu?

Jak levně odeslat balík přímo z domu?

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

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

Podnikatel.cz: K EET. Štamgast už peníze na stole nenechá

K EET. Štamgast už peníze na stole nenechá

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

Mondelez stahuje rizikovou čokoládu Milka

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

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

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

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

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

Sony KD-55XD8005 s Android 6.0

Měšec.cz: Air Bank zruší TOP3 garanci a zdražuje kurzy

Air Bank zruší TOP3 garanci a zdražuje kurzy

Lupa.cz: Co se dá měřit přes Internet věcí

Co se dá měřit přes Internet věcí

Podnikatel.cz: EET: Totálně nezvládli metodologii projektu

EET: Totálně nezvládli metodologii projektu

Lupa.cz: Teletext je „internetem hipsterů“

Teletext je „internetem hipsterů“