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:
| Concept | Simulation Value | Real-World Equivalent |
|---|---|---|
| One solar year | 2π radians | 365.242189 days |
| One AU | 100 units | 149,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
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:
- Earth → Sets Inclination Precession (333,888 ÷ 3 years)
- Inclination Precession → Sets Ecliptic Precession (333,888 ÷ 5 years)
- Ecliptic Precession → Sets Obliquity cycle (333,888 ÷ 8 years)
- Obliquity cycle → Sets Perihelion Precession (first pass)
- Perihelion Precession 1 → Sets Perihelion Precession (second pass)
- Perihelion Precession 2 → Sets Sun Barycenter location
- 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
}| Parameter | Formula | Purpose |
|---|---|---|
size | (Earth diameter / 1 AU) × 100 | Visual scale |
speed | 2π / (333,888 ÷ 13) | Axial precession rate (negative = clockwise) |
rotationSpeed | 2π × (solar days + 1) | Earth’s daily rotation |
tilt | -23.41398° | Mean axial tilt |
orbitRadius | -0.001431 × 100 | Distance 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 BCThis 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
}| Parameter | Value | Notes |
|---|---|---|
startPos | 0.28° | The June Solstice 2000 occurred at ~01:47 UTC, not exactly midnight |
speed | 2π | Exactly one solar year |
orbitRadius | 100 | Exactly 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 planetStep 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 frameThe 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 Type | Reference Point | Core Object |
|---|---|---|
| Moon | Earth | Earth is the center of all Moon movements |
| Planets | Sun | Sun 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
| Component | Key Value | Purpose |
|---|---|---|
| Base time unit | 2π = 1 solar year | All periods relative to this |
| Base distance unit | 100 = 1 AU | All distances relative to this |
| Start date | June Solstice 2000 | Reference point for all calculations |
| Holistic-Year | 333,888 years | Master cycle length |
| Balanced Year | -301,340 BC | System 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
- Two base units - 2π for time (1 year), 100 for distance (1 AU)
- Nested calculations - Each precession builds on the previous in a specific order
- Counter-rotating motions - Negative speeds (clockwise) vs positive speeds (counter-clockwise)
- Browser-based calculations - All RA/Dec values computed locally, no external APIs
- 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.