Usando o Blender como um Level Editor simples – Tutorial

O Blender 3D é um software cheio de defeitos. Dentre estes poderíamos citar sua interface pouco amigável e curva de aprendizado longa. Mas em compensação há pontos fortes, como o fato de ser de uso gratuito, multi-plataforma e, na minha opinião, um dos mais interessantes: sua extensibilidade.

Graças ao uso embutido da linguagem de programação Python – aliás, foi o Blender que me fez aprendê-la – é possível fazer plugins que são pau para toda a obra. Dentre um dos meus preferidos destaco o exportador para MD5 (útil para exportar animações 3D para uso no Away3D), além de renderizadores externos.

Neste texto vou mostrar como consegui criar um plugin simples em que manipulo os dados do cenário em Blender e salvo em um arquivo XML que será lido (feito parsing) no meu game.

O Text Editor do Blender

Atualmente estou no projeto de um jogo 3D, e tentei usar um level editor 2D para criar os níveis. No entanto não deu muito certo. Daí tive que partir para o Blender e aprender a usar o Text Editor. Vamos então abrir o Text Editor, podendo ser na lateral onde geralmente fica a guia Properties. Clique para ampliar:

guia-text-editor-blender

Para minha sorte, o editor de texto já vem com códigos feitos de exemplo, chamados Templates, bastando para isso optar por Operator Export dentro dele:

text-editor-blender-python-export

Obtendo informações do cenário 3D via Python

Agora é a nossa vez de trabalhar. Veja que no código que aparece no Text Editor há uma função chamada write_some_data. Abaixo segue a versão do método que criei, de exemplo. Nele criamos uma variável string chamada “xml”, que terá as informações que serão salvas. A string “pattern” vai nos ajudar na tarefa de colocar os valores num esquema “atributo=valor” do XML, (ex: name = “main-character”).

Repare no loop for: a cada objeto do cenário, ele irá adicionar como elemento ao XML as informações da variável, que são no caso name, type, x, y e z. O código está comentado ao lado. Por fim, na linha f.write(xml) dizemos para salvar o texto da variável. Para executar o código clique em Run Script no Text Editor (ou aperte Alt+P).

def write_some_data(context, filepath, use_some_setting):
    print("running write...")
    f = open(filepath, 'w', encoding='utf-8')
    pattern = "%s=\"%s\" " # esquema atributo=valor do XML
    xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r" # cabecalho XML
    xml += "<data>\r"

    for obj in bpy.data.objects:
        xml += "\t<"
        xml += pattern %("name", obj.name) # adicionando propriedades, name, type...
        xml += pattern %("type", obj.type.lower())
        xml += pattern %("x", obj.location.x)
        xml += pattern %("y", obj.location.y)
        xml += pattern %("z", obj.location.z)
        xml += "/>\r"

    xml += "</data>" # fecha XML
    f.write(xml) # salva
    f.close()

    return {'FINISHED'}

Usando esse código como plugin

Então, vamos no Text Editor, selecionamos a opção Text na barra de menu dela e optamos por Save As. Salve o arquivo em um local adequado como arquivo do Python (extensão .py).

Para instalar no Blender e usá-lo como plugin de exportação, vá em File >> User Preferences (Ctrl+Alt+U), selecione Install Add-on… parte de baixo), localize e selecione o arquivo do código e habilite. Reiniciando o Blender você verá o plugin em File >> Export com o nome de “Text Export Operator” (você pode mudar o nome dele dentro do cmesmo ódigo, na função menu_func_export).

É isso, espero ter ajudado. Abraços e até a próxima. 🙂

Be Sociable, Share!

3 pensamentos em “Usando o Blender como um Level Editor simples – Tutorial”

  1. Blender é muito bom, quem aprende com o Blender se adapta a qualquer outro software e aprende de verdade os conceitos de modelagem, sculpt, render, animação. Eu não suporto a interface do 3DsMax e Zbrush, o que me atrapalha muito.

  2. Estou começando a usar o Blender, me encantei com ele,pois é fácil de usar,e você faz o que vier em sua mente que ele cria,além de tudo é grátis e leve, melhor do que os outros parecidos

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Time limit is exhausted. Please reload the CAPTCHA.