Isto não é um Blog

Introdução

Se você está visitando este blog pela primeira vez, pode ser interessante ler os posts em ordem cronólogica, já que eles possuem uma seqüência bem definida. Para auxiliar o leitor novato, coloquei no link abaixo uma versão do blog ordenada da mais antiga mensagem para a mais nova. Divirta-se!

Blog em ordem cronológica

Dia 16

Quando eu penso em criar um mundo, a primeira coisa que me vem à cabeça é sempre o Tolkien, afinal foi dele a descrição mais completa de um universo fictício. Por outro lado, quando eu penso em uma história que sofre do problema inverso, ou seja, falta de planejamento, aí não dá pra deixar Star Wars de lado.

Não me levem a mal, eu gosto de Star Wars. Mas, considerando a quantidade de contradições nos filmes, percebe-se claramente que a história foi sendo escrita enquanto os filmes iam saindo. Um exemplo simples é o Darth Vader, que no primeiro filme foi a pessoa que matou o pai do Luke, enquanto que no segundo era o próprio pai do Luke. É claro que sempre tem uma explicação (no caso, Obi-Wan estava mentindo), mas são explicações criadas a posteriori para que a saga faça sentido.

E, além do problema com o roteiro, Star Wars ainda sofre de um problema comercial. Aparentemente, o George Lucas acredita que crianças não gostam de épicos complexos, e de uns tempos pra cá vem sempre colocando elementos demasiadamente infantis para agradar uma faixa maior de público. No Retorno de Jedi, temos os Ewoks, que pelo menos são meigos e dão bons bichos de pelúcia. No Episódio 1, temos os Gungans, que nem pra bichos de pelúcia servem. Na verdade, Gungans são tão inúteis, que se eu fosse um caçador de recompensas, sairia por aí estrangulando alguns deles para extrair a pele impermeável e fazer guarda-chuvas, sucesso de vendas em Kamino.

Die Jar Jar

Mesmo com os furos na história, Star Wars ainda é uma saga com muitas qualidades. Em especial, o nível de detalhe técnico em que o universo é apresentado. A LucasArts tem uma grande equipe de biólogos que percorrem o mundo tirando fotos de animais pouco convencionais, para depois adaptar suas características em alguns dos aliens do filme. Um exemplo pode ser visto nos próprios Gungans, que possuem uma pigmentação peculiar em sua pele, formando listras sem padrão aparente.

Na vida real, a formação de listras tem origem no momento que as as células-tronco começam a se diferenciar para formar células de pele. Por algum motivo, algumas delas podem falhar na produção de alguma proteína, como a melanina, e se reproduzir com a falha. O processo de migração durante o desenvolvimento do feto acaba gerando as listras e manchas características de cada animal.

E, é claro, se queremos criar um mundo que seja pelo menos tão complexo como Star Wars, então a pigmentação dos animais desse mundo tem que ser simulada também. Em última instância, os habitantes do mundo irão usar peles de animais que tem as pigmentações que iremos gerar.

Computacionalmente, tudo se passa como se as enzimas inibitórias e excitatórias tivessem uma direção preferencial durante a migração. Baseado nessa idéia, podemos criar uma matriz de convolução com essas direções, e iterar um automato celular em cima de ruído branco. O fonte matlab abaixo mostra como isso pode ser feito:

function c=pigmento(s,size);
c=rand(size);
for i=1:6, 
    c=conv2(c,s,'same'); 
end;
c=interp2(c,3);

Após apenas seis iterações com a matriz s=(0 2 −1.2; −1.2 1 −0.4; −2 1 1), obtemos o padrão abaixo. Note que é bastante similar a padrões de pigmentos da vida real!

padrão de pigmentação

E uma vez com o padrão de pigmentação pronto, você pode criar seus próprios animais e vestimentas, sendo capaz até mesmo de criar um guarda-chuva com pele de Gungan!

guarda-chuva

No próximo update: linguística! E até lá espero ter acabado também um sistema de comentários, para todos possam deixar suas opiniões.

Dia 13

Felizmente, a recepção ao blog foi boa. Um dos retornos que recebi dizia "Você me fez pensar em como as formigas andam"! Eu achei ótimo, é claro, a proposta desse blog é fazer as pessoas pensarem.

Outro feedback, do acidx, comentava que existem, sim, pessoas que vivem exclusivamente em regiões montanhosas. E ele ainda citou um exemplo recente: o Bin Laden. Mas convenhamos, embora um pequeno grupo até consiga viver de carne de bode, para comportar uma civilização inteira você precisa ter agricultura. E a primeira chuva que caísse na sua plantação em terreno íngreme levaria embora todas as sementes que você plantou!

E, incidentalmente, isso nos leva à resposta da pergunta que eu deixei no post anterior: para criar regiões planas, basta adicionar erosão no modelo!

E como simular erosão computacionalmente? A maneira mais simples é supor que o terreno é formado de um material bem macio, de modo que uma chuva qualquer leve embora a terra, fazendo com que ela se deposite nas depressões do terreno. É intuitivo que a terra dos picos montanhosos vai rolar pra baixo com mais facilidade, então a simulação só precisa procurar os picos e aplainá-los.

Procurar os picos é simples: basta calcular o gradiente do terreno e procurar pelos vetores nulos, eles indicam máximos e mínimos da função. Mas o terreno é discreto, e não contínuo, portanto zeros não vão surgir. A maneira então é utilizar um autômato celular para encontrar os picos. Sempre que um dado ponto do terreno for maior que todos os seus vizinhos, a matéria neste ponto é removida e espalhada por igual para todos os lados (satisfazendo assim a conservação de massa, Lavoisier ficaria feliz com isso).

O fonte matlab abaixo mostra como a função foi feita, os shifts são rotações simples da matriz:

function hh=erosao(h,nivel);
hh=h;
for i=1:nivel,
    c=(hh>shiftr(hh)).*(hh>shiftl(hh));
    c=c.*(hh>shiftu(hh)).*(hh>shiftd(hh));
    hx=hh.*c.*0.01;
    hh=hh-hx+(shiftr(hx)+shiftl(hx)+shiftu(hx)+shiftd(hx))/4;
end

Para testar o modelo, inicialmente criei um terreno simples com o método Perlin que citei no post anterior, mas utilizando harmônicos de baixa freqüência, para que o terreno representasse uma área pequena. As imagens abaixo mostram o terreno original, o modelo erodido após 3000 iterações, e o resultado após 10000 iterações.

Exemplo de terreno artificial

Exemplo de terreno artificial

Exemplo de terreno artificial

Como esperado, a rotina gerou as superfícies planas que eu queria. Mas não resolveu todos os meus problemas, já que ele gerou planaltos, mas nenhuma planície! Isso acontece pelo modelo de erosão: estou supondo simplesmente erosão por chuva, quando na verdade planícies surgiriam de erosão por efeito de maré.

Mas este blog não é só sobre geração de terrenos, então vamos a uma pausa temporária e depois voltamos a esse assunto. Na próxima atualização: biologia e moda! E se alguém quiser fazer algum comentário enquanto eu não implemento um sistema online, sintam-se à vontade para mandar um email (ricbit@700km.com.br), ou então uma mensagem no ICQ, pelo meu UIN 61392017.

Dia 12

Bem vindos!

Um bom início de blog deveria ter uma apresentação de quem é o autor. Mas isto não é um blog, ou pelo menos não é um blog convencional, e, como tal, não terá um início convencional. Sobre mim, basta a descrição que uma amiga fez outro dia: "Esse é o Ricardo. Ele gosta de pingüins." O resto vocês aprendem com o tempo.

Mas se o blog não começa com o autor, começa com o quê? Na minha opinião, os melhores blogs são os temáticos, que focam em um único assunto, e, dia a dia, tentam explorá-lo com mais profundidade. Para mim, escolher um único assunto é difícil, considerando a quantidade de coisas que gosto. Por isso, resolvi usar este blog para realizar um de meus antigos sonhos: escrever um livro.

E que tipo de livro será esse? Meus livros preferidos sempre foram os épicos: Senhor dos Anéis, Fundação, Duna (talvez porque grandes doses de Kirby fluem por meu sangue). Em comum, essas séries têm um universo coeso onde se desenrola a história, e que muitas vezes tem papel maior que os próprios personagens.

Veja o exemplo do Tolkien: antes de escrever o Senhor dos Anéis, foram mais de 30 anos desenvolvendo a Terra-Média, Valinor, Númenor e outros. E isso pode ser visto com clareza nos livros, pela riqueza de detalhes em todos os aspectos de desenvolvimento, seja nos hábitos de cada raça, em sua linguagem, seu aspecto e assim por diante.

Mas, se o Tolkien tinha 30 anos para desenvolver seu mundo, eu não tenho. Afinal, não trabalho exclusivamente com literatura e não posso dedicar o resto da minha vida para isso. Concluí-se então que jamais conseguirei fazer algo tão grande quanto o Senhor dos Anéis? Não! Pois eu tenho uma habilidade que o Tolkien não tinha: sei programar computadores! E, com isso, todo o trabalho de criar um mundo coeso pode ser relegado à maquina. Deixemos que o computador crie os ambientes, os povos, as guerras. Como dizia Hari Seldon com sua psico-história: "Não é possível prever o comportamento de uma única pessoa, mas posso prever o comportamento das massas." De maneira análoga, deixo para o computador o comportamento da massas, e ao escritor resta apenas controlar os poucos personagens que protagonizarão os livros.

E por onde começar? Desenvolvo primeiro os povos? As linguas que eles falam? O estilo de roupas que usam? Os animais que vivem em suas terras? Não há uma resposta certa, por isso arbitrariamente escolhi começar pela geografia do mundo. O precedente histórico é relevante: muito da sociedade é moldada pelo local onde vive. A antiga Iugoslávia, por exemplo, é cercada por uma série de montanhas, muito difíceis de serem transpostas. Como a comunicação entre tribos era prejudicada, acabou-se formando micro-sociedades independentes. Ou seja, boa parte da diversidade cultural da região tem origem no terreno. Outro exemplo é o Japão: uma ilha isolada do continente, e que acabou formando costumes totalmente diferentes dos povos que viviam ligados por terra.

E no mundo fictício não é diferente. Meu exemplo preferido de como a geografia é importante para uma história vem novamente do Senhor dos Anéis. Quando escreveu o Hobbit, Tolkien ainda não tinha dado importância suficiente à criação do mapa. Por isso, a trajetória de Bilbo é uma linha reta onde os obstáculos são colocados de acordo com a necessidade da história (agora ele precisa passar por um rio... agora vai atravessar uma caverna... agora eu quero colocar uma floresta... e assim por diante). A trajetória do Bilbo pode ser vista no mapa abaixo como a seta vermelha.

Mapa da Terra-Média

Já no Senhor dos Anéis, Tolkien tinha mais experiência e fez a coisa com mais cuidado. Na verdade, boa parte da tensão no segundo livro vem de um dilema geográfico. A Sociedade precisa chegar a Mordor, do outro lado de uma cordilheira. Mas como atravessá-la? Tentaram por cima (seta azul), e não conseguiram devido às fortes nevascas (que Gandalf não podia neutralizar sem usar magias que revelariam sua posição a Saruman). Dar a volta pelo norte demoraria demais, e, portanto seria arriscado. Pelo sul (seta verde), seria ainda mais arriscado, pois teria que passar ao lado de Orthanc, fortaleza do inimigo. Daí a única solução é ir por dentro das minas de Moria, mesmo sabendo que lá habita um terror invencível.

Conferida então a importância da geografia, vamos à criação!


Quando eu penso em criação automática de terrenos, a primeira coisa que me vem à cabeça é o meu encontro com Ken Perlin, um americano que foi o criador do conceito de hipertexturas, e que vocês provavelmente conhecem como o programador dos efeitos especiais do filme Tron. Perdemos uma manhã conversando sobre qual é o melhor método para modelar o movimento das pernas de um formiga, realisticamente, em 3D (isso é típico de programadores quando se encontram, conversar sobre coisas absolutamente bizarras). E, entre uma formiga e outra, eu acabei aprendendo o método do Ruído Perlin.

A teoria é bastante simples. Ruídos tracicionais tem muito pouco controle. Você pode determinar a largura de autocorrelação do ruído, sua amplitude, a distribuição de probabilidade, e não muito mais que isso. Já os Ruídos Perlin tem mais flexibilidade, com aplicação direta deles você pode criar texturas de mármore, de madeira, e até mesmo... terrenos!

Para criar o Ruído Perlin, basta somar uma série de ruídos tradicionais, a cada iteração aumentando a freqüência e dimunuindo a amplitude dos ruídos. Controlando a taxa de variação da freqüência e amplitude, você parametriza seu ruído de acordo com o resultado que gostaria de obter. No meu caso, utilizei uma fonte de ruídos 2D, como pode ser visto no fonte matlab abaixo.

function y=perlin (n,level);
size=floor(log2(n));
y=zeros(n);
for i=level:size,
    r=randn(2^i)./(2^i);
    y=y+interpft(interpft(r',n)',n);
end

A utilização imediata da função acima gera um relevo com partes acima do mar e subaquáticas. Fazendo um corte ao nível do mar, conseguimos as curvas de nível:

Curvas de Nível

O relevo obtido lembra muito um rio que passa pelo meio de montanhas. Renderizando o Ruído Perlin como um mapa de alturas, e utilizando um pouco de Photoshop para colocar uma textura artificial no mar, conseguimos a imagem abaixo, que é bastante realista!

Exemplo de terreno artificial

Bonito, não é? Mas ainda não atingimos o objetivo. Os relevos criados por Ruído Perlin não são aplicáveis diretamente para a criação de um mundo que possa ser usado em um livro. O motivo é simples: o método gera paisagens montanhosas, mas nenhuma planície ou planalto onde as civilizações possam viver! Para resolver esse problema, well, voltem no blog na próxima atualização que eu conto o segredo :-)

< Voltar para o blog do Ricbit

< Voltar para o Mundo Bizarro
Autor: Ricardo Bittencourt
Copyright © 2002 Ricardo Bittencourt