This commit is contained in:
Flatlogic Bot 2025-09-12 18:26:02 +00:00
parent 069a494d39
commit 79dd7077af

View File

@ -62,7 +62,7 @@ scene.add(sun);
const segments = 128;
const orbitMaterial = new THREE.LineBasicMaterial({ color: 0xffffff, opacity: 0.5, transparent: true });
function createPlanet(radius, textureFile, distance, orbitSpeed) {
function createPlanet(radius, textureFile, distance, orbitalPeriodDays) {
const texture = textureLoader.load(`assets/textures/${textureFile}?v=${Date.now()}`);
const geometry = new THREE.SphereGeometry(radius, 32, 32);
const material = new THREE.MeshBasicMaterial({ map: texture }); // Reverted
@ -80,17 +80,17 @@ function createPlanet(radius, textureFile, distance, orbitSpeed) {
const trail = new THREE.Line(trailGeometry, trailMaterial);
scene.add(trail);
return { planet, pivot, orbitSpeed, trail, trailPoints };
return { planet, pivot, orbitalPeriodDays, trail, trailPoints };
}
const mercuryData = createPlanet(0.4, 'mercury.jpg', 7, 0.0297);
const venusData = createPlanet(0.9, 'venus.jpg', 11, 0.0116);
const earthData = createPlanet(1, 'earth.jpg', 15, 0.00717); // Adjusted for 365-day year
const marsData = createPlanet(0.7, 'mars.jpg', 20, 0.0038);
const jupiterData = createPlanet(3, 'jupiter.jpg', 30, 0.0006);
const saturnData = createPlanet(2.5, 'saturn.jpg', 40, 0.00024);
const uranusData = createPlanet(2, 'uranus.jpg', 50, 0.000085);
const neptuneData = createPlanet(1.9, 'neptune.jpg', 60, 0.000043);
const mercuryData = createPlanet(0.4, 'mercury.jpg', 7, 88);
const venusData = createPlanet(0.9, 'venus.jpg', 11, 225);
const earthData = createPlanet(1, 'earth.jpg', 15, 365);
const marsData = createPlanet(0.7, 'mars.jpg', 20, 687);
const jupiterData = createPlanet(3, 'jupiter.jpg', 30, 4333);
const saturnData = createPlanet(2.5, 'saturn.jpg', 40, 10759);
const uranusData = createPlanet(2, 'uranus.jpg', 50, 30687);
const neptuneData = createPlanet(1.9, 'neptune.jpg', 60, 60190);
// --- Saturn's Rings ---
const ringGeometry = new THREE.RingGeometry(3.5, 5, 64);
@ -293,7 +293,7 @@ pauseButton.addEventListener('click', () => {
pauseButton.textContent = isPaused ? 'Play' : 'Pause';
});
const speeds = [1, 100, 500];
const speeds = [1, 100, 500, 1000, 10000];
let currentSpeedIndex = 0;
let timeScale = speeds[currentSpeedIndex]; // Start with 1x speed
@ -308,8 +308,9 @@ speedToggleButton.addEventListener('click', () => {
const clock = new THREE.Clock();
const timeContainer = document.getElementById('time-container');
let simulationTime = new Date();
const ORBIT_SPEED_MULTIPLIER = 0.1;
const TIME_SPEED_FACTOR = 3600; // 1 real second = 1 simulation hour at 1x
const TIME_SPEED_FACTOR = 60; // 1 real second = 1 simulation minute at 1x
const MS_IN_A_DAY = 24 * 60 * 60 * 1000;
const MOON_ORBIT_DAYS = 27.3;
function updateTimeDisplay() {
@ -327,7 +328,9 @@ function animate() {
requestAnimationFrame(animate);
// Get time delta for frame-rate independent animation
const delta = clock.getDelta();
let delta = clock.getDelta();
// Clamp the delta to a maximum value to prevent large jumps, e.g., on the first frame or after tab refocus.
delta = Math.min(delta, 0.1);
// Update controls
controls.update();
@ -344,8 +347,9 @@ function animate() {
const worldPosition = new THREE.Vector3();
planets.forEach(p => {
// Orbit speed is now correctly scaled by timeScale
p.pivot.rotation.y += p.orbitSpeed * ORBIT_SPEED_MULTIPLIER * delta * timeScale;
const orbitalPeriodMs = p.orbitalPeriodDays * MS_IN_A_DAY;
const angleIncrement = (incrementMs / orbitalPeriodMs) * (2 * Math.PI);
p.pivot.rotation.y += angleIncrement;
// Planet's self-rotation (can also be constant)
p.planet.rotation.y += 0.05 * delta;
@ -362,7 +366,9 @@ function animate() {
});
// Moon's orbit (also scaled by timeScale)
moonPivot.rotation.y += 0.1 * ORBIT_SPEED_MULTIPLIER * delta * timeScale;
const moonOrbitalPeriodMs = MOON_ORBIT_DAYS * MS_IN_A_DAY;
const moonAngleIncrement = (incrementMs / moonOrbitalPeriodMs) * (2 * Math.PI);
moonPivot.rotation.y += moonAngleIncrement;
}
// Update time display every frame
@ -371,6 +377,7 @@ function animate() {
renderer.render(scene, camera);
}
animate();
// Handle window resize
@ -381,4 +388,4 @@ window.addEventListener('resize', () => {
});
// Initial call to set time
updateTimeDisplay();
updateTimeDisplay();