Olá pessoal, bem vindos a mais um episódio de Coding Adventures
O espaço é frustrantemente grande
se essa é a terra, a lua está bem pra cá
e marte está há diversos meses de distância
Seria muito mais divertido de explorar se a lua estivesse aqui
e os outros planetas também fossem mais acessíveis.
Por causa disso e alguns outros motivos
eu decidi criar o meu próprio sistema solar.
Primeiro nós precisamos de gravidade, então eu vou começar
com essa equação famosa que diz que
a força com que dois corpos se atraem
é igual a G, a constante gravitacional
o que no mundo real é esse pequeno número
mas pode ser o que quisermos na verdade.
Isso deve ser multiplicado pela massa de cada um dos corpos
e dividida pela distância entre seus centros ao quadrado.
Para traduzir isso para o código eu fiz um pequeno script
que possui a informação sobre cada corpo, como sua massa
raio e sua velocidade inicial. Eu então fiz uma função
para aumentar essa velocidade onde onde eu ciclo
por todos os outros corpos e calculo a força
usando a equação mostrada agora a pouco.
Aceleração é apenas força dividida pela massa
então essas massas na verdade se cancelam
mas eu vou mantê-las separadas pra deixar claro
e finalmente a velocidade é aumentada pela aceleração.
Eu tenho mais uma pequena função aqui
e essa apenas move o corpo de acordo com sua velocidade.
A razão pra ter mantido essas funções separadas
é porque eu também tenho uma simulação scriptada
que primeiro atualiza todas as velocidades e depois todas as posições
o que eu considero bem mais estável do que atualizar
a posição de cada corpo imediatamente.
Existe formas mais "chiques" de se fazer isso como por exemplo, pesquisei algo chamado
integração leapfrog
mas não parecia fazer diferença alguma então
eu acho que eu estava fazendo errado.
De qualquer forma, vamos mexer com isso um pouco, então se nós tivermos
um planeta e a lua posicionados dessa forma a lua vai apenas colidir
direto com o planeta, mas se eu aumentar
sua velocidade inicial no eixo Y
eu posso fazê-la navegar cada vez mais longe
até eventualmente desviar completamente do planeta
e entrar em órbita.
Aumentar essa velocidade inicial ainda mais fará a órbita
cada vez mais elíptica até finalmente
ir tão rápido ao ponto de escapar do campo gravitacional
do planeta
Eu posso também aumentar a velocidade inicial do planeta
então agora os dois corpos se movem pelo espaço.
Enfim, eu posso tentar aumentar a massa da lua
e nós podemos ver o caminho seguido pelo planeta lentamente
começar a ondular um pouco.
Então com dois corpos, as órbitas são bem simples e  previsíveis
mas se você adicionar apenas mais um
de repente passamos a ter uma explosão de complexidade.
Eu me diverti um pouco
brincando com configurações iniciais diferentes
mas inevitavelmente os planetas iriam colidir ou um deles seria lançado para fora
eu ficaria com apenas dois corpos orbitando um ao outro no mesmo padrão
repetitivo. E eu comecei a me perguntar se existia
algum cenário em que esse não seria o caso.
Então eu pesquisei um pouco
lendo a página do "problema dos três corpos" na wikipedia
o que me levou a esta tese
na qual temos listadas as condições para uma possível órbita estável
dos três corpos.
Então eu movi os corpos para as posições  descritas
e configurei suas velocidades iniciais
e é possível notar como uma órbita em forma de 8 surge.
 
Eu brinquei durante muito tempo e só consegui uma maluquice caótica
então eu me senti realmente surpreso pelo fato de uma órbita tão simples
assim realmente existir.
 
Ok, é hora de criar um sistema solar
então eu vou começar com o Sol no meio e
vou duplicá-lo
aqui
e transformá-lo em um planeta azul
e é claro que vou configurar seu raio para ser bem menor
e então eu preciso configurar a sua massa
mas eu não tenho ideia de qual deve ser esse valor
então eu arrumei a equação de antes para calcular a massa
de acordo com o raio
e a aceleração da gravidade na superfície.
Eu quero que esse planeta tenha uma gravidade similar a da Terra
então vou configurar esse valor em 10
finalmente eu vou aumentar sua velocidade inicial
até conseguir uma boa órbita em volta do Sol.
Agora, isso fará com que o Sol se mova também
então eu tenho uma opção no meu script para desenhar
tudo de forma relativa a um certo corpo.
O que é feito ao subtrair o movimento desse corpo a cada iteração.
Então se eu configurar isso para o Sol
podemos ver as órbitas do planeta azul de forma mais clara.
Agora eu vou adicionar mais um planeta ali perto
e o meu objetivo é fazer com que eles orbitem um ao outro
enquanto orbitam o Sol.
Eu estou tentando fazer isso ajustando as velocidades iniciais
mas até agora eles não têm se mostrado muito cooperativos.
Eu vou continuar ajustando pacientemente até que eles se comportem.
Parece melhor
mas eu quero que a órbita seja mais circular
então eu vou aumentar a velocidade de cada um
pouco a pouco até que pareça correto.
Com alguns pequenos ajustes alguns padrões diferentes
começam a aparecer, o que eu acho bem maneiro.
Não fica muito claro o que os planetas estão fazendo aqui exatamente
então eu vou voltar para a minha ferramenta de visualização
e irei aumentando o número de iterações a partir de zero.
Eu acho que eu posso também só deixar rolar e ver como fica.
 
 
Melhorou bastante, e me parece bom até aqui.
Então, diminuindo o zoom
eu vou adicionar um pequeno planeta verde
e vou ajustar sua velocidade até conseguir uma órbita circular.
Eu gostaria que esse planeta tivesse uma lua
então eu vou dar um zoom nele, fazer uma cópia e torná-la bem menor.
Então, como antes, eu vou mexer com a velocidade
até colocá-lo em órbita.
Mas é bem difícil verificar daqui se eu estou tendo sucesso
por isso eu vou apontar o visualizador de órbita para o planeta verde
e vou então tentar tornar a sua órbita circular.
Ok, agora eu quero um último planeta
um grande e roxo com uma gravidade relativamente alta em sua superfície
Eu vejo que ele está fazendo o planeta verde e sua lua
balançar um pouco
então eu vou distanciá-lo para que cause menos problemas.
Eu acho que quero que esse tenha duas luas, só para variar
então eu vou seguir em frente e criá-las.
 
 
Ao diminuir o zoom e ver as órbitas dessa forma você pode imaginar
o quão complexo deve ser para as pessoas do planeta roxo
olhar para o céu e ver esses ciclos orbitais peculiares
Um dia eles irão perceber que o Sol
está no centro na verdade e isso fará muito mais sentido.
Olhando as luas do planeta roxo,
especialmente a mais interna, eu tenho problemas em acreditar
que ela está realmente andando em círculos. Mesmo eu sabendo que é verdade.
Eu acho que é por causa da forma
com que ela aparentemente muda de direção que me confunde.
Então, eu fiz uma câmera seguir o planeta roxo
só para ter certeza.
Não é incrível como tudo isso parte
essencialmente dessa equação
nada impressionante?
De qualquer forma, eu realmente gostaria de poder voar
e visitar os planetas.
Então eu abri o Blender e criei essa nave de exploração
meio feinha.
E se eu der zoom aqui
você consegue ver que ela possui um interior tão feio quanto o exterior.
Mas temos um extintor de incêndio, então pelo menos é segura.
Eu então programei um controlador simples
esse é o código do "input" que nos permite
acelerar em todas as direções e também rotacionar a nave com o mouse.
 
Então aqui eu fiz com que a nave seja afetada pela força gravitacional
de todos os planetas
e apliquei a aceleração e rotação ao "rigid body" da nave.
Então eu posso agora entrar na minha nave e voar por aí.
Pode ser bem complicado perceber como você está se movendo em relação aos planetas
então eu bolei uma pequena UI para resolver esse problema.
Eu tenho jogado um jogo brilhante chamado "Outer Wilds"
e foi essencialmente o que me inspirou
a mexer com esse tipo de coisa no início.
Mas eu vou "roubar" sem vergonha alguma o que eles fizeram  na UI para lidar com isso
que é, quando você aponta a sua nave para um planeta, você pode ver esse marcadores
em volta, e se você clicar neles
então você vê informações importantes como a sua distância do planeta
quão rápido você está indo em sua direção
e com estas duas flechas, como o planeta está se movendo em relação a sua nave.
Como vocês podem ver, eu também adicionei algumas estrelas mais distantes
e eu estou ciente de que elas parecerem terríveis
mas elas são na verdade 3000 esferas posicionadas bem longe.
Eu gostaria de experimentar fazer algo melhor no futuro
não só estrelas, mas também nebulosas e outras coisas
mas por enquanto eu vou apenas tentar pousar graciosamente
nesse planeta verde.
Bem, isso foi qualquer coisa menos gracioso, mas em todo caso
eu vou levantar, abrir a comporta, sair
e pisar no planeta.
Assim como a nave, o jogador também é afetado pela gravidade
de todos os corpos, mas o que é diferente
é que ele acha qual corpo está exercendo a maior força gravitacional
e alinha o "pra cima" do jogador em relação a sua posição.
De qualquer forma, não existe muito o que ver nesse planeta
é apenas uma esfera no final das contas
então eu vou voltar para a minha nave, fechar a comporta, apertar os cintos
e decolar.
Então, obviamente esse sistema solar
não é algo exatamente interessante de se explorar no momento
mas eu gostaria de mudar isso, trocando as esferas
por planetas gerados proceduralmente
e talvez adicionando algumas pequenas criaturas ou eu não sei
quão longe eu vou levar ainda, mas parece algo divertido de se trabalhar.
Eu vou deixar todas essas coisas para os vídeos futuros
porque elas merecem episódios próprios.
Bem, aqui estamos na lua, ela é exatamente igual ao planeta
exceto que ela é cinza e você pode pular bem alto, é claro.
A última coisa que eu quero falar agora é sobre problemas de precisão
é um problema que assola jogos espaciais
ou qualquer mundo aberto que seja muito grande na verdade.
O problema é que quanto maior o número,
menos precisa a casa decimal passa a ser
e isso pode levar a uma física meio esquisita, ou problemas de renderização quando o jogador está muito longe do centro do mundo. Por exemplo aqui eu tenho minha nave no planeta mais distante.
50 mil unidades do ponto inicial
e tudo está tremendo como se não houvesse amanhã.
Então a forma como eu consertei isso foi fazer um pequeno script
que checa o quão longe a câmera do jogador está do centro do mundo
e se ela exceder um limite
apenas mover tudo na cena para colocar
o jogador no centro.
A engine da física não foi muito fã dessa solução no começo
mas com alguns ajustes consegui fazê-la aceitar.
Então, no editor
eu tenho o valor daquele limite configurado como 1000 no momento
mas só para demonstração eu vou configurar para um valor bem pequeno
e agora, enquanto eu piloto a nave você pode ver
que ela fica bem fixa no centro enquanto a lua
e todo o resto se move ao meu redor.
Claro, que do ponto de vista do jogador tudo parece normal.
Então, isso é tudo que eu tenho por enquanto
é tudo bem cru e improvisado, os planetas não possuem rotação
ainda, pois isso fazia meu jogador deslizar de forma estranha
mas eu me diverti bastante brincando com isso
e eu estou bem empolgado em levar esse projeto mais pra frente
eu espero que vocês tenham gostado de assistir e até a próxima.
Cheers!
