Construindo um Sistema Solar 3D com Three.js e React
Como desenvolvi uma visualização interativa do sistema solar usando Three.js, React Three Fiber e dados reais da NASA
A visualização 3D do sistema solar é um dos projetos mais desafiadores e fascinantes deste portfolio. Combinando física orbital real com gráficos 3D interativos, criei uma experiência educativa e visualmente impressionante.
A Inspiração
Sempre fui fascinado pelo cosmos. A ideia de representar a vastidão e beleza do sistema solar em uma aplicação web nasceu do desejo de unir duas paixões: programação e astronomia.
Tecnologias Utilizadas
Three.js & React Three Fiber
import { Canvas } from '@react-three/fiber'
import { OrbitControls, Stars } from '@react-three/drei'
function SolarSystem() {
return (
<Canvas camera={{ position: [0, 50, 100] }}>
<ambientLight intensity={0.1} />
<pointLight position={[0, 0, 0]} intensity={2} />
<Stars />
<OrbitControls />
{/* Planetas aqui */}
</Canvas>
)
}
Dados Orbitais Reais
Utilizei dados da NASA para garantir precisão:
| Planeta | Distância do Sol (UA) | Período Orbital (anos) | |---------|----------------------|------------------------| | Mercúrio | 0.39 | 0.24 | | Vênus | 0.72 | 0.62 | | Terra | 1.00 | 1.00 | | Marte | 1.52 | 1.88 |
Desafios Técnicos
1. Escala e Proporções
O sistema solar real tem proporções extremas:
- O Sol é 109 vezes maior que a Terra
- Netuno está 30 vezes mais distante do Sol que a Terra
Solução: Implementei escalas logarítmicas para manter tudo visível e interativo.
2. Performance
Renderizar múltiplos objetos 3D com texturas pode ser pesado.
Otimizações aplicadas:
- Level of Detail (LOD) para objetos distantes
- Instanced rendering para asteroides
- Texture atlas para reduzir draw calls
3. Mecânica Orbital
function calculateOrbitPosition(planet, time) {
const angle = (time * planet.orbitalSpeed) % (Math.PI * 2)
return {
x: Math.cos(angle) * planet.orbitRadius,
z: Math.sin(angle) * planet.orbitRadius
}
}
Features Implementadas
🎮 Controles Interativos
- Rotação: Arraste para girar a câmera
- Zoom: Scroll para aproximar/afastar
- Seleção: Clique em planetas para informações
- Velocidade: Controle do tempo de simulação
📊 Painel de Informações
Ao clicar em um planeta, exibe:
- Composição atmosférica
- Temperatura média
- Número de luas
- Fatos interessantes
🌟 Efeitos Visuais
- Bloom para o brilho do Sol
- Particle systems para anéis de Saturno
- Shader customizado para atmosferas planetárias
Implementação de Shaders
Para criar atmosferas realistas, desenvolvi shaders GLSL customizados:
varying vec3 vNormal;
uniform vec3 atmosphereColor;
void main() {
float intensity = pow(0.7 - dot(vNormal, vec3(0, 0, 1.0)), 2.0);
gl_FragColor = vec4(atmosphereColor, 1.0) * intensity;
}
Integração com o Portfolio
O sistema solar não é apenas uma demonstração técnica - ele se integra ao tema espacial do portfolio:
- Loading screen animado com órbitas
- Transições entre páginas simulam viagem espacial
- Easter eggs - encontre todos os 8 planetas!
Lições Aprendidas
Performance é Crucial
"Premature optimization is the root of all evil, but in 3D graphics, it's necessary evil."
User Experience em 3D
- Forneça referências visuais claras
- Implemente controles intuitivos
- Sempre inclua um botão de "reset camera"
Acessibilidade
Mesmo em 3D, acessibilidade importa:
- Descrições alternativas para screen readers
- Controles por teclado
- Modo de alto contraste
Código Aberto
O código completo está disponível no GitHub. Principais arquivos:
src/components/solar-system/
├── SolarSystem.tsx # Componente principal
├── Planet.tsx # Componente de planeta
├── OrbitLine.tsx # Linhas orbitais
├── shaders/ # GLSL shaders
└── data/planets.json # Dados dos planetas
Futuras Melhorias
- [ ] Adicionar cometas e asteroides
- [ ] Simular eclipses
- [ ] Modo "viagem" entre planetas
- [ ] Realidade aumentada (WebXR)
- [ ] Dados em tempo real de missões espaciais
Recursos e Referências
Conclusão
Este projeto demonstra que a web moderna é capaz de experiências antes limitadas a aplicações desktop. Com WebGL e bibliotecas como Three.js, podemos levar os usuários em uma jornada pelo cosmos - tudo no navegador.
"Somos todos poeira de estrelas contemplando as estrelas." - Carl Sagan
Artigos Relacionados
Bem-vindo ao Meu Portfolio
Conheça meu portfolio pessoal, desenvolvido com as tecnologias mais modernas do ecossistema JavaScript/TypeScript
Arquitetura Monorepo com Turborepo: Escalabilidade e Organização
Como estruturei meu portfolio usando Turborepo para gerenciar múltiplos pacotes com eficiência e type safety