Este blog esta em reforma no momento.

CSG - Criando geometria destrutiva

 Adicionando recursos de objetos dinâmicos com CSG (Constructive Solid Geometry)

Compondo cenas, o quarto

Composição de cena completa
A composição da cena é algo importante e devemos sempre pensar na história do personagem e na do cenário.
Como esta é a cena do começo do jogo o importante é deixar o jogador tranquilo, para ir se adaptando ao novo mundo da história e a nova jogabilidade, então ela começa no quarto da personagem, com uma luz matinal.

Arvores no balanço do vento pt1

Arvore balançando com shader
Tive esta ideia quando vi um gameplay de The Last of Us e reparei no movimento das árvores.
O shader é bastante simples, um movimento senoide controlado por uma variável de escala.

Modelagem da primeira cena pt 1

Primeira fase da modelagem, dentro da OgreKit
A modelagem da cena inicial esta correndo bem, com a malha principal pronta agora é só acrescentar detalhes como mais polígonos em lugares mais visíveis.
Começar de um mapa foi a mapa mais detalhado e no lugar de uma malha gigante cheia de quadrados, fazer várias malhas como foi feito em Appricot parece ser uma saída mais fácil de trabalhar na construção do level.

Evil Dead 2 Cabin (Cabana)

Uma das casas mais famosas dos filmes de terror dos anos 80 não poderia ficar de fora.

Ipiraporinha do Oesta a primeira cidade

Com os mecanismos importantes na mão comecei a montar a primeira cidade.
É uma cidadezinha não muito pobre, não muito rica não muito agitada e nem muito calma.
Casinhas simples de gente que veio para trabalhar na ferrovia, um mercadinho com traços Colónias, uma praçinha com coreto, uma mansão de um coronel rico e uma catedral gótica básica feita por imigrantes franceses uns 300 anos antes de Ipiraporinha do Oeste ser fundada, etc.
Nada como uma boa taverna é um ótimo ponto de encontro. Tem cerveja, tem carne, tem sangue, informantes, assassinos e mercenários com preços módicos, bebados, ratos, baratas e as vezes até pessoas normais podem ser encontradas.

Uma bem localizada em um vilarejo é um bom centro para o jogador se estruturar na história.
O papo dos bebados pode mudar conforme o jogo para mostrar a história correndo, posso fazer a banda tocar musicas, seria um bom meio de obter contribuições de pessoas para o jogo. Tipo: "mande sua musica e veja ela num jogo" XD

Economizei o máximo de poligonos que pude na modelagem.
Mas em alguns lugares percebi que não havia muito sentido, como nos paus do corrimão. Afinal um pouco de embelezamento é essencial.

Exploração urbana 02

As chuvas mortais que caíram no estado fizeram alguns estragos e não foi só a minha Internet que caiu.
Aproveitei para tirar umas fotos diversas de texturas e de exemplos de terreno.
 Este é um riozinho passando pela cidade, depois de transbordar a parede e parte de uma casa caiu.
 Estes detalhes de entulho em corregos são realmente interessantes, sempre que passo por eles fico imaginando a sensação de explorar entre eles como se fossem cavernas ou vales hostis (se não fosse o fato do esgoto acho que até exploraria).
 Geralmente eles tem TODOS os elementos necessários para você por num game, vários obstáculos e pontos de apoio para fazer caminhos alternativos e lugares para esconder itens.
 Também oferecem ótimas texturas.
 Fico olhando para os canos e imagino que Cibele pode usa-los facilmente para escalar e chegar em obstáculos. Parkour de pobre!
 Muros fudidos e muito fungo.
 Invadir quintais parece fácil.
Preciso me segurar para não abrir o Blender e sair modelando.

Estas fotos foram tiradas aqui (google maps).

Pensando no sistema de update

Nada muito grande mas como se trata de um jogo que pode levar muito tempo até chegar no final uma opção é realmente os updates.
Bom, como abrir um jogo e receber um aviso: "Favor atualizar seu cliente" é uma coisa chata até no cliente do World of Warcraft.

Então vou tentar incorporar a carga durante a execução do jogo. Teoricamente é simples e usando a experiência adquirida com sockets e threading desses últimos messes será "pá-pimba".
Isso também representa problemas como o desses desenhos: do jogador entrar num cenário, sair, fazer uma quest e voltar e encontrar um cenário modificado.

No entanto usando a arquitetura de database fica mais prático fazer isso do que com estruturas de arquivos, além de poder ter um controle de versionamento do jogo nas mãos do jogador!
É um rascunho de ideia meio doida mas coerente.

Estou adicionando essa ideia no documento de de coisas boas e ruins sobre jogos. Lembram-se dele? É uma tabela colaborativa que eu disponibilizei esses tempos aqui.

Como adotei a ideia de banco de dados como estrutura de arquivos, essa estratégia deve ser fácil de ser adotada, nem que represente clonar uma tabela que esta sendo usada em tempo de execução para realizar o update de forma suave.
(Sim tenho um certo vicio em databases, afinal são quase 15 anos de programação web  XP )

Esses tempos eu me estressei com o recurso das "migrates" do framework Rails, e agora estou eu aqui pensando em montar scripts Lua para fazer o mesmo!!!

Teoricamente é só mandar código que automatize a migração de maquinas de estado dentro e fora do jogo. Bom o tempo dirá se essa teoria é de fato tão simples quanto parece.
^^

terra brasilis et difficile

Meu ritimo de postagem diminuiu um pouco, por sorte meus acessos não muito.
 

Bom, olhando a imagem acima vocês podem ver que as plantas parasitárias ficaram um lixo.
Então vou deixar a modelagem manual de lado um pouco. Assim que estiver plotando esta arvore no ambiente do game, vou tentar implementar um sistema de particulas para fazer o trabalho.

A ideia de fazer arvores próximas à realidade que eu encontro ainda esta meio confusa e complicada.
Este modelo de arvore ficou com cerca de 1000 triângulos. Algo bem realista, e fácil de aplicar um LOD.

Pode parecer muito polígono, mas essa é uma das coisas que eu sabia que iam aparecer desde antes de começar o projeto oficialmente.

A implementação com a OgreKit ainda esta nos testes, mas pelo visto vai ser ela mesmo. Talvez eu tenho que migrar do Eclipse para o CMake (texto puro), algo que não deve ser tão ruim assim. No final das contas o Eclipse só esta servindo pra corrigir erros de digitação.
Não me acerto em fazer o Code Blocks funcionar e o Visual Studio não mostro nenhuma vantagem sobre o Eclipse.
Estou preparando o projeto de objetos interativos. Essa imagem é um aviso que o jogador terá que fazer algum teste para conseguir decifrar.

Outro passo corrido é o "model sheet" da Cibele. Eu tenho alguns outros estudos dela em alguma pilha de papel mofado mas não no formato SD que irei usar no jogo.

Bom, uma semana e meia de freela dor-de-cabeça atrapalhando tudo, mas os problemas foram pro ralo.

Arvores da floresta de Aracne

Criando árvores gigantes para a cena da Aracne.
A produção da malha textura da árvore esta em andamento, o primeiro passo foi pegar uma textura real de árvore...
Lugar da foto no Google Maps
e transformar em textura ladrilhável com a ferramenta clone e o filtro de "Tornar encaixável".

Dei também um acabamento de desenho à árvore. O processo inclui saturação, posterização e sobreposição de camadas.

O segundo passo foi criar um plano, multiplica-lo com Alt+D (clone). Setar a UV para pegar todo o quadrado e depois sub-dividilo em centenas de vezes. Agora o relevo é feito com o Sculpt.

Já as pequenas trepadeiras foram acertadas no GIMP com auxílio do normalmap plugin.

A imagem gerada no GIMP foi usada no material dentro do Blender, na hora do bake ele é incorporado ao resultado final. Assim temos um mapeamento muito rico com poucos poligonos.

As folhas e galhos menores serão feitos com textura. Do mesmo modo que no Yo Frankie.
Minha árvore esta virando um Frankenstein, mas usar imagens de perto é tradição des-de as primeiras tentativas.

O tipo de mata
Bom, a ideia é criar um ambiente denso, sombrio e de árvores altas. Logicamente tenho dificuldade em achar um lugar como esse como referência.
Ao olhar árvores altas vê-se que os galhos ficam em cima mesmo. Tomei a liberdade de experimentar os modelos com galhos saindo do meio, assim posso utiliza-los para deixar o cenário mais complexo. Podendo Cibele caminhar sobre as árvores.
A árvore é composta de três malhas, a principal, os galhos intermediários e as folhas. Em proporções reais ela tem 40 metros.

Uma mata brasileira seria um problema mesmo para GPUs modernas.
Tentarei posteriormente ver se consigo usar um sistema de carregamento híbrido da gamekit com o carregamento de arquivo mesh normal da OGRE para usufruir dos recursos de LOD da OGRE.

A divisão do tronco da árvore em 2 malhas é para facilitar a física, os galhos menores não devem ser acessíveis (espero).

Páu Mulato - Deve ter uns 25~30 m.

Preparando a cena da Introdução e do Trailer

Deu vontade (além da necessidade) de ir preparando a cena de introdução.
A primeira coisa foi inserir uma luz de lua.

Em seguida modelei a vela. Tudo ficou legal, mas o sistema de partículas na chama não ficou muito bom. Recorri à um tutorial, mas acho que estou trabalhando com uma escala muito pequena (realística na verdade) oque esta dificultando algumas coisas.

A cena esta demorando pra renderizar, o Ambient Oclusion não é grande problema, como tudo é estático basta renderiza-lo pra um cache de textura. No entanto os primeiros resultados mostram que talvez seja melhor eu fazer algumas sombras a mão.
Essa referência de vela que esta difícil chegar perto. Acho que consumi uns 50% só na vela! E ainda não acertei a mão. A foto acima foi tirada totalmente no escuro.

Detalhes do punhal. Resolvi adornar bem o cabo. Talvez eu dê mais um nível de multres e capriche na figura. Afinal um punhal feito a mão não deve ser tão muito rústico. É que na verdade fico me concentrando em objetos e coisas que uma menina simples poderia ter. Mas, lógico, ela gostaria de ter coisas bonitas.
Os materiais até agora eu baixei todos do www.blendermaterials.org. O bronze do cabo que talvez eu não use, ele esta lerdeando bastante o render e talvez madeira de cedro seja mais concisa.
Me fez lembrar um comentário do Maurício Cunha, sobre achar que tenho arquivos demais, essa cena esta abarrotada de bibliotecas.

Tela principal primeiro rascunho

É uma ideia simples, baseada no rodapé do blog.
Cibele em Pose de Lotus, e a esfera de energia com as opções do menu circundando. Claro no ambiênte de render da OpenGL agente pode a busar um pouco mais de buffers e jogar efeitos.
A camera pode ficar avoando pelos ângulos, e a mesh pode ser projetada especialmente para esta tela.

Flex PixelBender Zend RPG MD2 Away3D Correria Café Cerveja TUDO JUNTO AGORA


Essa semana foi atipica, não parei, corri de um lado pra outro, fui pra São Paulo e voltei correndo, levei trabalho pra casa, to no meu hobby, relembrei Flex, aprendi Pixel Bender, levei a Clarice pra vacinar e aqui estou postando e também preparando meu post de amanha na RPG Vale.

Como devem ter notado na imagem acima estou fazendo umas coisinhas um pouco mais nervosas com flash. Pensei em montar um hotsite em 3D dessa vez, por issu este modele com cara de Budy Pocket... alias confesso que ficou bem podrão mesmo. Talvez se eu organizar o esqueleto direito consiga usar ele para os testes de colizão no terreno do jogo.

Irei inserir mais frames nesta animação, o arquivo MD2 ficou com incríveis 36Kb com 12 frames! Então acho que irei arriscar uns 30.
Uma dica excelente que achei na internet, é a respeito da lista de animações do MD2, você pode criar um arquivo separado definindo os quadro chaves. O formato pede que a primeira linha identifique o arquivo, o resto é uma string e o numero total de frames da animação.
Fica itegralmente assim:

# MD2 Frame Name List
stand 11
run 0
attack 0
pain0 0
pain2 0
pain3 0
jump 0
flip 0
salute 0
taunt 0
wave 0
point 0
crstnd 0
crwalk 0
crattack 0
crpain 0
crdeath 0
death0 0
death2 0
death3 0

Eu tentei mudar o nome das animações, mas começou a dar pau com o Blender 2.49a. Então larguei mão e só zerei a quantidade de quadros. Deu certinho.

Away3D suporta animação por bones dentro do Collada, mas os tutoriais de MD2 etão mais à mão, mas é bom saber que ela tem esse recurso muito mais avançado.
Este foi um dos motivos da escolha da Away3D, ela incorpora muitos recursos que a Papervision3D demora para incorporar. Apesar das ultimas informações que tive dela ela consumir o dobro de RAM que a Papervision, mas isso faz bastante tempo, qualquer duvida procurem alguma analize mais atual.

A pintura foi toda feita no inkscape, achei mais pratico usar um software vetoria, pois um espaço pequeno de 256x256 pixels é complicado de trabalhar.

Uma coisa interesante durante o processo, o png com transparência foi renderizado perfeitamente na away3d. Deu até uma ideia de fazer uma mágia de invisibilidade pra deixar Cibele assim, com os olinhos aparecendo pra dar aparência daquele desenho do PacMan que quando ele comia o fantasma so saiam os olinhos flutuando em bora.

Outra coisa legal é o Pixel Blender, esse recurso é fabuloso. Rodar shaders apartir do player do flash é um recurso extupidamente poderoso. Tem gente estudando o recurso inclusive para manipulação de dados!
Eu tirei este shader lindo de raios de luz deste site (kode80.com), e pretendo usar esse mesmo shader de light-scatering na faze inicial do jogo. A luz atravessando as arvores vai dar uma visão chocante. E é um shader bem simples, me expantei ao analiza-lo.
Pena que rodando no flashplayer o pixelbender, so trabalha na fase processo pixel, o pre-calculo de vertice e matrizes é todo via AS3, mas mesmo assim o resultado é rápido (veja o site dos caras)!!!

Pra quem não conhece pixelbender é o novo recurso adicionado ao player do flash, onde o swf carrega um código pré-compilado em linguagem de maquina, que roda direto no processador da placa de video. O PixelBender é baseado na GLSL que o torna bastante compativel e portavel.

O modelo foi criado com um numero extreamente reduzido de poligos, mesmo porque irei caprichar no cenário. Por sorte o shader não se atrapalha com a transparência.
Outra coisa que irei fazer é adicionar uma segunda layer de render para renderizar o chão com sombras e o horizonte.
Depois irei usar o recurso de paths da Away3D para fazer a camera acompanhar um caminho fixo ao mover o mouse pela cena, oque dara uma visão de angulos muito superior. Esse processo sera usado no game final também.
Irei jogar um pequeno sistema de particulas para fazer a fumaça, tentei fazer com pixelbender, usando outro código da net, mas não mesclou corretamente.
Bom, o objetivo é copiar uma cena como esta:
Creio que vocês não devem ter reparado no background... mas ele esta ali, é so olhar pra esquerda e direita da figura centra. Sei que é dificil :P
Bom, uma vegetação como essa deve ficar excelente na cena.

Os links irão estar flutuando no ar ao longo do path.

Parte 2
Bom, pra não dizer que aproveitem bem meu tempo... inventei de aprimorar o software de visualização 3d dos personagens. Dando um acabamento profissional.

Infelizmente issu acaba implicando em atenção a inumeros e inumeros detalhes que agente nunca repara de inicio. Oque deveria durar uma manhã, comeu o sabado inteiro e parte da manhã de domingo.

Mas ficou legal. Agora você pode inserir comentários, e há uma conexão com o Gravatar, um serviço universal de avatar. Basta digitar ser e-mail e ter um cadastro simples no Gravatar e pronto.
Poderia ter usado o OpenId, pois o Zend tem essas facilidades, mas fiquei com preguiça.
Estou satisfeito com o Zend, apesar de seu vasto tamanho, ele tem recursos na proporção dos seus Megabytes.
Este código no controller transforma a saída em RSS 2.0, simples, e padronizado. Assim além de poder usar ele na aplicação eu posso aproveitar os dados em qualquer outro lugar, inclusive agregadores de feed ^_~
public function indexAction()
    {
 $page = $this->getRequest()->getParam('page',false);//'www.8arte.net/wwpvisualizador';
        $this->view->rss = $this->formatRSS( $page );
    }
    
    protected function formatRSS($dt,$title=false)
    {
     $config = Zend_Registry::get('config');
     $base = $config->rss->base;
     if(!$title) $title = $config->rss->title;
     
     $ens = array();
     $pageNome = 'www.8arte.net';
  foreach( $this->comentarios->listComments($dt) as $com )
        {
         array_push( $ens,
    array(
     'title'   => 'Comentário de '.$com['nome'],
     'author'  => $com['nome'],
     'link'   => 'http://'.$com['pagina_nome'].'/',
     'description' => $com['coment']//$this->formatDescription($com['nome'],$com['web'],$com['coment'])
    )
         );
         $pageNome = $com['pagina_nome'];
  }
  $rss = array(
   'title'  => $pageNome,
   'link'  => "http://$pageNome/",
   'charset' => 'UTF-8',
   'entries' => $ens,
   'author' => 'Marcos Augusto Bitetti (marcosbitetti@gmail.com)',
   'category' => "Comentários",
   'image'  => 'http://www.8arte.net/media/img/rss/rss_wild.jpg'
  );
     
  $feed = Zend_Feed::importArray($rss, 'rss');
  
  return  $feed->saveXML();
    }

O Adobe Flex é muito rápido pra produzir aplicativo... infelizmente pra mim, não ajuda muito, eu acabo perdendo tempo incrementando mais recursos. Mas vale a pena.
private function addComents():void {
    coment_list.removeAllChildren();

    var ld:URLLoader = new URLLoader();
    ld.addEventListener( Event.COMPLETE, addCommentsData);
    ld.load( new URLRequest("http://www.8arte.net/comments/wwpvisualizador") );
   }

   private function addCommentsData( e:Event ):void {
    var ld:URLLoader = e.target as URLLoader;

    var com:Array = new Array();
    //adiciona comentario principal
    var t:TextArea = new TextArea();
    t.percentWidth = 100;
    t.height = 85;
    t.wordWrap = true;
    t.editable = false;
    t.htmlText = '<img align="left" alt="gravatar" height="80" hspace="2" src="http://www.gravatar.com/avatar/aa6003be4294547ab18571dfca3e4522.png" vspace="0" width="80" />Bitetti (autor) Implementação de visualização de personagens do jogo Wild Witch Project.'+
       'Utilizando Adobe Flex 4.0, Zend Framework e Flash Develop.'+
       'Modelos 3D produzidos no Blender, texturas no Gimp, Inkscape e ArtRage2 (licenciado).'+
       'Wild Witch Project sob licenca Creative Commons 3.0 - uso não comercial, atribuição e não derivação.';
    coment_list.addChild(t);
    
    //parse RSS
    var feed:RSS20 = new RSS20();
    feed.parse( ld.data as String );
    ld = null;
    System.gc();
    
    for each( var i:Item20 in feed.items) {
     t = new TextArea();
     t.percentWidth = 100;
     t.height = 85;
     t.wordWrap = true;
     t.editable = false;
     t.htmlText = i.description;
     coment_list.addChild(t);
    }
   }
Este código lê o RSS gerado no Zend e insere os elementos TextArea para cada entrada. Tudo simples, usando as xml syndication lib disponível no google code.
Foi uma boa relembrada de Flex.

Bom, vou voutar à minha correria

Progressos outubro 2009

Um bocado de coisas agora, vamos por partes.

 Agora fasso parte da equipe do RPG Vale, um blog voltado à produção de games e rpg do Vale do Paraiba - SP. Então espero que minhas aventuras de game-maker ajudem no site.


Comecei a detalhar a vegetação. Ainda estou com uns problemas de render do material transparente. E um gigantesco problema, que eu ja havia previsto des-de antes do inicio do projeto: Flora Brasileira.
Cheguei até a pensar em usar um sistema de particulas estático para derar folhas nas arvores, que serão inumeras. Bom, isto foi um dos motivos da escolha de OGRE.

Arvore ainda com Amiente Oclusion.

Tree-from-curves, o script do Blender inserido durante a produção de Big Buck Bunny é realmente uma excelente ferramenta. O resultado fica bastante natural.

Agora algo a se pensar:

Hora de pensar em inserir algum tipo de frame-skip no thread principal. Não há necessidade de rodar o jogo a mais de 60 fps.

Mais Personagens under-construction

Leviatã, um demônio marinho. O começo do estudo de personagens gigantes.
Ele ainda é um modelo low-poly, e será um dos obstáculos para "Lindomar - O Sub-Zero brasileiro".

Porquê Leviatã e não Kutulu?
Kutulu é com certeza o ícone preferêncial, todo fã de Metallica conhece e faz parte da cultura metaleira. Mas o demônio criado por H. P. Lovecraft é muito cheio de tentáculos e reêntrancias pra ser apenas um quadjuvante.


Essa é a base do Sábio Nerd das Montanhas, ainda lhe falta deixar mais magrinho e o sobretudo e óculos.


XMind, tem um excelente pacote de recursos mesmo em sua versão Free.
Eu precisava de uma boa ferramente, e um editor de Mind-Map vem bem a acalhar, sendo uma IDE para você jogar idéias, deve se tornar um excelente ambiente de produção dos dialogos.

Feed-Back
Estes dias tive uma experiência interesante, fui achado por um grupo de alunos de Sistemas de Informação me achou e pedirão ajuda com um modelo. Um modelo até simples, mas como sempre o professor superestimou os alunos.
O curioso foi a palavra chave que eles usaram pra me encontrar... "guarda-chuva".
Curioso, bom, são coisas a se pensar, geralmente o jogo de palavras que um usuario comum usa é bem diferente do nosso que estamos acostumados com um jargão técnico se embrenhando no português coloquial.