Skip to Content
🚀 Want to help? Get in touch!
3D SimulationTechnical Details

3D Simulation Technical Guide

This guide explains how the Interactive 3D Solar System Simulation works under the hood. It covers the mathematical foundations, the calculation order, and how each orbital parameter is configured.

Intended audience: Developers, researchers, and anyone curious about the technical implementation. Basic familiarity with JavaScript and trigonometry is helpful but not required.


Core Principles

The simulation is built in Three.js  and uses two fundamental units:

ConceptSimulation ValueReal-World Equivalent
One solar year2π radians365.242189 days
One AU100 units149,597,870.7 km

Since the circumference of a circle is 2πr, all orbital calculations derive from these base values:

  • Time: All periods are expressed relative to one solar year = 2π
  • Distance: All distances are expressed relative to 1 AU = 100

Start Date Alignment

The simulation’s start date is aligned to the June Solstice of 21 June 2000, 00:00 UTC.

At this moment, the Sun was at its highest declination (RA ~6h / ~18h), corresponding to maximum obliquity effect.

The June Solstice doesn’t occur at exactly the same time each year. The calendar uses 365.2425 days (accounting for leap years), which doesn’t perfectly match the actual solar year length. The simulation accounts for this offset.


Source Code & Data

  • Simulation code: Available on GitHub  (see the simulation source files)
  • Excel calculations: The downloadable Excel file contains all settings and detailed calculations
  • Configuration: All values in the simulation match the Excel and the theory described in this documentation
Screenshot of Excel spreadsheet showing technical configuration settings for the 3D simulation, including orbital parameters, precession cycles, eccentricity values, and mathematical constants

Calculation Order

The precession movements must be applied in a specific order. In Three.js, each movement is nested inside the previous one:

earth.pivotObj.add(earthInclinationPrecession.containerObj); earthInclinationPrecession.pivotObj.add(earthEclipticPrecession.containerObj); earthEclipticPrecession.pivotObj.add(earthObliquityPrecession.containerObj); earthObliquityPrecession.pivotObj.add(earthPerihelionPrecession1.containerObj); earthPerihelionPrecession1.pivotObj.add(earthPerihelionPrecession2.containerObj); earthPerihelionPrecession2.pivotObj.add(barycenterSun.containerObj); barycenterSun.pivotObj.add(earthHelionPoint.containerObj);

The calculation chain:

  1. Earth → Sets Inclination Precession (333,888 ÷ 3 years)
  2. Inclination Precession → Sets Ecliptic Precession (333,888 ÷ 5 years)
  3. Ecliptic Precession → Sets Obliquity cycle (333,888 ÷ 8 years)
  4. Obliquity cycle → Sets Perihelion Precession (first pass)
  5. Perihelion Precession 1 → Sets Perihelion Precession (second pass)
  6. Perihelion Precession 2 → Sets Sun Barycenter location
  7. Barycenter Sun → Sets PERIHELION-OF-EARTH location

The cumulative effect produces the Axial Precession duration of 333,888 ÷ 13 years around the EARTH-WOBBLE-CENTER.


Configuration Settings

Mean Solar Year Length

The solar year length is calculated from the Holistic-Year:

meanSolarYearLengthInDays = Math.round(365.2421897 * (333888/16)) / (333888/16);

The experienced solar year length varies due to Earth’s motion around the EARTH-WOBBLE-CENTER and the counter-motion of the PERIHELION-OF-EARTH around the Sun. If this value is set incorrectly, historic solstice dates won’t match observations.


Earth Variables

The Earth object contains all settings for Earth’s orbit around the EARTH-WOBBLE-CENTER:

{ "name": "Earth", "size": (12756.27 / 149597870.698828) * 100, // Diameter relative to AU "speed": -Math.PI * 2 / (333888/13), // Axial precession speed "rotationSpeed": Math.PI * 2 * (365.2422 + 1), // Daily rotation "tilt": -23.41398, // Mean axial tilt "orbitRadius": -0.001431 * 100 // Eccentricity amplitude }
ParameterFormulaPurpose
size(Earth diameter / 1 AU) × 100Visual scale
speed2π / (333,888 ÷ 13)Axial precession rate (negative = clockwise)
rotationSpeed2π × (solar days + 1)Earth’s daily rotation
tilt-23.41398°Mean axial tilt
orbitRadius-0.001431 × 100Distance to EARTH-WOBBLE-CENTER

Inclination Precession

{ "name": "Earth Inclination Precession", "startPos": ((balancedYear - startYear) / (333888/3) * 360), "speed": Math.PI * 2 / (333888/3) }

The startPos is calculated from the Balanced Year (-301,340 BC). This is when the solstice aligned with the PERIHELION-OF-EARTH while the Inclination Tilt and Axial Tilt were exactly opposite - a perfectly balanced state.

Counter-rotating motions: Earth’s speed (Axial Precession) is negative (clockwise), while Inclination Precession speed is positive (counter-clockwise). These two opposing motions are the foundation of the Holistic Universe Model.


Ecliptic Precession

{ "name": "Earth Ecliptic Precession", "startPos": ((balancedYear - startYear) / (333888/5) * 360), "speed": Math.PI * 2 / (333888/5), "orbitTiltb": -0.634 // Tilt amplitude (negative) }

The orbitTiltb value of -0.634° is opposite to the Obliquity cycle’s value of +0.634°. These opposing tilts combine to produce the total obliquity variation.


Obliquity Cycle

{ "name": "Earth Obliquity Precession", "startPos": -((balancedYear - startYear) / (333888/8) * 360), "speed": -Math.PI * 2 / (333888/8), "orbitTiltb": 0.634 // Tilt amplitude (positive) }

Note the negative startPos and speed - this cycle runs opposite to the Ecliptic Precession, creating the combined obliquity effect.


Perihelion Precession (Two Parts)

The Perihelion Precession is applied twice with opposite values:

Part 1:

{ "name": "Earth Perihelion Precession1", "startPos": ((balancedYear - startYear) / (333888/16) * 360), "speed": Math.PI * 2 / (333888/16), "orbitTilta": -1.26 // RA correction angle }

Part 2:

{ "name": "Earth Perihelion Precession2", "startPos": -((balancedYear - startYear) / (333888/16) * 360), "speed": -Math.PI * 2 / (333888/16), "orbitCentera": -0.015313 * 100 // Mean eccentricity }

Both parts have opposite startPos and speed values because the Axial Precession and Inclination Precession balance out in both directions. The orbitCentera value (-0.015313) is the mean orbital eccentricity.

The Balanced Year is calculated as:

const balancedYear = 1246 - (14.5 * (333888/16)); // = -301,340 BC

This represents 14.5 Perihelion Precession cycles before 1246 AD, aligned to explain the obliquity-driven temperature cycles.


Barycenter Sun

{ "name": "Barycenter Sun", "orbitRadius": 0.001431 * 100 // Eccentricity amplitude }

This adds the final offset from the mean PERIHELION-OF-EARTH distance to the actual value - the distance from Earth to the EARTH-WOBBLE-CENTER.


PERIHELION-OF-EARTH

{ "name": "PERIHELION-OF-EARTH" // No additional values }

This is a placeholder object to prevent the complex Barycenter calculations from interfering with planet position calculations. The location equals the Barycenter Sun location.


Sun

{ "name": "Sun", "startPos": 0.28, // Correction for exact solstice time "speed": Math.PI * 2, // One solar year "rotationSpeed": Math.PI * 2 / (365.2422 / 27.32),// ~Tropical month "tilt": -7.155, // Solar axial tilt "orbitRadius": 100 // 1 AU }
ParameterValueNotes
startPos0.28°The June Solstice 2000 occurred at ~01:47 UTC, not exactly midnight
speedExactly one solar year
orbitRadius100Exactly 1 AU from PERIHELION-OF-EARTH
tilt-7.155°Solar axial tilt 

Right Ascension & Declination Calculations

All celestial position values in the simulation are calculated entirely in the browser - no external API calls. The calculations are deterministic based on the current Julian Date.

Step 1: Get World Positions

Each frame, the simulation retrieves the 3D positions of celestial bodies:

earth.rotationAxis.getWorldPosition(EARTH_POS); // Earth center sun.planetObj.getWorldPosition(SUN_POS); // Sun center obj.planetObj.getWorldPosition(PLANET_POS); // Current planet

Step 2: Transform to Earth-Equatorial Frame

The planet’s position is converted to Earth’s local coordinate system, which includes the axial tilt and the 90° rotation that starts the simulation at the June Solstice:

LOCAL.copy(PLANET_POS); earth.rotationAxis.worldToLocal(LOCAL); // World → Earth frame

The line earth.containerObj.rotation.y = (Math.PI/2) * whichSolsticeOrEquinox applies the 90° rotation so that 0h RA still points at the March Equinox even though the simulation begins at the June Solstice.

Step 3: Convert to Spherical Coordinates

SPHERICAL.setFromVector3(LOCAL); obj.ra = SPHERICAL.theta; // θ → Right Ascension (radians) obj.dec = SPHERICAL.phi; // φ → Declination (radians)

Since LOCAL is already in the tilted equatorial frame, θ directly gives the RA and φ gives the Declination - no additional trigonometry needed.

Step 4: Format for Display

The raw radians are converted to sexagesimal notation:

obj.raDisplay = radiansToRa(obj.ra); // "12h34m56s" obj.decDisplay = radiansToDec(obj.dec); // "+12°34′56″"

Why Values Stay Consistent

The updatePositions() function runs after every orbit/precession update. Since it re-projects the current world-space vector into the live-tilted equator of earth.rotationAxis, any changes to Earth’s tilt, precession rate, or date/time are automatically reflected.


Moon and Planet Settings

The Moon and planet configurations follow the same principles as Earth:

Body TypeReference PointCore Object
MoonEarthEarth is the center of all Moon movements
PlanetsSunSun is the center of all planet movements

The detailed settings for each body are available in the Excel file. The mathematics work identically to the Earth settings described above.


Summary

ComponentKey ValuePurpose
Base time unit2π = 1 solar yearAll periods relative to this
Base distance unit100 = 1 AUAll distances relative to this
Start dateJune Solstice 2000Reference point for all calculations
Holistic-Year333,888 yearsMaster cycle length
Balanced Year-301,340 BCSystem equilibrium point

The simulation demonstrates that all precession phenomena emerge from two simple counter-rotating motions:

  • Earth around EARTH-WOBBLE-CENTER (clockwise, 333,888 ÷ 13 years)
  • PERIHELION-OF-EARTH around Sun (counter-clockwise, 333,888 ÷ 3 years)

Key Takeaways

  1. Two base units - 2π for time (1 year), 100 for distance (1 AU)
  2. Nested calculations - Each precession builds on the previous in a specific order
  3. Counter-rotating motions - Negative speeds (clockwise) vs positive speeds (counter-clockwise)
  4. Browser-based calculations - All RA/Dec values computed locally, no external APIs
  5. Excel parity - All simulation values match the downloadable Excel calculations

Return to the Interactive 3D Simulation or explore the Formulas for the complete Excel calculations.

Last updated on: