A powerful JavaScript library for creating interactive universe simulations with Three.js
npm install universe-simulationimport UniverseSimulation from 'universe-simulation';
// Create simulation instance
const universe = new UniverseSimulation({
container: document.getElementById('canvas-container'),
width: window.innerWidth,
height: window.innerHeight
});
// Initialize
await universe.init();
// Add a sun
await universe.addSun({
radius: 10,
position: new THREE.Vector3(0, 0, 0)
});
// Add Earth
await universe.addPlanet({
name: 'earth',
radius: 1,
distance: 50,
speed: 0.001,
color: 0x2233ff
});
// Start the simulation
universe.start();- ๐ Full Universe Scale: From planetary surfaces to the edge of the observable universe
- โก High Performance: Optimized with Nanite-like LOD system and Web Workers
- ๐จ Stunning Visuals: JWST-inspired nebulae, HDR rendering, custom shaders
- ๐ฑ Mobile Ready: Touch controls and performance optimizations
- ๐ง Fully Customizable: Complete API control over all simulation aspects
const universe = new UniverseSimulation({
container: HTMLElement, // DOM element to render to (default: document.body)
width: Number, // Canvas width (default: window.innerWidth)
height: Number, // Canvas height (default: window.innerHeight)
mobile: Boolean, // Force mobile mode (auto-detected by default)
renderOptions: { // Additional Three.js renderer options
antialias: Boolean,
logarithmicDepthBuffer: Boolean
}
});Initialize the simulation. Must be called before adding any objects.
await universe.init();Add a star to the simulation.
await universe.addSun({
name: 'sol', // Unique identifier
position: new THREE.Vector3(0, 0, 0), // Position in space
radius: 10, // Size of the sun
color: STAR_COLORS['G'], // Star color (G-type by default)
intensity: 3 // Light intensity
});Add a planet to the simulation.
await universe.addPlanet({
name: 'earth',
radius: 1,
distance: 50, // Orbital distance from center
speed: 0.001, // Orbital speed
texture: null, // THREE.Texture for planet surface
color: 0x4444ff // Color if no texture provided
});Add a galaxy to the simulation.
await universe.addGalaxy({
name: 'andromeda',
position: new THREE.Vector3(1000, 0, 0),
type: 'spiral', // 'spiral', 'elliptical', or 'irregular'
scale: 1,
starCount: 50000 // Number of stars (auto-reduced on mobile)
});Add a nebula with JWST-inspired visuals.
universe.addNebula({
name: 'orion',
position: new THREE.Vector3(100, 50, -200),
scale: 100,
type: 'emission' // Visual style preset
});Generate the entire observable universe with galaxies, clusters, and cosmic web.
universe.createObservableUniverse();Smoothly focus the camera on a celestial object.
universe.focusOn('earth', {
distance: 10, // Distance from object
duration: 2000 // Animation duration in ms
});Control simulation playback.
universe.start(); // Begin animation loop
universe.stop(); // Pause animation loopToggle simulation pause state.
const isPaused = universe.togglePause();Control simulation speed.
universe.setTimeScale(10); // 10x speedHandle window resizing.
window.addEventListener('resize', () => {
universe.resize(window.innerWidth, window.innerHeight);
});Clean up all resources.
universe.dispose();Access Three.js internals for advanced usage.
const { scene, camera, renderer, THREE } = universe.getInternals();import { STAR_COLORS } from 'universe-simulation';
// Available star types
STAR_COLORS['O'] // Blue
STAR_COLORS['B'] // Blue-white
STAR_COLORS['A'] // White
STAR_COLORS['F'] // Yellow-white
STAR_COLORS['G'] // Yellow (Sun-like)
STAR_COLORS['K'] // Orange
STAR_COLORS['M'] // Redimport { NEBULA_COLORS } from 'universe-simulation';
// Emission, reflection, and other nebula color presetsimport UniverseSimulation, { AU_SCALE } from 'universe-simulation';
async function createSolarSystem() {
const universe = new UniverseSimulation({
container: document.getElementById('universe')
});
await universe.init();
// Add Sun
await universe.addSun({
name: 'sun',
radius: 10
});
// Add planets
const planets = [
{ name: 'mercury', radius: 0.4, distance: 0.39 * AU_SCALE, speed: 0.002 },
{ name: 'venus', radius: 0.9, distance: 0.72 * AU_SCALE, speed: 0.0015 },
{ name: 'earth', radius: 1, distance: 1 * AU_SCALE, speed: 0.001 },
{ name: 'mars', radius: 0.5, distance: 1.52 * AU_SCALE, speed: 0.0008 },
{ name: 'jupiter', radius: 11, distance: 5.2 * AU_SCALE, speed: 0.0004 },
{ name: 'saturn', radius: 9, distance: 9.5 * AU_SCALE, speed: 0.0003 },
{ name: 'uranus', radius: 4, distance: 19.2 * AU_SCALE, speed: 0.0002 },
{ name: 'neptune', radius: 3.8, distance: 30 * AU_SCALE, speed: 0.0001 }
];
for (const planet of planets) {
await universe.addPlanet(planet);
}
universe.start();
// Focus on Earth after 2 seconds
setTimeout(() => {
universe.focusOn('earth', { distance: 20 });
}, 2000);
}
createSolarSystem();async function createGalaxyCluster() {
const universe = new UniverseSimulation();
await universe.init();
// Create multiple galaxies
for (let i = 0; i < 10; i++) {
const angle = (i / 10) * Math.PI * 2;
const distance = 5000 + Math.random() * 5000;
await universe.addGalaxy({
name: `galaxy-${i}`,
position: new THREE.Vector3(
Math.cos(angle) * distance,
(Math.random() - 0.5) * 1000,
Math.sin(angle) * distance
),
type: ['spiral', 'elliptical', 'irregular'][Math.floor(Math.random() * 3)],
scale: 0.5 + Math.random() * 1.5
});
}
universe.start();
}import React, { useEffect, useRef } from 'react';
import UniverseSimulation from 'universe-simulation';
function UniverseComponent() {
const containerRef = useRef();
const universeRef = useRef();
useEffect(() => {
async function init() {
const universe = new UniverseSimulation({
container: containerRef.current
});
await universe.init();
await universe.addSun();
await universe.addPlanet({ name: 'earth', distance: 50 });
universe.start();
universeRef.current = universe;
}
init();
return () => {
if (universeRef.current) {
universeRef.current.dispose();
}
};
}, []);
return <div ref={containerRef} style={{ width: '100vw', height: '100vh' }} />;
}The simulation includes built-in navigation controls:
- WASD - Movement
- Mouse - Look around
- Space/Shift - Up/Down
- Scroll - Adjust speed
- Touch - Look around
- Pinch - Zoom
- Double tap - Move forward
The library includes an advanced LOD system that automatically adjusts object detail based on distance.
Heavy computations are offloaded to Web Workers for smooth performance.
// The library automatically detects and optimizes for mobile
const universe = new UniverseSimulation({
mobile: true // Force mobile optimizations
});const customMaterial = new THREE.ShaderMaterial({
uniforms: {
time: { value: 0 },
color: { value: new THREE.Color(0xff0000) }
},
vertexShader: `...`,
fragmentShader: `...`
});
await universe.addPlanet({
name: 'custom-planet',
radius: 2,
distance: 100,
material: customMaterial // Use custom material
});const { scene, camera, renderer, THREE } = universe.getInternals();
// Add custom objects directly
const customMesh = new THREE.Mesh(
new THREE.BoxGeometry(1, 1, 1),
new THREE.MeshBasicMaterial({ color: 0xff0000 })
);
scene.add(customMesh);git clone https://github.com/champi-dev/universesim.git
cd universesim
npm installnpm startnpm run build:libMIT License - see LICENSE file for details.
Contributions are welcome! Please feel free to submit a Pull Request to the GitHub repository.
Found a bug or have a feature request? Please open an issue on GitHub.
- NASA for astronomical data
- Three.js community
- JWST team for visual inspiration
Build your own universe, one star at a time โญ