Spaces:
Running
Running
File size: 5,091 Bytes
f79888b b79cc65 f79888b b79cc65 f79888b b79cc65 f79888b b79cc65 f79888b b79cc65 f79888b b79cc65 f79888b b79cc65 f79888b b79cc65 f79888b b79cc65 f79888b b79cc65 f79888b b79cc65 f79888b b79cc65 f79888b b79cc65 f79888b b79cc65 f79888b |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 |
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>3D Solar System with NEOs</title>
<style>
body { margin: 0; overflow: hidden; }
canvas { width: 100%; height: 100%; }
</style>
</head>
<body>
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/examples/js/controls/OrbitControls.js"></script>
<script>
// Scene setup
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
// Orbit controls for camera movement
const controls = new THREE.OrbitControls(camera, renderer.domElement);
camera.position.set(0, 20, 100);
controls.update();
// Lights
const ambientLight = new THREE.AmbientLight(0x404040);
scene.add(ambientLight);
const pointLight = new THREE.PointLight(0xffffff);
pointLight.position.set(0, 100, 100);
scene.add(pointLight);
// Sun
const sunGeometry = new THREE.SphereGeometry(5, 32, 32);
const sunMaterial = new THREE.MeshBasicMaterial({ color: 0xffcc00 });
const sun = new THREE.Mesh(sunGeometry, sunMaterial);
scene.add(sun);
// Planets
const planets = [
{ name: 'Mercury', distance: 10, scale: 0.2 },
{ name: 'Venus', distance: 15, scale: 0.4 },
{ name: 'Earth', distance: 20, scale: 0.5 },
{ name: 'Mars', distance: 25, scale: 0.3 },
{ name: 'Jupiter', distance: 35, scale: 2 },
{ name: 'Saturn', distance: 45, scale: 1.5 },
{ name: 'Uranus', distance: 55, scale: 1 },
{ name: 'Neptune', distance: 65, scale: 1 }
];
planets.forEach(planet => {
const geometry = new THREE.SphereGeometry(planet.scale, 32, 32);
const material = new THREE.MeshPhongMaterial({ color: Math.random() * 0xffffff });
const mesh = new THREE.Mesh(geometry, material);
mesh.position.x = planet.distance;
scene.add(mesh);
});
// NEOs (fictional for now, will update with real data)
let neos = [];
for (let i = 0; i < 10; i++) {
const geometry = new THREE.SphereGeometry(0.1, 32, 32);
const material = new THREE.MeshBasicMaterial({ color: 0xcccccc });
const neo = new THREE.Mesh(geometry, material);
neo.position.set(Math.random() * 30 - 15, Math.random() * 10 - 5, Math.random() * 30 - 15);
scene.add(neo);
neos.push(neo);
}
// Animation
function animate() {
requestAnimationFrame(animate);
planets.forEach((planet, index) => {
const planetMesh = scene.children[3 + index];
planetMesh.position.x = Math.cos(Date.now() * 0.001 * (index + 1)) * planet.distance;
planetMesh.position.z = Math.sin(Date.now() * 0.001 * (index + 1)) * planet.distance;
});
neos.forEach(neo => {
neo.position.x += Math.sin(Date.now() * 0.001) * 0.1;
neo.position.z += Math.cos(Date.now() * 0.001) * 0.1;
});
controls.update();
renderer.render(scene, camera);
}
animate();
// Fetching NEO data from NASA API
function fetchNEOData() {
fetch('https://api.nasa.gov/neo/rest/v1/feed?start_date=2025-02-18&end_date=2025-02-19&api_key=DEMO_KEY')
.then(response => response.json())
.then(data => {
// Update NEOs with real data
const neoData = data.near_earth_objects['2025-02-18'];
if (neoData) {
neos.forEach((neo, index) => {
if (index < neoData.length) {
const obj = neoData[index];
// Note: This is a very simplistic representation. Real trajectory calculation would require more complex physics.
neo.position.set(
obj.close_approach_data[0].miss_distance.astronomical * 100 - 50,
obj.close_approach_data[0].miss_distance.astronomical * 50,
obj.close_approach_data[0].miss_distance.astronomical * 100 - 50
);
}
});
}
}).catch(error => console.error('Error fetching NEO data:', error));
}
// Update NEO data periodically
fetchNEOData(); // Initial fetch
setInterval(fetchNEOData, 3600000); // Update every hour
</script>
</body>
</html> |