{ "metadata": { "name": "" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "[Python para Desenvolvedores](http://ricardoduarte.github.io/python-para-desenvolvedores/#conteudo)\n", "===================================\n", "2ª edi\u00e7\u00e3o, revisada e ampliada\n", "-----------------------------------\n", "\n", "Cap\u00edtulo 37: Imagens em tr\u00eas dimens\u00f5es\n", "=============================\n", "_____________________________\n", "Os formatos matricial e vetorial representam imagens bidimensionais no computador de forma adequada para a maior parte das aplica\u00e7\u00f5es. Por\u00e9m, elas s\u00e3o limitadas em v\u00e1rios aspectos, principalmente para simula\u00e7\u00f5es, pois mundo que vivemos tem tr\u00eas dimens\u00f5es (3D).\n", "\n", "Uma cena 3D \u00e9 composta por objetos, que representam s\u00f3lidos, fontes de luz e c\u00e2meras. Os objetos s\u00f3lidos geralmente s\u00e3o representados por malhas (*meshes*), que s\u00e3o conjunto de pontos (v\u00e9rtices). Estes possuem coordenadas x, y e z. Os pontos s\u00e3o interligados por linhas (arestas) que formam as superf\u00edcies (*faces*) dos objetos. Conjuntos de linhas que representam as malhas s\u00e3o chamados de estruturas de arame (*wireframes*).\n", "\n", "![Cena 3D](files/cena3d.png)\n", "\n", "Objetos podem usar um ou mais materiais e estes podem ter v\u00e1rias caracter\u00edsticas, tais como cor, transpar\u00eancia e sombreamento, que \u00e9 a forma como o material responde a ilumina\u00e7\u00e3o da cena. Al\u00e9m disso, o material pode ter uma ou mais texturas associadas.\n", "\n", "Texturas s\u00e3o compostas por imagens de duas dimens\u00f5es que podem ser usadas nos materiais aplicados as superf\u00edcies dos objetos, alterando v\u00e1rias propriedades, tais como reflex\u00e3o, transpar\u00eancia e enrugamento (*bump*) da superf\u00edcie.\n", "\n", "Em uma cena 3D, os objetos podem modificados atrav\u00e9s de transforma\u00e7\u00f5es, tais como transla\u00e7\u00e3o (mover de uma posi\u00e7\u00e3o para outra), rota\u00e7\u00e3o (girar em torno de um eixo) e redimensionamento (mudar de tamanho em uma ou mais dimens\u00f5es).\n", "\n", "![Engrenagens 3D](files/engrenagens3d.png)\n", "\n", "Para renderizar, ou seja, gerar a imagem final, \u00e9 necess\u00e1rio fazer uma s\u00e9rie de c\u00e1lculos complexos para aplicar ilumina\u00e7\u00e3o e perspectiva aos objetos da cena. Entre os algoritmos usados para renderiza\u00e7\u00e3o, um dos mais conhecidos \u00e9 o chamado *raytrace*, no qual os raios de luz s\u00e3o calculados da c\u00e2mera at\u00e9 as fontes de luz. Com isso, s\u00e3o evitados c\u00e1lculos desnecess\u00e1rios dos raios que n\u00e3o chegam at\u00e9 a c\u00e2mera.\n", "\n", "Um dos usos mais populares da tecnologia 3D \u00e9 em anima\u00e7\u00f5es. A t\u00e9cnica mais comum de anima\u00e7\u00e3o em 3D \u00e9 chamada de *keyframe*. Nela, o objeto a ser animado \u00e9 posicionado em locais diferentes em momentos chave da anima\u00e7\u00e3o, e o software se encarrega de calcular os quadros intermedi\u00e1rios.\n", "\n", "Muitos aplicativos 3D utilizam bibliotecas que implementam a especifica\u00e7\u00e3o OpenGL (*Open Graphics Library*), que define uma API independente de plataforma e de linguagem, para a manipula\u00e7\u00e3o de gr\u00e1ficos 3D, permitindo a renderiza\u00e7\u00e3o em tempo real acelerada por hardware. Sua caracter\u00edstica mais marcante \u00e9 a performance. [Mesa 3D](http://www.mesa3d.org/) \u00e9 a implementa\u00e7\u00e3o livre mais conhecida e est\u00e1 amplamente dispon\u00edvel em distribui\u00e7\u00f5es de Linux e BSD.\n", "\n", "VPython\n", "-------\n", "[VPython](http://www.vpython.org/) \u00e9 um pacote que permite criar e animar modelos simples em tr\u00eas dimens\u00f5es. Seu objetivo \u00e9 facilitar a cria\u00e7\u00e3o r\u00e1pida de simula\u00e7\u00f5es e prot\u00f3tipos que n\u00e3o requerem solu\u00e7\u00f5es complexas.\n", "\n", "O VPython prov\u00ea ilumina\u00e7\u00e3o, controle de c\u00e2mera e tratamento de eventos de mouse (rota\u00e7\u00e3o e zoom) automaticamente. Os objetos podem ser criados interativamente no interpretador, que a janela 3D do VPython \u00e9 atualizada de acordo.\n", "\n", "Exemplo:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "\"\"\"\n", "Hexaedro\n", "\"\"\"\n", "\n", "# VPython\n", "import visual\n", "\n", "# Coordenadas para os v\u00e9rtices e arestas\n", "coords = (-3, 3)\n", "\n", "# Cor do v\u00e9rtice\n", "cor1 = (0.9, 0.9, 1.0)\n", "\n", "# Cor da aresta\n", "cor2 = (0.5, 0.5, 0.6)\n", "\n", "# Desenha esferas nos v\u00e9rtices\n", "for x in coords:\n", " for y in coords:\n", " for z in coords:\n", " # pos \u00e9 a posi\u00e7\u00e3o do centro da esfera\n", " visual.sphere(pos=(x, y, z), color=cor1)\n", "\n", "# Desenha os cilindros das arestas\n", "for x in coords:\n", " for z in coords:\n", " # pos \u00e9 a posi\u00e7\u00e3o do centro da base do cilindro\n", " # radius \u00e9 o raio da base do cilindro\n", " # axis \u00e9 o eixo do cilindro\n", " visual.cylinder(pos=(x, 3, z), color=cor2,\n", " radius=0.25, axis=(0, -6, 0))\n", "\n", " for y in coords:\n", " visual.cylinder(pos=(x, y, 3), color=cor2,\n", " radius=0.25, axis=(0, 0, -6))\n", "\n", "for y in coords:\n", " for z in coords:\n", " visual.cylinder(pos=(3, y, z), color=cor2,\n", " radius=0.25, axis=(-6, 0, 0))" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Janela 3D:\n", "\n", "![Visual Python](files/vpython1.png)\n", "\n", "Os objetos 3D do VPython podem ser agrupados em quadros (*frames*), que podem ser movidos e rotacionados.\n", "\n", "\u00c9 poss\u00edvel animar os objetos 3D usando la\u00e7os. Para controlar a velocidade da anima\u00e7\u00e3o, o VPython prov\u00ea a fun\u00e7\u00e3o `rate()`, que pausa anima\u00e7\u00e3o pelo inverso do argumento em segundos.\n", "\n", "Exemplo de quadro e anima\u00e7\u00e3o:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "\"\"\"\n", "Octaedro animado\n", "\"\"\"\n", "\n", "from visual import *\n", "\n", "# Cores\n", "azul = (0.25, 0.25, 0.50)\n", "verde = (0.25, 0.50, 0.25)\n", "\n", "# Eixo de rota\u00e7\u00e3o\n", "eixo = (0, 1, 0)\n", "\n", "# Cria um frame alinhado com o eixo de rota\u00e7\u00e3o\n", "fr = frame(axis=eixo)\n", "\n", "# O fundo da caixa\n", "box(pos=(0, -0.5, 0), color=azul,\n", " size=(10.0, 0.5, 8.0))\n", "\n", "# O bordas da caixa\n", "box(pos=(0, -0.5, 4.0), color=azul,\n", " size=(11.0, 1.0, 1.0))\n", "box(pos=(0, -0.5, -4.0), color=azul,\n", " size=(11.0, 1.0, 1.0))\n", "box(pos=(5.0, -0.5, 0), color=azul,\n", " size=(1.0, 1.0, 8.0))\n", "box(pos=(-5.0, -0.5, 0), color=azul,\n", " size=(1.0, 1.0, 8.0))\n", "\n", "# O pi\u00e3o\n", "py1 = pyramid(frame=fr, pos=(1, 0, 0), color=verde,\n", " axis=(1, 0, 0))\n", "py2 = pyramid(frame=fr, pos=(1, 0, 0), color=verde,\n", " axis=(-1, 0, 0))\n", "\n", "# O pi\u00e3o anda no plano y = 0\n", "delta_x = 0.01\n", "delta_z = 0.01\n", "\n", "print fr.axis\n", "\n", "while True:\n", "\n", " # Inverte o sentido em x\n", " if abs(fr.x) > 4.2:\n", " delta_x = -delta_x\n", "\n", " # Inverte o sentido em z\n", " if abs(fr.z) > 3.1:\n", " delta_z = -delta_z\n", "\n", " fr.x += delta_x\n", " fr.z += delta_z\n", "\n", " # Rotaciona em Pi / 100 no eixo\n", " fr.rotate(angle=pi / 100, axis=eixo)\n", "\n", " # Espere 1 / 100 segundos\n", " rate(250)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Janela 3D:\n", "\n", "![Visual Python - Octaedro](files/vpython2.png)\n", "\n", "O pacote inclui tamb\u00e9m um m\u00f3dulo de plotagem de gr\u00e1ficos, chamado *graph*.\n", "\n", "Exemplo:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# M\u00f3dulo para plotagem de gr\u00e1ficos\n", "from visual.graph import *\n", "\n", "# Gr\u00e1fico de linha simples\n", "g1 = gcurve(color=(.8, .6, .3))\n", "\n", "# Gr\u00e1fico de barras\n", "g2 = gvbars(delta=0.02, color=(.6, .4, .6))\n", "\n", "# Limites do eixo X do gr\u00e1fico\n", "for x in arange(0., 10.1, .1):\n", "\n", " # plot() recebe X e Y\n", " # Plotando a curva\n", " g1.plot(pos=(x, 3 * sin(x) + cos(5 * x)))\n", "\n", " # Plotando as barras\n", " g2.plot(pos=(x, tan(x) * sin(4 * x)))" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Janela de sa\u00edda:\n", "\n", "![Visual Python - Grafico](files/vpython_graph.png)\n", "\n", "Na vers\u00e3o 5, o VPython passou a incluir recursos como materiais prontos (como madeira, por exemplo) e controle de opacidade.\n", "\n", "Exemplo:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from visual import *\n", "\n", "# Define posi\u00e7\u00e3o inicial da c\u00e2mera\n", "scene.forward = (-0.1, -0.1, -0.1)\n", "\n", "# Limpa a ilumina\u00e7\u00e3o\n", "scene.lights = []\n", "\n", "# Define a ilumina\u00e7\u00e3o ambiente\n", "scene.ambient = (.1, .1, .2)\n", "\n", "# Uma caixa de madeira\n", "box(material=materials.wood)\n", "\n", "# Uma esfera de material semi-transparente\n", "sphere(radius=.2, pos=(-1, -0.3, 1), color=(.4, .5, .4),\n", " material=materials.rough, opacity=.5)\n", "\n", "# Uma textura xadrez\n", "x = 2 * (2 * (1, 0), 2 * (0, 1))\n", "# Define a textura nova\n", "mat = materials.texture(data=x, interpolate=False,\n", " mapping='rectangular')\n", "# Caixa com a nova textura\n", "box(axis=(0, 1, 0), size=(4, 4, 4), pos=(0, -3, 0), material=mat)\n", "\n", "# A l\u00e2mpada \u00e9 um frame composto por uma esfera e uma fonte de luz\n", "c = (1., .9, .8)\n", "lamp = frame(pos=(0, 1, 0))\n", "# Define uma fonte de luz\n", "local_light(frame=lamp, pos=(2, 1, 0), color=c)\n", "# Define uma esfera com material emissor\n", "sphere(frame=lamp, radius=0.1, pos=(2, 1, 0),\n", " color=c, material=materials.emissive)\n", "\n", "while True:\n", " # Anima a l\u00e2mpada, rotacionando em torno do eixo Y\n", " lamp.rotate(axis=(0, 1, 0), angle=.1)\n", " rate(10)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Janela de sa\u00edda:\n", "\n", "![Visual Python - Madeira](files/vpython_wood.png)\n", "\n", "O VPython tem v\u00e1rias limita\u00e7\u00f5es. Ele n\u00e3o prov\u00ea formas de criar e/ou manipular materiais ou texturas mais complexas, nem formas avan\u00e7adas de ilumina\u00e7\u00e3o ou detec\u00e7\u00e3o de colis\u00f5es. Para cenas mais sofisticadas, existem outras solu\u00e7\u00f5es, como o [Python Ogre](http://python-ogre.org/) e o Blender, que \u00e9 um aplicativo de modelagem 3D que usa Python como linguagem script.\n", "\n", "PyOpenGL\n", "--------\n", "As bibliotecas [OpenGL](http://www.opengl.org/) implementam uma API de baixo n\u00edvel para manipula\u00e7\u00e3o de imagens 3D, permitindo o acesso aos recursos dispon\u00edveis no hardware de v\u00eddeo, e tamb\u00e9m torna o c\u00f3digo independente da plataforma, pois emula por *software* as funcionalidades que n\u00e3o estiverem dispon\u00edveis no equipamento. Entre esses recursos temos: primitivas (linhas e pol\u00edgonos), mapeamento de texturas, opera\u00e7\u00f5es de transforma\u00e7\u00e3o e ilumina\u00e7\u00e3o.\n", "\n", "A OpenGL funciona em um contexto, que tem seu estado alterado atrav\u00e9s das fun\u00e7\u00f5es definidas na especifica\u00e7\u00e3o. Este estado \u00e9 mantido at\u00e9 que sofra uma nova altera\u00e7\u00e3o.\n", "\n", "Complementando a biblioteca principal, a *OpenGL Utility Library* (GLU) \u00e9 uma biblioteca com fun\u00e7\u00f5es de alto n\u00edvel, enquanto a *OpenGL Utility Toolkit* (GLUT) define rotinas independentes de plataforma para gerenciamento de janelas, entrada e contexto.\n", "\n", "A GLUT \u00e9 orientada a eventos, aos quais \u00e9 poss\u00edvel se associar fun\u00e7\u00f5es *callback*, que executam as chamadas OpenGL. A biblioteca tem uma rotina que monitora os eventos e evoca as fun\u00e7\u00f5es quando necess\u00e1rio.\n", "\n", "[PyOpenGL](http://pyopengl.sourceforge.net/) \u00e9 um pacote que permite que programas em Python utilizem as bibliotecas OpenGL, GLU e GLUT.\n", "\n", "Exemplo:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from sys import argv\n", "from OpenGL.GL import *\n", "from OpenGL.GLUT import *\n", "\n", "def display():\n", " \"\"\"\n", " Fun\u00e7\u00e3o callback que desenha na janela\n", " \"\"\"\n", " \n", " # glClear limpa a janela com valores pr\u00e9-determinados\n", " # GL_COLOR_BUFFER_BIT define que o buffer aceita escrita de cores\n", " # GL_DEPTH_BUFFER_BIT define que o buffer de profundidade ser\u00e1 usado\n", " glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)\n", "\n", " rgba = [.8, .6, .4, .9]\n", " # glMaterial especifica os par\u00e2metros do material que ser\u00e3o\n", " # usados no modelo de ilumina\u00e7\u00e3o da cena (no formato RGBA)\n", " # GL_FRONT define que a face afetada pela fun\u00e7\u00e3o \u00e9 a frontal\n", " # GL_AMBIENT especifica que o par\u00e2metro \u00e9 a reflex\u00e3o de ambiente\n", " glMaterialfv(GL_FRONT, GL_AMBIENT, rgba)\n", "\n", " # GL_DIFFUSE especifica que o par\u00e2metro \u00e9 a reflex\u00e3o difusa do material\n", " glMaterialfv(GL_FRONT, GL_DIFFUSE, rgba)\n", "\n", " # GL_SPECULAR especifica que o par\u00e2metro \u00e9 a reflex\u00e3o especular\n", " glMaterialfv(GL_FRONT, GL_SPECULAR, rgba)\n", "\n", " # GL_EMISSION especifica que o par\u00e2metro \u00e9 a emiss\u00e3o do material\n", " # glMaterialfv(GL_FRONT, GL_EMISSION, rgba)\n", "\n", " # GL_SHININESS especifica o expoente usado pela reflex\u00e3o especular\n", " glMaterialfv(GL_FRONT, GL_SHININESS, 120)\n", "\n", " # Desenha uma esfera s\u00f3lida, com raio 0.5 e 128 divis\u00f5es\n", " # na horizontal e na vertical\n", " glutSolidSphere(0.5, 128, 128)\n", "\n", " # For\u00e7a a execu\u00e7\u00e3o dos comandos da OpenGL\n", " glFlush()\n", "\n", "# Inicializa a biblioteca GLUT\n", "glutInit(argv)\n", "\n", "# glutInitDisplayMode configura o modo de exibi\u00e7\u00e3o\n", "# GLUT_SINGLE define o buffer como simples\n", "# (tamb\u00e9m pode ser duplo, com GLUT_DOUBLE)\n", "# GLUT_RGB seleciona o modo RGB\n", "glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB)\n", "\n", "# Cria a janela principal\n", "glutCreateWindow('Esfera')\n", "\n", "# Configura a fun\u00e7\u00e3o callback que desenha na janela atual\n", "glutDisplayFunc(display)\n", "\n", "# Limpa a janela com a cor especificada\n", "glClearColor(.25, .15, .1, 1.)\n", "\n", "# Muda a matriz corrente para GL_PROJECTION\n", "glMatrixMode(GL_PROJECTION)\n", "\n", "# Carrega uma matriz identidade na matriz corrente\n", "glLoadIdentity()\n", "\n", "# Configurando os par\u00e2metros para as fontes de luz\n", "# GL_DIFFUSE define o par\u00e2metro usado a luz difusa (no formato RGBA)\n", "glLightfv(GL_LIGHT0, GL_DIFFUSE, [1., 1., 1., 1.])\n", "\n", "# Os tr\u00eas par\u00e2metros definem a posi\u00e7\u00e3o da fonte luminosa\n", "# O quarto define se a fonte \u00e9 direcional (0) ou posicional (1)\n", "glLightfv(GL_LIGHT0, GL_POSITION, [-5., 5., -5., 1.])\n", "\n", "# Aplica os par\u00e2metros de ilumina\u00e7\u00e3o\n", "glEnable(GL_LIGHTING)\n", "\n", "# Inclui a fonte de luz 0 no calculo da ilumina\u00e7\u00e3o\n", "glEnable(GL_LIGHT0)\n", "\n", "# Inicia o la\u00e7o de eventos da GLUT\n", "glutMainLoop()" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Janela de sa\u00edda:\n", "\n", "![PyOpenGL - Esfera](files/pyopengl1.png)\n", "\n", "A biblioteca tamb\u00e9m oferece rotinas para fazer transforma\u00e7\u00f5es, o que permite animar os objetos da cena.\n", "\n", "Exemplo:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from sys import argv\n", "from OpenGL.GL import *\n", "from OpenGL.GLU import *\n", "from OpenGL.GLUT import *\n", "\n", "# \u00c2ngulo de rota\u00e7\u00e3o do objeto\n", "ar = 0.\n", "\n", "# Varia\u00e7\u00e3o da rota\u00e7\u00e3o\n", "dr = 1.\n", "\n", "def resize(x, y):\n", " \"\"\"\n", " Fun\u00e7\u00e3o callback que \u00e9 evocada quando\n", " a janela muda de tamanho\n", " \"\"\"\n", "\n", " # Limpa a vista\n", " glViewport(0, 0, x, y)\n", "\n", " # Seleciona a matriz de proje\u00e7\u00e3o\n", " glMatrixMode(GL_PROJECTION)\n", "\n", " # Limpa a matriz de proje\u00e7\u00e3o\n", " glLoadIdentity()\n", " \n", " # Calcula o aspecto da perspectiva\n", " gluPerspective(45., float(x)/float(y), 0.1, 100.0)\n", " \n", " # Seleciona a matriz de visualiza\u00e7\u00e3o\n", " glMatrixMode(GL_MODELVIEW)\n", "\n", "def draw():\n", " \"\"\"\n", " Fun\u00e7\u00e3o que desenha os objetos\n", " \"\"\"\n", " global ar, dr\n", "\n", " # Limpa a janela e o buffer de profundidade\n", " glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)\n", "\n", " # Limpa a matriz de visualiza\u00e7\u00e3o\n", " glLoadIdentity()\n", "\n", " # Move o objeto (transla\u00e7\u00e3o)\n", " # Par\u00e2metros: x, y e z (deslocamento)\n", " glTranslatef(-0.5, -0.5, -4.)\n", "\n", " # Rota\u00e7\u00e3o (em graus)\n", " # Par\u00e2metros: graus, x, y e z (eixo)\n", " glRotatef(ar, 1.0 , 1.0, 1.0)\n", "\n", " # Mudan\u00e7a de escala\n", " # Par\u00e2metros: x, y e z (tamanho)\n", " glScalef(ar / 1000, ar / 1000, ar / 1000)\n", "\n", " for i in xrange(0, 360, 10):\n", "\n", " # Rota\u00e7\u00e3o das faces do objeto\n", " glRotatef(10, 1.0 , 1.0, 1.0)\n", "\n", " # Inicia a cria\u00e7\u00e3o de uma face retangular\n", " glBegin(GL_QUADS)\n", "\n", " # Define a cor que ser\u00e1 usada para desenhar (R, G, B)\n", " glColor3f(.7, .5, .1)\n", "\n", " # Cria um v\u00e9rtice da face\n", " glVertex3f(0., 0., 0.)\n", " glColor3f(.7, .3, .1)\n", " glVertex3f(1., 0., 0.)\n", " glColor3f(.5, .1, .1)\n", " glVertex3f(1., 1., 0.)\n", " glColor3f(.7, .3, .1)\n", " glVertex3f(0., 1., 0.)\n", "\n", " # Termina a face\n", " glEnd()\n", "\n", " # Inverte a varia\u00e7\u00e3o\n", " if ar > 1000: dr = -1\n", " if ar < 1: dr = 1\n", " ar = ar + dr\n", "\n", " # Troca o buffer, exibindo o que acabou de ser usado\n", " glutSwapBuffers()\n", "\n", "def keyboard(*args):\n", " \"\"\"\n", " Fun\u00e7\u00e3o callback para tratar eventos de teclado\n", " \"\"\"\n", " # Testa se a tecla ESC foi apertada\n", " if args[0] == '\\33': \n", " raise SystemExit\n", "\n", "if __name__ == '__main__':\n", "\n", " # Inicializa a GLUT\n", " glutInit(argv)\n", "\n", " # Seleciona o modo de exibi\u00e7\u00e3o\n", " glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH)\n", "\n", " # Configura a resolu\u00e7\u00e3o da janela do GLUT de 640 x 480\n", " glutInitWindowSize(640, 480)\n", "\n", " # Cria a janela do GLUT\n", " window = glutCreateWindow('Transforma\u00e7\u00f5es')\n", "\n", " # Configura a fun\u00e7\u00e3o callback que desenha na janela atual\n", " glutDisplayFunc(draw)\n", "\n", " # Para exibir em tela cheia\n", " #glutFullScreen()\n", "\n", " # Registra a fun\u00e7\u00e3o para tratar redesenhar a janela quando\n", " # n\u00e3o h\u00e1 nada a fazer\n", " glutIdleFunc(draw)\n", "\n", " # Registra a fun\u00e7\u00e3o para redesenhar a janela quando\n", " # ela for redimensionada\n", " glutReshapeFunc(resize)\n", "\n", " # Registra a fun\u00e7\u00e3o para tratar eventos de teclado\n", " glutKeyboardFunc(keyboard)\n", "\n", " # Inicializa\u00e7\u00e3o da janela\n", " # Limpa a imagem (fundo preto)\n", " glClearColor(0., 0., 0., 0.)\n", "\n", " # Limpa o buffer de profundidade\n", " glClearDepth(1.)\n", " \n", " # Configura o tipo do teste de profundidade\n", " glDepthFunc(GL_LESS)\n", "\n", " # Ativa o teste de profundidade\n", " glEnable(GL_DEPTH_TEST)\n", "\n", " # Configura o sombreamento suave\n", " glShadeModel(GL_SMOOTH)\n", "\n", " # Seleciona a matriz de proje\u00e7\u00e3o\n", " glMatrixMode(GL_PROJECTION)\n", " glLoadIdentity()\n", " gluPerspective(45., 640. / 480., .1, 100.)\n", "\n", " # Seleciona a matriz de visualiza\u00e7\u00e3o\n", " glMatrixMode(GL_MODELVIEW)\n", "\n", " # Inicia o la\u00e7o de eventos da GLUT\n", " glutMainLoop()" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Janela de sa\u00edda:\n", "\n", "![PyOpenGL - Animando](files/pyopengl2.png)\n", "\n", "A OpenGL pode ser integrada com toolkits gr\u00e1ficos, como wxWidgets e Qt, ao inv\u00e9s de usar a GLUT, e com isso, ser incorporada em aplica\u00e7\u00f5es GUI convencionais.\n", "\n", "Uma das principais refer\u00eancias sobre OpenGL \u00e9 o livro \u201cOpenGL Programming Guide\u201d, tamb\u00e9m conhecido como [Red Book](http://www.glprogramming.com/red/)." ] }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [ { "html": [ "\n", "" ], "output_type": "pyout", "prompt_number": 1, "text": [ "" ] } ], "prompt_number": 1 } ], "metadata": {} } ] }