A Equação do Batman na OpenGL

Sabe aquela coisinha fácil que tu fazes mas acha tão legal que resolve compartilhar?
Essa semana, na disciplina de Processamento Gráfico (que ministro na Unisinos POA), começamos a trabalhar com a API gráfica OpenGL. Uma apresentação básica às principais funcionalidades da biblioteca, integração OpenGL+GLUT etc. E nisso alguns exercícios com primitivas geométricas, tipo desenhar um quadrado, triângulo, pontos, linhas, círculo etc. No círculo o pessoal já pede ajuda, porque é necessário relembrar o bom e velho Teorema de Pitágoras pra gerar os pontos 🙂

Meu maior desafio é tentar DESAPAVORAR a gurizada para a Matemática. Afinal, Computação Gráfica é Matemática pura, né? Sh-h-h-h… Heheh 😀 Nas nossas brincadeiras de gerar círculos, caracóis, PAC-MANs e fatias de pizza, comentei com a gurizada sobre a famosa Equação do Batman, que algum maluco matemático nerd muito legal bolou e que desenha o logo do nosso querido Homem-Morcego.   Mostrei pra eles no Google, e propus o desafio de desenhar usando a OpenGL. Claro, eu sempre que proponho um exercício novo eu fico enlouquecida me coçando pra fazê-lo também, hehe. Então, no dia seguinte (porque na hora da aula a gurizada me chamou o tempo todo pra tirar dúvidas — o que eu acho muito bom!), aproveitei um daqueles momentos em que o cérebro está cansado e precisa relaxar, e implementei, de forma BEM SIMPLES e NÃO OTIMIZADA, um programinha pra plotar a equação usando OpenGL — até como tira-teima, já que houve alguma incredulidade sobre essa equação (só ver no link do Guizmodo). Basicamente, o trabalho foi transcrever as equações (copy and paste do Google), e escolher um ?x adequado para que ficasse bonitinho.  Plotei cada equação em separado, com cor diferente, já na função de callback de desenho. Obviamente que o mais inteligente é gerar os pontos e depois só plotar. Enfim, se alguém ainda dúvida, é só rodar esse codiguinho de nada e provar que a equação é verdadeira. Abaixo, vou deixar só o código da função de desenho do  bátima.

void DesenhaBatman()
{
	glLineWidth(3);

	double deltax = 0.00005;

	//Primeira Equação
	double x = -8.0;
	glPointSize(3);
	glColor3f(1,0,0);
	glBegin(GL_LINE_STRIP);
	while (x < = 8.0)
	{
		double y = 1.5* sqrt(-abs(abs(x)-1)*abs(3-abs(x))/((abs(x)-1)*(3-abs(x))))*(1+abs(abs(x)-3)/(abs(x)-3))*sqrt(1-pow(x/7,2))+(4.5+0.75*(abs(x-.5)+abs(x+.5))-2.75*(abs(x-.75)+abs(x+.75)))*(1+abs(1-abs(x))/(1-abs(x)));
		glVertex2f(x,y);
		x += deltax;
	}
	glEnd();

	//Segunda Equação
	x = -8.0;
	glColor3f(0,1,0);
	glBegin(GL_LINE_STRIP);
	while (x <= 8.0)
	{
		double y = -3*sqrt(1-pow(x/7,2))*sqrt(abs(abs(x)-4)/(abs(x)-4));
		glVertex2f(x,y);
		x += deltax;
	}
	glEnd();

	//Terceira Equação
	x = -8.0;
	glColor3f(0,0,1);
	glBegin(GL_LINE_STRIP);
	while (x <= 8.0)
	{
		double y = abs(x/2)-0.0913722*(x*x)-3+sqrt(1-pow((abs(abs(x)-2)-1),2));
		glVertex2f(x,y);
		x += deltax;
	}
	glEnd();

	//Quarta Equação
	x = -8.0;
	glColor3f(1,0,1);
	glBegin(GL_LINE_STRIP);
	while (x <= 8.0)
	{
		double y = (2.71052+(1.5-0.5*abs(x))-1.35526*sqrt(4-pow(abs(x)-1,2))*sqrt(abs(abs(x)-1)/(abs(x)-1)));
		glVertex2f(x,y);
		x += deltax;
	}
	glEnd();
}


Saída do programinha que plota a Equação do Bátima


7 dias escrevendo de tudo, dia 7: Global Game Jam

#FAIL #FAIL #FAIL no meu auto-desafio, ontem acabei não escrevendo!

Na verdade eu optei por dormir mais cedo e escrever hoje de manhã, já que tinha que acordar cedinho pra trabalhar na Global Game Jam. Ontem fiquei monitorando o evento também. Muito legal a proposta do GGJ: desenvolvedores e interessados  de todo o mundo se reunem em determinados locais para desenvolver, em 48h, jogos sobre um tema determinado. Os jogos desenvolvidos ficam disponíveis no site do evento. Este ano, o RS pela primeira vez possui uma sede do evento, e onde? Na Unisinos, no campus de Porto Alegre 🙂 🙂 🙂

Eu acho muito dez um evento como esse, no sentido de proporcionar uma chance de visibilidade para os desenvolvedores de jogos daqui. Como eu sempre digo para os meus alunos, é preciso se colocar, fazer de tudo para que os seus talentos e habilidades de desenvolvedores de jogos serem VISTOS, AVALIADOS (ter feedback é bom) e RECONHECIDOS.  Tivemos 45 jammers inscritos, divididos em 10 equipes.  O tema deste ano é a intrigante e inspiradora imagem abaixo:

 

Tema da GGJ 2012: Ouroboros

Muito dez ver a empolgação da gurizada soltando a imaginação e projetando muitos jogos criativos. Não vejo a hora de ver o resultado dos jogos criados por aqui.

Enfim, posso dizer que fiquei com muita vontade de participar do evento como jammer (que eu seria apta a participar, já que a restrição é somente ser maior de 18 anos :)). Mas foi um privilégio acompanhar como monitora.

Alguns screenshots  da GGJ 2012 na Unisinos

ATUALIZANDO O POST!! (quase dois meses depois) 😛

Fiquei de listar os jogos criados pelo pessoal da Unisinos e passar os links. No blog do evento da Unisinos, você pode conferir os números certinhos e mais informações no >> Relatório <<. E se você, curioso, quer conferir os 11 games criados (vale a pena), clique >> AQUI <<. Eu até consegui me viciar num deles, o N.E.R.O.T. (feito pelo meu colega e amigo Henry Braun & cia). Você inclusive pode jogá-lo >> AQUI << . Mas vale a pena conferir todos, hein!?! 😉

N.E.R.O.T., o mais psicodélico. “BIONIC SAMURAAAAAAAI…” 😉

Pro ano que vem, eu e mais alguns amigos já estamos nos programando de participar como uma equipe 😀

Meu brinquedo novo: Tablet Bamboo Pen


fellowsheep desenhando

Meu auto-retrato do momento 🙂


A ideia deste post é eu escrever minhas primeiras impressões sobre o brinquedinho que eu desejava há anos ter: um tablet para desenhar 🙂 Pois bem, aproveitando a ida dos meus colegas pra Europa, pedi que eles me trouxessem o Bamboo Pen. Esclarecimento rápido: esse dispositivo existe aqui no Brasil, mas é bem mais caro. E como eu falhei de trazer dos EUA ano passado, então aproveitei para conseguir por um preço meio-termo, lá na Holanda 🙂

Pois bem, o bichinho é este aqui:


Bamboo Pen

Meu Bamboo Pen já configurado para canhotos 🙂



Foi extremamente fácil fazê-lo funcionar (só instalar o driver). Depois disso, comecei a diversão, testando ele no Paint, Inkscape e Corel (Draw e PhotoPaint). Tanto o Inkscape como o Corel possuem suporte a tablets, com ferramentas que imitam diversos tipos de canetas, lápis e pincéis. Esse suporte inclui desenhar um traço mais forte ou mais fraco  (ou mais fino/grosso) de acordo com a pressão que aplicamos na caneta. Lembrando que o Inkscape e o Corel Draw são softwares para desenho  vetorial, ao optarmos em utilizá-los com a sua ferramenta de curva “à mão livre”, tudo o que desenhamos  é transformado em curvas de Bézier, que podem ser editadas depois.  Com isso, não precisamos ter preocupação alguma se nosso traço não saiu bem como queríamos, já que podemos corrigir depois.

A adaptação ao dispositivo e aprendizado foi (está sendo) muito rápido. A área ativa do tablet é mapeada para a tela. A precisão é muito boa, reflete bem nossos movimentos com a caneta. E a captura é rápida. Porém essa rapidez varia um pouco com o tipo de ferramenta que se está usando. Ferramentas que vetorizam o desenho tem um desempenho menor, e fica mais difícil, por exemplo, escrever na velocidade normal (no meu notebook, pelo menos). Ferramentas que desenham pixels diretamente são mais rápidos, e aí você se sente quase que com um lápis. Talvez o que custe um pouquinho é  acostumar com a ideia de olhar pra tela e não pro tablet, mas no meu caso isso foi rápido também.

Dadas as minhas habilidades desenhísticas (extremamente amadora), meu primeiro encanto foi o de poder contar com a precisão do tablet para pegar meus traços e depois poder corrigí-los nas curvas de Bézier. Isso simplesmente aceleraria meu poder de desenhar fellowsheeps e elefantes de forma vetorial. Se você voltar ao post anterior, vai ver que, para tornar vetorial o meu logotipo, eu tive que ficar fazendo curvinha por curvinha, passando por cima do desenho. Com o tablet, agora tenho duas opções, que testei e considerei um sucesso:

  • rascunhar diretamente no computador,  e finalizar corrigindo as curvas que não ficaram 100% (foi o que eu fiz no desenho do topo deste post, o “auto-retrato”;
  • “vetorizar” meus desenhos manuais escaneados simplesmente “passando por cima” (claro, depois ajustando as curvas que não ficaram 100% também). Para isso, resolvi eternizar os meus “Borbolefantes”:



borbolefantes, by Rossana, 2007

Resultado da cópia vetorial dos Borbolefantes 🙂

Por questões de familiaridade (de anos), me acertei mais com o Corel. Claro, ele oferece muito mais opções de ferramenta de edição que o Inkscape, mas nas tarefas que realizei, acredito que o que pesou mais foi a familiaridade com o software.

Depois de brincar bastante com as curvas de Bézier editadas à mão livre, parti para o Corel Photo Paint para ver como é que se comportavam aqueles pincéis que imitam lápis de cor, giz de cera, canetinha, guache etc, que eu já conhecia de outras eras, mas sempre com o mouse. O Corel Draw e o Inkscape também fornecem alguns pincéis vetoriais, que são um pouco mais simples, mas tem a vantagem de serem vetoriais. No Photo Paint, eles criam bitmaps direto, mas os efeitos são impressionantes. Ainda mais podendo usar com o tablet e valendo-se da pressão, que nos permite pintar criando degradês como se fosse no papel!! Fiquei encantada 🙂


Lapis

Testando os diferentes tipos de "pincéis"do Corel Photo Paint



Por fim, o que posso dizer é que ADOREI meu brinquedo novo. Creio que ele me abre um universo novo pra explorar, além de acelerar o processo de criação dos meus desenhos.  Sei que com o tempo vou esbarrar nas limitações do meu Bamboo (ele não é perfeito!), mas por enquanto estou naquele “primeiro amor” 🙂

Desenho no Photo Paint, com o "lápis de cor"