LM18 Python3d
LM18 Python3d
Python/3D
Manipulao
Visualizao tridimensional com o VTK
3D no Python
Atualmente, o mundo dos objetos 3D j faz parte do cotidiano: s reparar no uso que a indstria do entretenimento faz dessa tecnologia. Aprenda como usar o Python para lidar com 3D, com o VTK.
Por Ana M. Ferreiro e Jos A. Garca Rodrguez
representao grca em 3D oferece a possibilidade de se criar mundos virtuais. Com a visualizao 3D, torna-se possvel explorar e entender sistemas complicados rapidamente, graas evoluo das linguagens orientadas a objetos, que permitem criar programas de melhor qualidade e de fcil manuteno. Entre as diferentes ferramentas de visualizao, representao e processamento de imagens 3D, vale destacar o VTK (Visualization Toolkit) [1] , uma biblioteca de cdigo aberto (implementada em C++) com wrappers para TCL, Python e Java , permitindo o desenvolvimento de aplicaes completas, de um modo eciente e com o uso de scripts simples. Por tudo isso, o VTK hoje bem utilizado na visualizao 3D nas reas mdica, industrial, na reconstruo de superfcies a partir de digitalizao a laser ou nuvens de pontos desorganizados etc. A seguir, veremos os conceitos bsicos usados pelo VTK para criarmos uma cena
e, atravs de uma srie de exemplos desenvolvidos em Python, vamos criar nossos prprios cenrios de visualizao.
Instalao
Para nossos exemplos, preciso ter instalado o Python e o VTK (com
Em qualquer um dos casos, para compilar o VTK precisamos do Cmake, que pode ser obtido em www.cmake.org/HTML/Download.html. Se preferir, tambm pode-se obter o Cmake pelo CVS:
cvs -d :pserver:[email protected]:/cvsroot/CMake U login password: cmake
Uma vez que tenhamos baixado e instalado o Cmake, podemos compilar o VTK. Para isso, devemos entrar na pasta onde est o VTK e teclar a partir da linha de comando: cmake -i. Um prompt vai perguntar o que se quer compilar. Devemos prestar ateno e, quando aparecer a pergunta sobre a opo de se instalar os wrappers para Python, responder armativamente (j que a resposta no automtica). Ento, basta teclar make e depois make install.
72
maro 2006
edio 18 www.linuxmagazine.com.br
Python/3D
Programao
suporte para Python). Alm disso, a placa de vdeo precisa estar com o OpenGL funcionando. H duas maneiras de instalar o VTK: a primeira baixar e instalar os pacotes binrios. No caso do Suse, Fedora ou Mandriva (Mandrake), basta procurar pelos seguintes pacotes RPM (em nosso exemplo, para o Mandrake 10.1): P vtk-4.2.2-5mdk.i586.rpm P vtk-python-4.2.2-5mdk.i586.rpm P vtk-tcl-4.2.2-5mdk.i586.rpm P vtk-examples-4.2.2-5mdk.i586.rpm P vtk-devel-4.2.2-5mdk.i586.rpm Esses pacotes podem ser baixados atravs do repositrio RedIris [2]. A outra maneira compilar o cdigo fonte, conforme explicado no quadro 1: Como compilar o VTK.
Figura 2: Os diferentes tipos de dados que podem constituir um objeto: a) dados poligonais; b) pontos estruturados; c) malha no estruturada; d) malha estruturada. acredite, todos esses conceitos so a base da visualizao grca. Vejamos como essa estrutura. A biblioteca VTK foi projetada a partir de dois modelos, claramente distintos: o modelo grfico e o modelo de visualizao. P Modelo grco Captura as principais caractersticas de um sistema grco 3D, de modo fcil de compreender e utilizar (figura 1). A abstrao est baseada na indstria do cinema. Os modelos bsicos que constituem esse modelo so: vtkRenderer, vtkRenderWindow, vtkLight, vtkCamera, vtkProp, vtkProperty, vtkMapper, vtkTransform (a tabela 1 descreve cada um desses objetos). P Modelo de visualizao O papel do modelo grco o de transformar dados grcos em imagens, enquanto que o modelo de visualizao transforma informaes em dados grcos. Isso signica que o modelo de visualizao o responsvel por construir a representao geomtrica que renderizada atravs do modelo grco. O VTK se baseia na aproximao dos dados para transformar a informao em dados grcos. H dois tipos bsicos de objetos envolvidos na aproximao (descritos na tabela 2): vtkDataObject e vtkProcessObject. Os diferentes tipos de dados que podem constituir um objeto so: pontos, retas, polgonos, pontos estruturados, malhas estruturadas, malhas no estruturadas etc (figura 2).
Primeira cena
J estamos prontos para construir a nossa primeira cena. Vamos nos colocar no papel do diretor de cinema. Nos exemplos a seguir, veremos como empregar as classes que acabamos de descrever. Para isso, assim como dissemos no incio, vamos usar instncias de objetos VTK dentro dos scripts Python.
maro 2006 edio 18
www.linuxmagazine.com.br
73
Programao
Python/3D
Por meio de qualquer editor de texto, criamos um arquivo cone.py. A primeira coisa a fazer importar o pacote VTK do Python. Isso bastante simples. Basta a seguinte linha: import vtk. Agora j podemos criar instncias de qualquer objeto VTK, apenas escrevendo vtk.nome_classe no cdigo do programa. Precisamos tambm criar nossa janela de renderizao vtk. vtkRenderWindow, que chamaremos de renWin, e qual associaremos uma rea de renderizao vtk.vtkRenderer (que denominamos ren), atravs do mtodo AddRenderer(). Isso feito com as linhas de cdigo a seguir:
Para que possamos manipular a cmera por meio do mouse, o objeto vtkRenderWindowInteractor (denominado no cdigo como iren) dever ser instanciado. Note que a janela de renderizao renWin se associa ao objeto de interao iren atravs do mtodo SetRenderWindow. Nesse momento, ainda no percebemos a utilidade disso. Pacincia, vamos compreender sua importncia quando tivermos um ator em nosso cenrio. Fechamos o arquivo e, na linha de comando, executamos o programa digitando python cone.py. E nada acontece! Isso ocorre porque devemos iniciar a interao do usurio e indicar que a janela de renderizao deve permanecer visvel at que o usurio nalize sua execuo, fechando-a. Para isso, basta adicionar ao cdigo:
iren.Initialize() iren.Start()
Ao executarmos novamente o programa, veremos uma janela negra se abrir, com seus botes de maximizar, minimizar e fechar, e que s ser fechada quando o usurio quiser ( figura 3 ). Ela ser o armazenador da nossa pequena cena. Note que as duas linhas de cdigo que acabamos de escrever devem car no nal do arquivo. As demais linhas que venham a ser escritas devero car logo antes. No vamos criar um ator muito complicado, pois queremos ver logo alguma coisa acontecer. O VTK contm uma srie de classes que nos permitem criar objetos tridimensionais simples como esferas ( vtkSphereSource), cones ( vtkConeSource) e cilindros ( vtkCilinderSource), entre muitos outros. Tomaremos como exemplo um cone no entanto, voc pode optar por qualquer um dos outros objetos. O seguinte cdigo cria nosso primeiro ator:
cone=vtk.vtkConeSource() coneMapper=vtk.vktPolyDataMapper() coneMapper.SetInput(cone.GetOutput()) coneActor=vtk.vtkActor() coneActor.SetMapper(coneMapper)
Descrio
74
maro 2006
edio 18 www.linuxmagazine.com.br
Python/3D
Programao
automaticamente para observarmos os objetos iluminados. Experimente comentar a linha renWin. Render(). O que acontece? Como voc j deve ter-se dado conta, o cone no aparece. Isso porque, cada vez que adicionamos um ator, necessrio renderizar a cena, pois, se no a retomamos, como se no houvssemos adicionado um novo ator.
Propriedades
C vtkActor() O ator que vamos criar associado malha que o gerou: B.SetMapper()
Figura 4: O passo-a-passo para se criar um ator. Por meio do objeto vtk.vtkConeSource, criamos a representao poligonal
de um cone que chamamos de cone. A sada do cone (cone.GetOutput()) um conjunto que se associa ao mapper (coneMapper) (vtk.vtkPolyDataMapper) atravs do mtodo SetInput(). Criamos o ator (objeto a ser renderizado) ao qual se associa a representao geomtrica que resulta em coneMapper. Note que os passos indicados aqui so, geralmente, os que precisamos seguir para construir um ator (figura 4 ). Quando criamos um ator, ele no inserido automaticamente na cena. preciso antes adicion-lo ao Render com um AddActor e renderizar a cena
Ao execut-lo novamente, iremos visualizar um cone de cor cinza (cor inserida automaticamente) dentro da nossa janela ( gura 5). Alm disso, nesse momento que a interao com o mouse se mostra importante: com o boto esquerdo possvel rotacionar a cmera; o boto central permite realizar traslados e, com o boto direito, nos aproximamos ou nos afastamos do objeto. Alm disso, uma luz foi inserida
Se voc seguiu o tutorial at esse ponto j ter criado seu cone cinza. Mas, provavelmente, no est muito satisfeito. Talvez outra cor fosse melhor, como branco e fundo azul, por exemplo. Na seqncia, vamos ver como modicar a janela de renderizao, a cmera e as propriedades do ator. No nal ser possvel fazer todas as alteraes que desejar. Voc j deve ter observado que a janela de renderizao se abre com um tamanho pr-determinado. Para xar o tamanho da janela preciso empregar o mtodo SetSize, no qual indicamos a altura e largura em pixels: renWin. SetSize(450,325). Se o que queremos mudar a cor de fundo da cena ( vtkRenderer), empregamos o mtodo SetBackground(RGB), no qual informamos a cor desejada
Objeto vtkDataObject
Descrio
edio 18
75
Programao
Python/3D
no formato RGB. Se quisermos um fundo azul, basta digitar ren.SetBackground(0.0, 0.0, 1). Conforme j explicado, a rea de renderizao (vtkRenderer) coordena a cmera e as luzes. Atravs do mtodo GetActiveCamera() temos acesso cmera criada na cena e assim podemos aplicar a ela todos os mtodos do objeto vtkCamera para modicar a visualizao como quisermos. Se o que queremos que todos os atores sejam vistos em sua totalidade dentro da rea de renderizao, preciso chamar o mtodo ResetCamera(). Nas linhas seguintes, podemos observar alguns dos mtodos relativos cmera:
ren.ResetCamera() camera=ren.GetActiveCamera() camera.Azimuth(60) camera.Pitch(5) camera.Yaw(5) camera.Roll(50) camera.Elevation(20) camera.Zoom(1.5)
Os mtodos Azimuth, Pitch, Yaw, Roll e Elevation so responsveis por rotacionar a cmera ou o ponto de foco em diferentes posies e tem, como argu-
mento, o ngulo de rotao. O melhor brincar um pouco com a cmera e ver o que acontece, testando cada um desses mtodos em separado. Por exemplo, para ver qual o efeito do mtodo Azimuth aplicado cmera, comente as linhas de cdigo restantes, caso contrrio, estaria misturando mtodos de rotao diferentes e, mesmo assim, no seria possvel saber direito o que est acontecendo. No se preocupe se em algum momento o ator sumir de cena. O que est acontecendo que o ngulo de rotao tal que impossvel ver o ator dentro da cena. A figura 6 explica de maneira simplicada como atua cada um desses mtodos levando em considerao o foco (representado por uma esfera branca). A partir desse ponto, comente as linhas de cdigo correspondentes aos mtodos que atuam sobre a cmera, deixando s a linha camera.Zoom(1.5) ativa. Assim podemos ver uma coisa de cada vez e, logo, poderemos mesclar o cdigo. Agora sabemos modificar a cena, mas o cone continua sendo visto na cor cinza, um pouco apagado. Para se alterar as propriedades de qualquer ator vtkActor, devemos utilizar o mtodo GetProperty(), que gera uma instncia do objeto vtkProp, associada ao referido ator. As linhas seguintes permitem modificar a cor, transparncia e espessura das linhas:
conepro=coneActor.U GetProperty() conepro.SetColor(1,0.2,0) conepro.SetOpacity(0.5) conepro.SetLineWidth(3) conepro.SetResolution(40) conepro.SetRepresentationU ToWireframe()
Figura 6: Comportamento dos mtodos da cmera a) Azimuth echas vermelhas; b) Pitch - echas azul-celeste; c) Yaw - echas azul-escuro d) Elevation - echas verdes e) Roll - echa amarela. A esfera branca representa o foco.
A ltima linha desse cdigo indica que queremos ver a estrutura bsica que constitui o ator, ou seja, a malha. O VTK j vem com teclas de atalho associadas cena: ao pressionar a tecla [S], todos os objetos so vistos renderizados (figura 7 ). J ao teclar [W], v-se apenas a malha (figura 8 ). Agora possvel observar melhor a diferena entre a malha e a estrutura renderizada. Nada melhor que poder enxergar as coisas! A linha conepro.SetResolution(40) modica a resoluo com a qual se renderiza o cone. Mas esse mtodo no serve para todos os atores, apenas para certos objetos que j so includos pelo VTK, tais como esfera (vtkSphereSource), cone (vtkConeSource), cilindro (vtkCilinderSource) etc.
76
maro 2006
edio 18 www.linuxmagazine.com.br
Python/3D
Programao
Listagem 1: cone_esfera.py
01 import vtk 02 03 # Geramos a estrutura para visualizar um cone 04 cone = vtk.vtkConeSource() 05 coneMapper = vtk.vtkPolyDataMapper() 06 coneMapper.SetInput(cone.GetOutput()) 07 coneActor = vtk.vtkActor() 08 coneActor.SetMapper(coneMapper) 09 10 # Criar fonte de esfera, mapeador e ator 11 esfera = vtk.vtkSphereSource() 12 esferaMapper = vtk.vtkPolyDataMapper() 13 esfera.SetPhiResolution(10) 14 esfera.SetThetaResolution(20) 15 esfera.SetCenter(0.3,0.0,0.0) 16 esferaMapper.SetInput(esfera.GetOutput()) 17 esferaActor = vtk.vtkActor() 18 esferaActor.SetMapper(esferaMapper) 19 esferaActor.GetProperty().SetColor(0.7,0.0,0.25) 20 esferaActor.GetProperty().SetOpacity(0.75) 21 esferaActor.GetProperty().SetLineWidth(1) 22 23 # Criamos: Renderer, RenderWindow, U RenderWindowInteractor 24 ren = vtk.vtkRenderer() 25 renWin = vtk.vtkRenderWindow() 26 renWin.AddRenderer(ren)
27 iren = vtk.vtkRenderWindowInteractor() 28 iren.SetRenderWindow(renWin) 29 30 # Adicionamos o ator na rea de renderizao (Renderer) 31 ren.AddActor(coneActor) 32 ren.AddActor(esferaActor) 33 34 #Fixamos a cor de fundo, o tamanho e damos zoom sobre 35 #a rea de Renderizao 36 ren.SetBackground(1, 1, 1) 37 renWin.SetSize(450, 425) 38 camera=ren.GetActiveCamera() 39 ##camera.Zoom(1.5) 40 41 coneActor.RotateX(30) 42 coneActor.RotateY(45) 43 conepro=coneActor.GetProperty() 44 conepro.SetColor(0,0.6,1) 45 ##conepro.SetOpacity(0.5) 46 conepro.SetLineWidth(2) 47 ren.ResetCamera() 48 ##camera=ren.GetActiveCamera() 49 camera.Zoom(1.5) 50 51 cone.SetResolution(40) 52 53 iren.Initialize() 54 renWin.Render() 55 iren.Start()
Qualquer objeto pode ser rotacionado, escalonado, ter suas dimenses mostradas etc, utilizando-se as propriedades de
um vtkActor em particular (para mais informaes, consulte a ajuda do VTK sobre o vtkProp3D, que a classe pai). Para rotacionar e escalonar nosso cone, usamos as linhas:
coneActor.RotateX(30) coneActor.RotateY(45) coneActor.SetScale([1,3,2])
so cone. Na listagem 1 so adicionados cena um cone e uma esfera que se intersectam (figura 9 ).
Informaes
[1] VTK: public.kitware.com/VTK/ [2] RPMs do VTK no Mandrake: ftp.rediris.es/sites3/ carroll.cac.psu.edu/mandrakelinux/ official/10.1/i586/media/contrib/ [3] Downloads VTK: www.vtk.org/get-software.php [4] Enthought. Ferramentas cientcas para Python: www.scipy.org [5] MayaVi: mayavi.sourceforge.net Ana M. Ferreiro e Jos Garca Rodrguez nados por informtica e dedicam a ela
Figura 9: Cena com dois atores em interseco, uma esfera sobre um cone.
Agora voc j sabe como criar sua prpria cena, modicar suas propriedades, adicionar um ator com as opes que quiser e modicar a posio da cmera. No caso de desejar adicionar mais atores sua janela de renderizao, basta seguir o mesmo procedimento empregado na criao do nos-
autores
edio 18
77