sexta-feira, 9 de agosto de 2013

Configurações 3D utilizando Blender

    O objetivo do post é expôr a minha solução para sobrepor duas cenas diferentes em uma aplicação 3D no Blender. Neste caso a camada inferior é um vídeo já em 3d (lado a lado) e a camada superior é um game que deveria ser adaptado em 3D, para que houvesse um casamento entre os efeitos.

Imagem 1: Vídeo 3D lado a lado e game sobreposto

    Após alguns testes com a aplicação direta do plugin do desenvolvedor noeol, sendo este código sendo usado juntamente com o controle add overlay scene do blender obtive um certo sucesso com a cena do game ficando 3d juntamente com o video. No entando, neste game o cursor colorido atira o projétil para "dentro" da tela, e este efeito estava completamente errado na aplicação que fiz.


Imagem 2: Controles para sobrepor a cena 'game' na cena principal
    A solução do problema foi alcançada com a aplicação de viewports, que dividem a cena verticalmente (ou horizontalmente) de modo que cada câmera que filma o game seja exibida em exatamente metade da tela.

Imagem 3: Blocos lógicos para o viewport


    Para o vídeo usado o viewport foi aplicado com uma divisão vertical, e deste modo, o efeito 3D do game foi alcaçado pois cada visão do game foi colocada em cima da metade do vídeo, de modo que quando uma tv compatível fizer a composição das imagens o game também ficará em 3D.



Imagem 4: Cursores duplicados, compatíveis com o vídeo
 
    O código utilizado para configurar os viewports foi obtido aqui, referente a este vídeo.

sexta-feira, 3 de maio de 2013

Ubuntu 2 monitores

    Após muito tempo tentando configurar o Ubuntu para expandir o  Desktop para 2 monitores consegui realizar a configuração correta utilizando este tutorial para configurar a função Xinerama de placas Nvidia.

    O truque que observei foi de seguir o exemplo dado e aplicar a sua configuração atual. No meu caso, observando o arquivo xorg.conf (localizado em /etc/X11/xorg.conf) estava com a função TwinView estava ativada e funcionando e o que tive que fazer foi adaptar á Configuração do Xinerama da seguinte forma:

   - Dupliquei a seção Monitor e Device, identificando cada um diferentemente. (estas configurações foram tiradas da configuração padrão criada pelo driver da Nvidia quando selecionado "separate X screens");

   - Criei 2 seções Screen com a propriedade "Modes" da subsessão Display com as resoluções desejadas de cada monitor, que no caso eram iguais a "1680x1050" e "1024x768";

   - Para mostrar qual era a disposição das telas, mesclei a seção ServerLayout de modo que os InputDevices eram os que eu já tinha na minha configuração anterior.

   Finalmente, saí do modo gráfico ( ctrl + F5 por exemplo) e reiniciei  a interface gráfica com sudo service lighdm restart.

   Felizmente, agora tudo funciona como deveria.

*Edit: Importante acrescentar as linhas seguintes a cada device acidionado:

     Option          "RenderAccel"   "true"
     Option          "UseEdidFreqs"  "true"


 E remover (no meu caso) a seguinte linha gerada automaticamente:

    Option         "nvidiaXineramaInfoOrder" "CRT-1"


sexta-feira, 26 de abril de 2013

Blender + pyserial

Algumas considerações sobre utilizar o Blender + pyserial : 

    Utilizando um arduino UNO a porta serial  utilizada no Ubunto está em /dev/ttyACM0, e para se poder escrever nesta porta temos que executar o seguinte comando:

        
     sudo adduser user dialout

    Este comando adiciona o usuário "user" ao grupo dialout, para se poder escrever na serial.
   
    Em seguida deve-se reiniciar a sessão para a alteração ter efeito.

    O script de comunicação serial a linha deve ficar assim:


           G.SerialPort = serial.Serial('/dev/ttyACM0',9600)

sexta-feira, 12 de abril de 2013

Engine selecionada : Blender


    Apesar do Blender não ter sido um dos programas que inicialmente planejei testar acabei por usar ele pois descobri que seu engine é muito eficiente nos aspectos que desejo implementar, além de ser também muito intuitivo.

 
    Digo que o Blender Game Engine é eficiente não somente pelo fato de incorporar elementos que outras engines possuem, mas por incorporar o python com linguagem de scripting ele amplia as possibilidades de aplicação com o uso de módulos incluídos no python.

Tudo isso foi conseguido com uma instalação muito fácil, e com uma interface muito user-friendly. (Instalei a versão 2.66)
 
    Do post anterior, eu gostaria de uma engine que:

    1. Tivesse possibilidade de tocar video
    2. Possibilitasse uma layer com animaçao (game) sobre o uma layer com um video
    3. Colher posição atual do video
    4. Conseguir enviar comandos para porta serial


    Todos esses requisitos foram alcançados pelo Blender, que juntamente com o python, facilitou a o desenvolvimento do teste que descreverei a seguir.

   A técnica para tocar video é criar uma textura a partir do vídeo desejado que é dinamicamente atualizada a cada frame pelo blender. Desta forma o video é executado, porém sem som.

   O som deve ser tocado em paralelo, sincronizado com o video. Abaixo estão algumas imagens do projeto e o código-fonte está anexo e os controles relacionados para se tocar o video.

   Neste projeto também existe um mini-game que roda em cima(literalmente) do video. Para este teste, segui o tutorial deste video do youtube.
 
O código para o video foi adaptado do código neste site, cujos créditos (aparentemente) vão para Dalai Felinto.

Sensores e controladores do minigame


Sensores e controladores do video e envio de sinais
 
    Um ponto crucial deste teste foia  integração com um hardware externo, comunicando-se por uma porta serial.
    Para isso utilizei o módulo pyserial, que permite uma comunicação descomplicada com a porta serial.

    Inicialmente tive problemas para a instalação deste módulo, uma vez que apesar de ele funcionar com o python 3.3 (python que vem com o Blender 2.66) ele é escrito para um python anterior.

    Para contornar esse problema, instalei o pip para windows deste link e segui o tutorial de instalação do pyserial para o pip, e deu tudo certo.

    Só como observação: você deve ter a versão do python 3.3 instalada no seu sistema para poder gerar o pacote do pyscript que você depois colocará na pasta do python para ser utilizada dentro do  Blender.

    Finalmente, utilizei um arduino mega para poder fazer os testes com a comunicação serial. O código para o arduino pode ser baixado aqui. O arquino em teste foi testado com uma shield com leds e reles.
 

Baixe aqui o arquivo .blend para testar o projeto.


quinta-feira, 28 de março de 2013

Pesquisa de Engine de games

O objetivo da pesquisa é encontrar uma engine que cumpra os seguintes requisitos:
  1. Ter um player de video
  2. Possibilitar uma layer com animaçao sobre o uma layer com um video
  3. Colher posição atual do video
  4. Conseguir enviar comandos para porta serial
Tudo isso de uma forma simples que possa ser reproduzido em outros computadores por qualquer pessoa(sem a necessidade de muitos conhecimentos técnicos).

Neste post descrevo brevemente as experiências que adquiri com cada engine que testei.