Olá Habr!
Em 2012, escrevi um post sobre meu hobby -
Cosmos: modelando a evolução de organismos multicelularesQuase 7 anos se passaram desde então, durante os quais trabalhei no desenvolvimento deste projeto. Hoje, quero contar um pouco sobre o que aprendi a fazer e como pretendo desenvolver ainda mais o projeto.
Motivação "Grande Evolução"
O Cosmos 2012 é um ótimo exemplo do sentimento do “efeito de imersão” da visualização, que foi o ponto de partida no desenvolvimento da ideia de fazer uma “simulação de vida na GPU”.
No entanto, a evolução real não ocorreu lá: o processo deve se desenvolver continuamente e não chegar a um estado final poucos minutos após o lançamento.
Verificou-se que o mais difícil é apenas alcançar a maior evolução possível de espécies que "não convergem para o limite de desenvolvimento", gerando uma variedade real de formas. Então será possível explorar esses formulários, e haverá um interesse real em executar a simulação por dias, semanas, meses - aguardando o surgimento de formulários cada vez mais complexos e desenvolvidos para estudo.
Física
Você pode pensar em qualquer física: com a ajuda da GPU, você pode criar uma ampla gama de modelos com o número de elementos suficientes para os processos evolutivos em tempo real. Qualquer combinação dos princípios de interação de certos "elementos", "átomos", "células" - dá origem a um construtor em evolução de formas nas quais alguma simulação complexa organizada pode literalmente se auto-montar a partir do nada.
No começo, eu queria criar matéria multicelular que permitisse que o cosmo se tocasse diretamente, "sem passar", tendo uma estrutura de bolas conectadas umas às outras em um mosaico, à maneira dos tecidos celulares de organismos reais.
Era necessário que os organismos se tornassem mais parecidos com os reais, e o significado físico aparecia nas diferentes estruturas de seus corpos. Você pode "desenhar" um corpo com pele, membros, músculos, pernas, órgãos internos com essas células - e esses corpos literalmente existirão e se desenvolverão dentro da simulação.
Um exemplo do CUDA SDK foi a realização de colisões de partículas redondas com base em uma rede espacial, que permite que as partículas interajam apenas com as próximas.
Eu descobri como o exemplo 3D funciona - e escrevi minha simulação para 2D.
No então GTX 580, isso permitiu calcular 256 mil partículas em tempo real.
CUDA + JavaScript
Outro problema era que era conveniente criar um conceito cósmico em JavaScript, enquanto a simulação em grande escala só era possível na GPU.
Aproximadamente 100 vezes mais conveniente e mais rápido em JS.
E cerca de 1000 vezes mais rápido em uma GPU.
A solução foi escrever a física da interação de partículas no CUDA e dar a oportunidade de criar partículas e controlar seus parâmetros a partir do JavaScript, integrando o mecanismo Google V8 que apareceu na simulação como uma linguagem de script.
Eu adicionei a capacidade de conectar as partículas com os mesmos "elásticos" que foram conectados nos primeiros espaços. Como resultado, pode-se escrever o código no script de controle JS:
var ball1 = new Ball(); var ball2 = new Ball(); ball1.xy = [0,0]; ball1.rgb = [1,1,1]; ball2.xy = [1,0]; ball2.rgb = [1,1,1]; var link = new Link(ball1, ball2);
e duas bolas brancas apareceram na tela, conectadas uma à outra por um "elástico".
Já neste nível de desenvolvimento do mecanismo, surgiram oportunidades interessantes para experimentos com física virtual:
Prédio
Ao adicionar várias propriedades às bolas, como resistência da união, massa, tamanho, elasticidade - consegui um construtor controlado por JavaScript no qual pude desenhar as estruturas de milhares de criaturas que consistem em células de diferentes propriedades físicas - e tudo isso foi calculado pela GPU em tempo real.
Como equilíbrio entre preço e qualidade, foi escolhida uma forma aerodinâmica e macia de um polvo.
Cada elemento do corpo (centro, membros) é realizado usando o número mínimo necessário de bolas, enquanto o volume e a massa são naturalmente distribuídos - onde os membros engrossam para o centro - o assunto se torna mais durável e maciço:
Motilidade
O próximo passo foi criar a motilidade dos corpos cósmicos. Os músculos eram fáceis de fazer - bastava apertar os laços entre as bolas ao longo das patas, e isso causava o efeito da contração muscular.
Os neurônios atuantes se conectam a esses músculos e, se houver um sinal, o músculo se contrai. Dois músculos por membro - um polvo bidimensional totalmente controlável.
Com a ajuda de uma pequena rede neural recorrente com mutação aleatória (da ordem de 10 a 100 neurônios) e uma seleção simples dos melhores indivíduos de acordo com o critério, por exemplo, "quem poderia se mover mais", você pode chamar a cinemática de movimento necessária para cada forma corporal individual:
Gênesis
Outra forma do corpo ativamente explorada são os "hexóides". Os corpos de tais criaturas são compostos de células que formam formas arbitrárias de bolas do mesmo tamanho com base em uma treliça não estrita próxima à hexagonal.
Este formulário é adequado para o estudo da evolução simultânea da forma e motilidade do corpo "em conjunto", enquanto maximiza o potencial de experimentos com células de vários tipos, diferindo em força e função. Por exemplo, os corpos cósmicos podem consistir em combinações de células sólidas que formam a estrutura da criatura e os músculos que colocam a estrutura em movimento.
No futuro, quando imersos em um habitat complexo, com base nesses princípios, formas distintas de criaturas poderão ser desenvolvidas - algumas das quais serão mais "blindadas", outras serão projetadas para movimentos rápidos, outras para um ataque eficaz, etc.
Caça e criação
Se o cosmos é ensinado a caçar um ao outro, a quantidade de matéria na simulação pode permanecer constante, enquanto gerações de criaturas se sucederão.
Então, cadeias alimentares estáveis podem se formar e um grande processo de co-evolução de diferentes espécies de criaturas começa.
Para o primeiro experimento, usei 4 tipos de células:
- célula digestiva (colorida) - ao tocar outro corpo cósmico, morde um pedaço
- armadura (luz) - uma gaiola mecânica mais forte que não pode ser arrancada
- tecido conjuntivo (cinza) - tecido elástico macio
- célula motora (escura) - permite que o espaço se mova mais rapidamente
Assim que o cosmos come um número suficiente de células, ele "se divide", formando próximo a sua cópia ligeiramente mutada.
Esse processo já está gerando formulários com estrutura e comportamento diferenciados:
Habitat
Espaço frio vazio não é o melhor lugar para se viver.
Para criar um bioma virtual, você pode usar materiais básicos de construção - partículas de solo, água, luz e células vegetais capazes de crescer.
Partículas de solo grudam umas nas outras, formando uma plataforma sólida. O solo pode ficar molhado se partículas de água entrarem nele.
Em solo úmido, com boa luz, as plantas podem crescer. A massa vegetal é a principal fonte de alimento orgânico para formas animais.
Os corpos animais, em decomposição, devolvem substâncias inorgânicas de volta ao ecossistema do bioma.
PS
Este é um artigo de revisão, cujas dimensões não permitem uma divulgação coerente de todas as áreas em que o projeto está sendo desenvolvido.
Agora, estou trabalhando em um designer interativo com todos os recursos que lhe dará a oportunidade de "jogar jogos espaciais" no modo sandbox, projetar novos tipos de criaturas, desenhar ecossistemas "no modo Deus" e observar a evolução em tempo real.
Quanto à parte técnica, o progresso não pára: desde 2012, o paradigma de desenvolvimento mudou 4 vezes, passando gradualmente do conceito CUDA + JS descrito neste artigo para modelos de GPU ORM que funcionam completamente no lado da GPU e têm sua própria linguagem de objetos para procedimentos armazenados.
Só isso, obrigado pela atenção!Siga o desenvolvimento do projeto e apoie o desenvolvimento aqui:
https://www.patreon.com/samadhi_toolboxAinda existem poucas postagens no blog, mas se houver assinantes, prometo publicá-las. Ao longo de sete anos, acumulei inescrupulosamente muito conteúdo
Em conclusão - uma pequena visão de trabalho: