PyOpenGL

fFZaO47

Depois de algum tempo decidindo entre Panda3D, Pyglet e PyOpenGL, acabei sendo obrigado pelo destino a usar PyOpenGL mesmo, a instalação do Panda3D foi meio caótica, chegou a funcionar independentemente, mas não consegui fazer a conexão com o Python. Então tenho passeado em tutoriais sobre OpenGL desde então. Passeios complicados, demorou pra eu achar alguma coisa realmente boa, até os livros mais recomendados pelo pessoal não parecem ser muito bons à primeira vista. Pra piorar (um pouco só) não existe livros sobre PyOpenGL, então tudo que eu encontro está em C ou C++. O que salva é o fato do PyOpenGL ter uma estrutura absurdamente parecida com a estrutura do OpenGL, então no fim das contas parece que é só ficar atento a algumas poucas diferenças que o resto é idêntico.

Eu gastei algum tempo aprendendo como fazer o PyOpenGL conversar com o PyQt4 e deu pra fazer uma janela “simples”. O hello world mais complicado da minha vida. Vou deixar o código e em seguida comentar uma coisa que seria bom se eu soubesse desde o início.

#-*- coding: utf-8 -*-

from PyQt4 import QtGui, QtCore, QtOpenGL
from PyQt4.QtOpenGL import QGLWidget
from OpenGL.GL import *
from OpenGL.GLU import *

class Quadrado(QGLWidget):
  def paintGL(self):
    glColor3f(1.0, 1.0, 1.0)  # Define a cor dos objetos
    glBegin(GL_LINES)         # Inicia o desenho da figura
    glVertex2f(-0.5, -0.5)
    glVertex2f(-0.5, 0.5)
    glVertex2f(-0.5, 0.5)
    glVertex2f(0.5, 0.5)
    glVertex2f(0.5, 0.5)
    glVertex2f(0.5, -0.5)
    glVertex2f(0.5, -0.5)
    glVertex2f(-0.5, -0.5)
    glEnd()                   # Finaliza o desenho da figura

  def resizeGL(self, largura, altura):
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    # As funcoes abaixo definem propriedades de visualizacao
    glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0)
    glViewport(0, 0, largura, altura)

  def initializeGL(self):
    glClearColor(0.0, 0.0, 0.0, 0.0)  # Define a cor do fundo
    glClear(GL_COLOR_BUFFER_BIT)      # Limpa definicoes de cor

class Janela(QtGui.QMainWindow):
  def __init__(self, parent=None):
    super().__init__()
    self.layout()

  def layout(self):
    self.figura = Quadrado()
    self.setCentralWidget(self.figura)

def main():
  app = QtGui.QApplication(['Hello PyOpenGL!'])
  win = Janela()
  win.show()
  app.exec_()

main()
Resultado
Resultado

Aparentemente é bem tranquilo fazer o PyOpenGL e o PyQt4 conversarem, o problema mesmo é saber usar o PyOpenGL 😛
Bom, um ponto importante é o seguinte: as funções paintGL, resizeGL e initializeGL não podem ser definidas com outros nomes! Eu tentei fazer um código todo em português na primeira tentativa, quando eu rodava o script a janela aparecia, mas toda bugada. Mas o terminal (ou IDLE) não retorna erros caso essas funções não estiverem devidamente nomeadas!

De resto não tem muito o que falar na verdade. O argumento “GL_LINES” da função que desenha vai desenhar uma linha pra cada dois pontos definidos com glVertex2f(x, y). No caso esse 2 indica que a coisa é bidimensional.
Talvez seja óbvio, mas vale comentar que a cor do objeto definida pelo método glColor3f usa o código de cor RGB como argumentos.

Anúncios

Comentário:

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s