Add 3D solar system view with Threlte and velocity tails in 2D

- 3D scene: Threlte/Three.js with starfield, orbit lines, planet meshes,
  sun glow, OrbitControls (orbit/zoom/pan), point lighting
- 2D velocity tails: gradient lines showing planet velocity direction/magnitude
- New WASM API: get_body_velocities_at_epoch(), get_orbit_points()
- Orbit ellipses computed in Rust, rendered in both 2D and 3D views
- Ecliptic-to-Three.js coordinate mapping (Y-up convention)
- View toggle now switches between working 2D and 3D renderers

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-08 11:54:31 -07:00
parent 5efe0736ac
commit 067ef1f557
8 changed files with 258 additions and 10 deletions

View File

@@ -2,7 +2,7 @@
import { onMount, onDestroy } from 'svelte';
import { SolarSystem2DRenderer } from '$lib/render/canvas2d/SolarSystem2D';
import { simulation } from '$lib/stores/simulation.svelte';
import { getBodyPositions, getBodyInfos, getOrbitPoints } from '$lib/wasm/bridge';
import { getBodyPositions, getBodyVelocities, getBodyInfos, getOrbitPoints } from '$lib/wasm/bridge';
let canvas: HTMLCanvasElement;
let renderer: SolarSystem2DRenderer;
@@ -38,7 +38,8 @@
if (simulation.wasmReady) {
simulation.bodyPositions = getBodyPositions(simulation.currentJD);
renderer.updateBodies(simulation.bodyInfos, simulation.bodyPositions);
const velocities = getBodyVelocities(simulation.currentJD);
renderer.updateBodies(simulation.bodyInfos, simulation.bodyPositions, velocities);
// Compute orbits on first frame and refresh every 600 frames (~10s)
if (!orbitsComputed || frameCount % 600 === 0) {