Informática Numaboa - Tutoriais e Programação
Introdução a Python scripting no Blender 3D
Sex 6 Abr 2007 17:09 |
- Detalhes
- Categoria: Python
- Atualização: Terça, 16 Junho 2009 21:16
- Autor: Cícero Moraes
- Acessos: 19075
- Introdução a Python scripting no Blender 3D
- Colocando a mão no Prompt
- Colocando a mão no Prompt (2)
- Colocando a mão no Prompt (3)
- Colocando a mão no Prompt (4)
- Colocando a mão no Prompt (5)
- Colocando a mão no Prompt (6)
- Entendeste ou queres que eu desenhe?
- Entendeste ou queres que eu desenhe? (2)
- Entendeste ou queres que eu desenhe? (3)
- Entendeste ou queres que eu desenhe? (4)
- Entendeste ou queres que eu desenhe? (5)
- Entendeste ou queres que eu desenhe? (6)
- Algumas palavrinhas
- Todas as Páginas
Excelente tutorial vindo de Chapecó, SC, escrito por Cícero Moraes em 04.02.07. O autor disponibilizou o tuto para ser publicado aqui na Aldeia. Obrigada, cogitas3d!
Considerações iniciais
Nos meus tempos de Windows user aquela janelinha preta do Dos, ou prompt para os mais íntimos, parecia-me pouco atraente. Imagines só, o mouse era muito mais prático, era só mover a mão um pouquinho, apontar para aqueles ícones e tchiuca! dar uma clicada e a diligência estaria resolvida. Sempre deslumbrava os hackers usando o prompt e tentava imaginar o porque deles embuírem-se naquela atividade tediosa já que contavam com uma pratissíssima interface gráfica ao alcance das mãos. Não vou esticar a minha explanação com descrições pormenorizadas. A resposta a preferência dos hacker pela "telinha preta" evidenciou-se depois de alguns anos de uso do Linux de minha parte... era o controle. Quando tu contas com o modo texto à tua disposição e as ferramentas certas, tens via scripts e comandos todo o controle do sistema operacional. Tu podes desenhar, criar arquivos de textos, entrar na internet, baixar arquivos, fazer downloads e toda uma sorte de atividades naquela "tosca" telinha preta. O mais interessante é que tu podes usá-la tanto no computador que estiver na tua frente, quanto num computador nos confins da China via ssh, incrível não? Não??? Certo, imagines a situação. Tu tens uma firma no outro lado da cidade, estás no conforto do teu lar, curtindo uma chuvinha que lá fora cai. De repente toca o celular:
- Seu fulano, estou com um problema aqui no computador. Fiz o que o senhor mandou para criar o backup mas apareceu uma mensagem de erro maluca!
Tu nem pensas sair de casa, está bom demais curtir aquela chuvinha. Simples! Como o teu sistema é um Unix-like, basta entrares na internet e acessar o microcomputador remoto via Ssh. Assim que o fizer, tu dás uma olhada no arquivo .conf ou no script que criaste para fazer backup. Até então está tudo certo. Mas um pouco de procura, tu entras no histórico de comandos e póf! Descobre que o teu funcionário não rodou o comando correto para fazer backup. Então tu simplesmente o faz e manda um script para o funcionário em questão com os procedimentos corretos do trabalho.
Pois, isso é apenas um parco exemplo, o poder do modo texto é bastante amplo. Para aqueles que não compreenderam bem a explicação, o que quis dizer foi o seguinte:
Com o modo texto tu podes fazer praticamente qualquer coisa num computador, tanto o que está na tua frente agora, quanto um que estiver a milhares de quilômetros.
Agora a pergunta que não quer calar. Por que expliquei tudo isso? Simples. Assim que comecei a escrever alguns modestos scripts para automatizar as minhas tarefas ao usar o Linux, ví que quase todos os programas tinham um arquivo .conf que continham a configuração de seu funcionamento, que quase todas as ferramentas de configuração do sistema eram scripts e não programas binários e que mesmo os programas binários se comunicavam entre sí e ofereciam saídas e mensagens de erro e comportamento que desaguavam em um arquivo de texto.
Caramba! Arquivos de texto, eles são "os caras".
Depois da descoberta dos scripts analisei-os e estudei-os a fundo. Descobri que os programas do Shell Script, Perl e Python são interpretados ao invés do C ou Pascal que são compilados. Um programa em Python é um script, um texto. Um programa em C é compilado em um arquivo (ou vários) binário(s). Se tu tentas abrir um programa binário com um editor de texto irão aparecer aquele monte de símbolos estranhos, isso por que ele está na linguagem do computador. Mas, se tu abrires um script irás deparar-te com palavras compreensíveis. Entendeste? Certo, agora que eu sabia disso, comecei a perceber que essa realidade também de aplicava aos arquivos gerados por alguns programas. Por exemplo... o POV-Ray que é um renderer (programa que converte um arquivos com dados em uma imagem fotorealística ou não) que gera arquivos interpretados, já o Blender gera binários, ou seja, arquivos que tu não consegues abrir num editor de texto. Os do POV-Ray tu podes abrir em editores, editá-los, salvá-los e executá-los, já os do Blender tu só abres nele mesmo.
Exemplos de programas que geram arquivos interpretados: POV-Ray(.pov), Inkscape(.svg), OpenOffice(.odt)...
Exemplos de programas que geram arquivos binários: Blender 3D (.blend), Gimp (imagens como .jpg, xfc, gif...), Microsoft Word (.doc)...
A partir desta segunda fase passei a usar muito os programas que geravam arquivos interpretados ao invés de binários. Percebi que haviam prós e contras, o principal pró é o controle do arquivo e o principal contra é o enorme tamanho desses arquivos em relação aos binários. Por exemplo, um arquivo com uma animação multimídia de 250Kb binário corresponde a um interpretado de 45 Mb por exemplo! E mesmo compactando a diferença ainda é grande.
Outra coisa que descobri e esta ajudou-me bastante ao tornar prática a edição dos arquivos foram as Expressões Regulares. Não vou aprofundar-me no assunto, basta saberes que as expressões regulares ou regex possibilitam a edição de arquivos de texto através de padrões sem a necessidade de abri-los! Tu podes mudar ocorrências dentro deles, como datas, ordem de palavras, apagar letras, frases e todo o mais com um único comando!
Tudo isso deve estar parecendo meio confuso, mas não desistas. Continues lendo o texto que as coisas vão se encaixando pouco a pouco.
A priori fiquei bastante chateado por compreender que o Blender gerava arquivos binários ao invés de interpretados. Mas lembrava-me que haviam os scripts em Python ou Python Scripts. Oba! Havia uma possibilidade de controle! Estudei um pouco e... ieba! Essa ferramenta mostrou-se bastante flexível e amplamente utilizável, mesmo não sendo tão abrangente ou milagrosa.
Tu podes criar exportadores, construtores de meshes (malhas), configuradores e lá vai cacetada de opções. Também não vou me ater muito nestas explicações, basta dizer-te que se tu usares a tua imaginação atrelada a um bom know-how das ferramentas, se não fizeres chover, pelo menos fará de teu trabalho uma realidade mais prática, instigante e prazerosa!
Outro fator que me chamou a atenção depois de todo este estudo foi perceber o quão inteligente era a forma que os desenvolvedores do Blender gerenciavam o projeto no quesito "reinventar a roda"... eles simplesmente não fazem isso! Vejas só, acima explanei modestamente o funcionamento dos programas que rodam em sistemas Unix, ou Unix-Like. Escrevi que os programas conversavam entre si. Pois bem, há alguns anos, quando larguei o 3DS Max para trabalhar com o Blender, achava estranho que um programa com tantos recursos contasse com um tamanho tão reduzido. O mais impressionante é que o tempo passava... mais recursos eram embutidos e o tamanho pouco aumentava. Ué? Eu pensava... isso é impossível! Como um programa tão amplamente utilizável e com tantos recursos antagônicos pode ser deste tamanhico? Simples... o programa usava o esforço, o trabalho de outras pessoas. Por exemplo... um bendito vai e escreve uma biblioteca de simulação física, outro de um sistema de som. A pergunta é... por que os desenvolvedores vão criar as suas a partir do zero se eles têm à mão as bibliotecas citadas? Aparentemente foi isso que os developers (desenvolvedores) pensaram e executaram. Pelo menos foi o que entendi nos textos que li. Se tu fores instalar o Blender no Linux, ou mesmo compilá-lo, verás quantos programas e quantas bibliotecas serão necessárias no sistema para que ele funcione. No Windows essas bibliotecas vem como .ddls. Inteligente não? Pois escrevi este texto para complementar o que tenho tentado explicar. Que o Blender oferece o Python como uma linguagem que se coloca entre o sistema mais interno (core) e o externo (interface) para que tu possas, sem muito trabalho, executar operações que demandariam muito tempo e conhecimento pelo jeito tradicional ou acessível. Tu o que foi dito redunda em vários conceitos: Conhecimento da interface gráfica, programação (Python), conhecimentos internos da programação (expressões regulares) e gerenciamento do sistema (Shell, comandos básicos).
Obs.: Aconselho-te a ler sobre programação em Python, Orientação a Objetos, Shell script e expressões regulares. No final do tutorial estarei disponibilizando links para tal.
Colocando a mão no Prompt
Antes de mais nada, gostaria de dizer que este tutorial foi feito sobre o exemplo do criador do PovAnim, um script de exportação para o POV-Ray, muito bom por sinal, uma de minhas ferramentas de trabalho. Outro fato... sou um iniciante na arte da programação e desconheço a fundo o funcionamento da orientação a objeto, portanto não esperes um explicação pormenorizada dela, vou ater-me a uma visão geral. Combinado?
A primeira coisa que faremos é habilitar o console, para fazer isso sigas o procedimento abaixo:
Abras o Blender Hehehehe... caso contrário fica difícil de trabalhar.
Falando sério agora... dividas a tela principal em duas. Não sabes como fazer isso? Felizmente expliquei o processo em outro tutorial: installblend.
Como aparece acima, cliques no botão esquerdo inferior da janela direita (confuso né?) e seleciones "Scripts Window".
Isso! A aparência deve ficar como essa.
Aproveites e apagues tudo o que tem na janela esquerda. Assim verás o objeto que será criado.
Cliques no botão Scripts --> System --> Interactive console.
Um lindo console negro surgirá frente aos teus olhos! É nesse garotinho aí que escreveremos os comandos que confeccionarão a nossa mesh, ou malha.
Um pouco de conversa fiada antes de prosseguirmos. Existe outra forma de se criar Python scripts, a principal é atravéz de um arquivo de texto. Nesse tuto, nós utilizaremos o console, porque achei mais bonitinho... hehe, a verdade é que percebi nele uma forma do aprendiz lidar em tempo real com os comandos e ver o que está acontecendo... ver quando as coisas acontecem. O Blender também conta com um editor de texto com suporte a coloração de sintaxe para a linguagem Python, tu podes escrever teus scripts lá, ir já salvando e testando-os, show de bola, não?
Vejas só, naquela janelinha preta, ou console, tu vais escrever os comandinhos básicos. Comeces por:
Como aparece acima, depois dês dois Enters e vás ao próximo comando.
Certo? Depois dos dois Enters:
Bem, como estou enfadado de capturar a tela vou apenas escrever os comandos que se seguem. Escreva-os da mesma forma que aparecerem abaixo. Ah, para não precisares redigitar tudo de novo basta clicares na Seta para cima, para que os comandos anteriormente digitados apareçam na tela e Seta para baixo caso passes do comando desejado. Assim que aparecer o que estava precisando, podes modificar somente a parte necessária, como no caso das coordenadas dos vértices. Depois dos dois comandos acima escrevas estes:
Opa, opa! Nessa parte estás quase lá. Mas ainda não terminamos!
Percebas na imagem acima. Na parte direita estão listados todos os comandos que escreveste até então. E na esquerda aparece a janela 3d sem nenhum objeto exceto o cursor. O grand-finale será esse comando:
Uia!!! Um plane surgiu! mas de onde, meu Deus!
Mais conversa fiada. Tu deves estar perguntando-te: - Ué, escrevi este monte de comandos malucos e não entendi bulhufas! Pois bem, caro leitor. É óbvio que não vou te deixar nessa curiosidade tão latente. Tentarei explicar-te o que fizemos através de comentários e desenhos no decorrer dos comandos. Seria bom que tu estudasses um pouco de Python, mas como isso exige um tempo relativamente generoso lançaremos mão dessa breve explanação para compreender superficialmente o que aconteceu e como o Python se comporta ao usarmos ele para a construção de objetos no Blender.
Entendeste ou queres que eu desenhe?
Ok, eu desenho! Vamos começar traçando o objeto a ser criado.
Esse plane amarelo é o nosso garoto. Também foram traçados os planos x, y e z e as coordenadas dos vértices.
Vou destrinchar o código agora, tentarei ser breve e objetivo.
A primeira coisa que aparece é o seguinte:
Ótimo, e o que isso significa?
R. Esse me provavelmente é o Datablock Name do objeto, ou seja, o objeto como um todo ou empacotado, com formas, nome, posição e cia ltda. Depois nós temos o NMesh.GetRaw(), essa parte cria um objeto tipo mesh que será construído manualmente pelo usuário, diferente de uma box por exemplo que já vem pronta, tu terás de setar todas as vértices dele e suas respectivas posições. Até agora o Blender não tem idéia de como será o objeto, apenas sabe que tu queres fazer um e que tu desejas modelá-lo do zero. Ele está "em aberto".
Agora criamos um vértice ou vertex e posicionamos ele na coordenada 1, 0, 0
Depois de criado, precisamos atribuir ele ao objeto:
Vou tentar explicar o que esse pequeno código significa. O me é o nosso objeto indefinido, ele está recebendo um valor para o verts que está sendo colocado pelo append que por sua vez retira um dado de uma variável à direita (v) e coloca na outra variável à esquerda dele (verts). Meio redundante né? Mas é a explicação mais plausível que achei. Para que tu entendas bem o que aconteceu aqui, terás de ler sobre listas no Python. Essa variável verts abrigará nela não apenas um valor, mas vários, todas as coordenadas dos nossos quatro vértices.
Certo, para facilitar vamos imaginar que o me é um grupo com vários valores, dentre os quais o verts. O que vamos fazer é jogar todas as coordenadas dos vértices para a variável verts.
Entendeste? Vejas acima o que faremos ao final das atribuições de variável. A variável verts tem quatro valores precedidos de um número que é o índice. Mais tarde tu irás compreender isso.
Até então a variável verts não tem valor algum. Nós atribuímos a v o valor de 0, 0, 0. O sistema sabe que é um vértice por conta do comando NMesh.Vert(). Como o Python é uma linguagem orientada a objetos o v também é um; ele é um objeto vertex na posição 0, 0, 0 do plano cartesiano. Só isso, o Blender não sabe que a gente quer que esse vertex seja um dos que vão compor o nosso plane, ou o me. Daí entra o comando append(). Ele copia o valor de uma variável e atribui a outra.
Olhes acima... o append() copiou o valor de v e jogou-o como o índice [0] da variável verts. Assim o Blender sabe que o nosso objeto me tem um vertex posicionado em 0, 0, 0. Por enquanto só isso. Percebas que dentro do comando append() tem a variável que ele copiou, ou seja o v:
Agora faremos o mesmo para os outros vertex:
Todos os vertex foram criados, agora precisamos montar o plane, para isso criaremos um objeto mesh e atribuiremos os vertex a ele.
Esse comando criou um objeto Face, mas esse objeto está em aberto, pois precisa dos vertex para poder ligar um ao outro e formar o plane.
Tu não achas que eu vou desenhar todos os passos novamente, né? O processo é o mesmo descrito acima, com ligeira diferença.
Vejas que o me agora conta com mais um objeto dentro dele, o faces. O faces por sua vez usou os dados de verts para criar o mesh.
Para falar a verdade, eu não entendi direito o por que da atribuição de v ao f, aparentemente seria necessário apenas a primeira atribuição.
Vamos fechar agora a confecção do objeto com o comando:
Acabamos de criar o plane. Se tu olhares no me do objeto verás que o nome dele é justamente plane por conta da parte "plane" do código.
Como eu disse anteriormente, não sou um profundo conhecedor do que explanei acima. Apenas lancei mão da sede didática inicial para compartilhar com vossas mercês as dúvidas e certezas de alguém que está nos rudimentos do conhecimento almejado. A minha dica é que os interessados passem a "brincar" com as possibilidades de Python scripting no Blender todos os dias. Para se aprofundar mais consultes a documentação oficial desse componente:
http://www.blender3d.org/documentation/242PythonDoc/index.html
Vejas um comandinho hoje, outro amanhã... outro na semana que vem, mas não deixes de "bizolhar" sempre. Só assim para ires compreendendo como as coisas funcionam. Claro que para aprender bem o Python scripting tu precisarás saber sobre essa linguagem. poderás encontrar ótimas referências no site:
http://cogitas3d.procedural.com.br/tutos/www.pythonbrasil.com.br
Para aqueles que não compreenderam bem a forma de ativar o console do Python dentro do Blender, assistam a esse vídeo
http://www.youtube.com/watch?v=IfZXKLkSpSc
que as dúvidas serão sanadas. Ambos, o meu e o videotutorial acima são baseados nesse excelente material:
http://jmsoler.free.fr/didacticiel/blender/tutor/python_script00_en.htm
Esse talzinho é ninguém menos que o criador do script PovAnim, um exportador Blender --> POV-Ray.
Ah... olhes, é muito, mas muito importante que tu estudes um pouco sobre Expressões Regulares. Apesar de eu não ter tratado diretamente delas neste texto, tu acabarás precisando dominar o assunto se desejares ser um hacker do scripting. E a melhor fonte para esse assunto sem dúvida é esse site:
http://guia-er.sourceforge.net/
Aproveites e visites o site do meu camarada que entende tudo de modo texto, o grande Aurélio (não, não é o do dicionário!):
É isso, espero que estas palavras tenham trazido um pouco de compreensão à tua gloriosa mente. Gostaria de agradecer-te pela paciência de ler este tutorial e pedir-te que sempre que puderes compartilhes o conhecimento adquirido. Coisas maravilhosas acontecerão na tua vida e principalmente na tua cabeça. Ensinar é aprender, e compartilhar é se tornar mais forte. O verdadeiro sábio não anseia parecer grande, pois o sabe em seu coração. E nada melhor para o saber do que o compartilhar, santo ato este, que torna acessível a todos as multipossibilidades de crescimento portando-nos rumo ao que é transcendental.
Grande abraço!
Cícero Moraes