Skip to Content
🌞 Hey there! Use the 3D-button to see the Interactive 3D Solar System Simulation.
Chapters13 3D Technical Guide

The Technical setup of the Interactive 3D Solar System Simulation

The Interactive 3D Solar System Simulation of the Holistic Universe Model is built in three.js.

In this chapter I will show the technical setup of the Interactive 3D Solar System Simulation. At its core it is based upon two basic calculations:

  • One Solar year is a circle = 2 * PI() = 6.283185307
  • One AU is the radius of a circle = 100

Since the circumference of a circle is 2 * PI * r we can make all sort of calculations based upon these input numbers.

  • The length of a Solar year is 1 = 2 * PI () = 365.242273019961 days a year. All other calculations will be relative to the length of the solar year as 2*PI.
  • The length of an AU = 100 = 149,597,870.698828 km (currently). All other calculations will be relative to the length an AU as 100.

Another thing to take into consideration is the startdate of the Interactive 3D Solar System Simulation is more or less aligned to the June Solstice of 21 June 2000, 00:00 UTC.

Around this timestamp the Sun was highest in the sky (max obliquity) at RA ~6h/ ~18h.

NOTE: The June Solstice alignments are not on the same date and time every year. The Sun orbits around Earth taking into account a calendar of 365.2425 years which does not match with the actual length of solar year, so only once every 4 years it is best aligned.

The code of the Interactive 3D Solar System Simulation is available on codepen and github and can be found in the support section.

All the settings – including a lot more background information on the exact calculations – can be found in the Excel.

Holistic Universe Model – Interactive 3D Solar System Simulation settings

The Interactive 3D Solar System Simulation is completely in line with the Excel and the theory as described in this book.

I will mention the most important settings of the Interactive 3D Solar System Simulation.

  1. Setting the length of the MEAN Solar year in days

    The length of a solar year is calculated automatically based upon the length of the holistic year.

    //DEFINE LENGTH OF MEAN SOLAR YEAR IN DAYS meansolaryearlengthinDays = Math.round(lengthsolaryearindaysin1246 * (holisticyearLength / 16)) / (holisticyearLength / 16); Math.round((31556929.19/86399.9913)*(298176/16))/(298176/16)

    NOTE: The experienced length of solar year will be different because of the movements of Earth around the EARTH-WOBBLE-CENTER and the counter movement of the PERIHELION-OF-EARTH around the Sun.

    If you set it too high or too low, the historic solstice dates will not match. It needs to be set with the MEAN value of the solar year in days which it had in the beginning of year 1246 AD on date 1245-12-14 which is ~31556929.19 SI seconds (the scientifically accepted length of solar year in days around year 1246 AD). In year 1246 AD my calculations show the length of day was ~86,399.9913 SI seconds to explain the delta-T value in that period.

  2. Setting up the order of the calculations

    All precession movements need to be set in a particular order to make sure they are showing up correctly.

    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);
    • From Earth we will set the Inclination precession duration
    • From the Inclination precession we will set the Ecliptic precession duration
    • From Ecliptic precession we will set the length of the Obliquity cycle
    • From the Obliquity cycle we will set the Perihelion precession duration (first time)
    • From the Perihelion precession we will set the Perihelion precession duration (second time)
    • From the Perihelion precession we will set the exact location of the Sun Barycenter

    Adding up all calculations will result in the Axial precession duration around the EARTH-WOBBLE-CENTER of 298176/13 years.

    • Additionally from the Sun Barycenter we will set that exact same location as the location of the PERIHELION-OF-EARTH

    This last step is just added to make sure the rest of the calculations are not interfering with any additional calculations.

    The location of the Sun Barycenter = The location of the PERIHELION-OF-EARTH.

  3. The settings of the Earth variables explained
    • The Earth variable contains all settings of Earth’s orbit around the EARTH-WOBBLE-CENTER
    "name": "Earth", "size": (diameters.earthDiameter/ currentAUDistance)*100, "speed": -Math.PI*2/(holisticyearLength/13), "rotationSpeed": Math.PI*2*(meansolaryearlengthinDays+1), "tilt": -earthtiltMean, "orbitRadius": -eccentricityAmplitude*100,

    The size is calculated as:

    =(“diameter Earth”/ “current distance Earth to PERIHELION-OF-EARTH”)*100 =(12756.27/ 149597870.698828)*100

    The speed is set relative to the length of the solar year of 2*PI(). Therefore we can make a calculation:

    =(2*PI())/”Axial precession in years” =(2*PI())/(298176/13)

    The rotationspeed is set relative to the length of the solar year of 2*PI(). Therefore we can make a calculation:

    =“speed value”*(“Axial precession in years”*(“solar year in days”+1)) =((2*PI())/(298176/13))*((298176/13)*((6806655/18636)+1))

    The tilt needs to be set to the mean value of the Axial tilt:

    =-23.42723

    The orbitradius is the eccentricity amplitude and therefore the value of the Earth to the EARTH-WOBBLE-CENTER. It’s additionally in a ratio of 1:~324.5 to explain the difference between the solar year and the sidereal year (~324.5/13*16). See chapter 4 for more details.

    orbitRadius: -0.00308211*100,
  4. The settings of the Inclination precession variables explained
    "name": "Earth Inclination Precession", "startPos": ((balancedYear-startmodelyearwithCorrection)/(holisticyearLength/3)*360), "speed": Math.PI*2/(holisticyearLength/3),

    The startPos setting is the calculated position from the Balanced-Year (-268976 BC ; JD -96520356). The date the solstice was aligned with the PERIHELION-OF-EARTH AND the Inclination Tilt AND Axial Tilt were completely opposite to each other. Although they were opposite, the system was completely in balance in that exact year (and that particular juliandate).

    The speed is set relative to the length of the solar year of 2*PI().

    NOTE: The Earth speed (which is the Axial precession speed) is -/- and the Inclination precession speed is +/+. These are the two counter movements which are at the core of the Holistic Universe Model.

  5. The settings of the Ecliptic precession variables explained
    "name": "Earth Ecliptic Precession", "startPos": ((balancedYear-startmodelyearwithCorrection)/(holisticyearLength/5)*360), "speed": Math.PI*2/(holisticyearLength/5), "orbitTiltb": -tiltandinclinationAmplitude,

    The startPos and speed settings are explained as above but this time with the length of the ecliptic precession.

    The orbitTiltb value of the Ecliptic precession AND the orbitTiltb value of the Obliquity cycle are opposite to each other:

    =-0.564
  6. The settings of the Obliquity cycle variables explained
    "name": "Earth Obliquity Precession", "startPos": -((balancedYear-startmodelyearwithCorrection)/(holisticyearLength/8)*360), "speed": -Math.PI*2/(holisticyearLength/8), "orbitTiltb": tiltandinclinationAmplitude,

    The startPos and speed settings are explained as above but this time with the length of the obliquity precession.

    The orbitTiltb value of the Ecliptic precession AND the orbitTiltb value of the Obliquity cycle are opposite to each other:

    =0.564
  7. The settings of the Perihelion precession1 variables explained
    "name": "Earth Perihelion Precession1", "startPos": ((balancedYear-startmodelyearwithCorrection)/(holisticyearLength/16)*360), "speed": Math.PI*2/(holisticyearLength/16), “orbitTilta”: -earthRAAngle,

    The startPos and speed settings are explained as above but this time with the length of the precession precession.

    The orbittilta setting with variable earthRAAngle is actually the only setting of all precession movements which I cannot fully calculate. It has to do with the start of the balanced year so depending where exactly we are in our big obliquity precession cycle of 298,176 years. I have set the balanced year at the top of the code:

    const balancedYear = perihelionalignmentYear-(14.5*(holisticyearLength/16));

    Calculating backwards in time since 1246 AD, there were 14.5 cycles of perihelion precession: 1246 – (18,636*14.5 = -268976). The reason why it is set to 14.5 is to align the obliquity cycle as an explanation for the temperature cycles.

    The -1.12 makes sure the PERIHELION-OF-EARTH is set correctly compared to the startdate of the model. We need to add this correction factor because the Sun highest in the sky in not fixed to RA ~6h / ~18h all through the cycle of 298,176 years. It will fluctuate. From year 1246 AD onwards the value will slowly decrease.

    "orbitTilta": -1.12,
  8. The settings of the Perihelion precession2 variables explained
    "name": "Earth Perihelion Precession2", "startPos": -((balancedYear-startmodelyearwithCorrection)/(holisticyearLength/16)*360), "speed": -Math.PI*2/(holisticyearLength/16), “orbitCentera”: -eccentricityMean*100,

    The startPos and speed settings are explained as above but this time – again - with the length of the precession precession.

    NOTE: The perihelion precession is added twice in the settings ( “Earth Perihelion Precession1” and “Earth Perihelion Precession2”). Both have complete opposite values for “Startpos” and “Speed” because the movement of Axial precession and Inclination precession are balancing out in both ways.

    We need to add the MEAN distance of Earth to the PERIHELION-OF-EARTH, which is the MEAN orbital eccentricity value.

    "orbitCentera": -0.01370018*100,
  9. The settings of the Barycenter Sun variables explained
    "name": "Barycenter Sun", "orbitRadius": eccentricityAmplitude*100,

    The only thing left to move from the MEAN distance of Earth to the PERIHELION-OF-EARTH to the actual value, is to add the distance from Earth to the EARTH-WOBBLE-CENTER as the Orbitradius value.

  10. The settings of the PERIHELION-OF-EARTH variables explained
    "name": "PERIHELION-OF-EARTH",

    This last step is just added to make sure the rest of the calculations are not interfering with any additional calculations. I initially tried to just use the Barycenter Sun value directly, but noticed the Interactive 3D Solar System Simulation would stall because of the complex calculations that are based upon the barycenter Sun for the position of all planets. Therefore just added the dummy “PERIHELION-OF-EARTH” without any further values.

  11. ONCE WE HAVE THE BARYCENTER SUN VALUE (=PERIHELION-OF-EARTH) WE CAN ADD THE SUN EXACTLY AT 1 AU

    The Sun is at a distance of 1 AU from the PERIHELION-OF-EARTH.

    "name": "Sun", "startPos": correctionSun, "speed": Math.PI*2, "rotationSpeed": (Math.PI*2)/(1/(meansolaryearlengthinDays/moonTropicalMonth)), "tilt": -7.155, "orbitRadius": 100,

    The startpos of the Sun is not at 06h00m00s at the start of the model but 6h was already reached around 01:47 UTC in the morning on 21 June 2000 as can be seen on this website. Therefore we need to subtract -0.22 degrees.

    The speed of the Sun is exactly 1 solar year and therefore 2 * PI():

    =(2*PI())

    The rotationspeed of the Sun is not used in any further calculation but is set the same value as the tropical month length of the Moon. There is no single value for the rotationspeed of the Sun. The northern part rotates at another speed than the southern part.

    The tilt is not used in any further calculation but I have set it to a value according to wikipedia:

    =-7.155

    The orbitradius of the Sun is exactly 1 AU and therefore has a value of 100:

    =100
  12. The settings of the barycenterPLANETS variables explained
    "name": "Barycenter Planets12", "speed": Math.PI*2/(holisticyearLength/12),

    The perihelion points of the planets do not move in the same speed as Earth perihelion point. Some planet perihelion points move faster and some move slower. Therefore I have added 5 different speed barycenterPLANETS movements. I only mention the “Barycenter Planets12” above (used for Mercury, Venus and Neptune) but there is also a 14 (Jupiter and Uranus) ,15 (Saturn) and 16 (Mars).

    ONLY the speed is added, so no radius or any other setting can be added.

Where the Right Ascension & Declination come from

All of the numbers you see in the Celestial Positions menu are calculated entirely in the browser. Nothing is fetched from an external API. It’s all deterministic maths driven by the current Julian Date.

  1. Determine the positions

    Every frame updatePositions() asks Three-JS for the centre of the Earth, the Sun and each body that appears in the Celestial Positions list.

    earth.rotationAxis.getWorldPosition(EARTH_POS); // Earth centre sun.planetObj .getWorldPosition(SUN_POS); // Sun centre obj.planetObj .getWorldPosition(PLANET_POS); // current planet
  2. Transform into the Earth-equatorial frame

    The crucial step is to express that planet-vector in the local coordinates of earth.rotationAxis, i.e. the Earth’s equator with axial tilt already applied and – very important – the extra 90 ° spin you give the whole model so that the simulation starts on 21 June 2000.

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

    earth.containerObj.rotation.y = (Math.PI/2) * whichSolsticeOrEquinox; does that 90 ° spin at start-up, so 0 h RA still points at the March equinox even though the visual model begins on the June solstice.

  3. Convert Cartesian → spherical to get θ & φ
    SPHERICAL.setFromVector3(LOCAL); // θ = longitude, φ = latitude obj.ra = SPHERICAL.theta; // θ → Right Ascension (radians) obj.dec = SPHERICAL.phi; // φ → Declination (radians)

    Because LOCAL is already in the tilted equatorial frame, no further trigonometry is required – θ is the RA and φ is the Dec, both geocentric apparent values for that instant.

  4. Format for the Celestial positions menu

    The raw radians are turned into either sexagesimal or decimal strings with the helpers in RA and Degree Functions.

    obj.raDisplay = radiansToRa(obj.ra); // 12h34m56s obj.decDisplay = radiansToDec(obj.dec); // +12°34′56″
  5. Why the results stay consistent while the Earth moves

    updatePositions() is called after every orbit/precession update. Since each call re-projects the current world-space vector into the live-tilted equator of earth.rotationAxis, any change you make to the Earth’s tilt, precession rate, or the date/time slider is automatically reflected in the next RA/Dec read-out.

    The RA & Dec values in the celestial positions menu are nothing more (and nothing less) than the spherical coordinates of the Sun’s real-time 3-D position vector after all your nested precession pivots have been applied.

The Moon and Planet settings.

I could also add these kind of background numbers for the Moon movements and for all planet movements. But you can also just have a look at the Excel and try to find out why certain settings are set the way they are.

It all basically works the same as described above.

The only real difference is:

  • For the Moon, the Earth is at the core of all movements.
  • For all planets, the Sun is at the core of all movements.

If you play with all above mentioned settings, AND read this book, AND study the Excel intensively, you will most probably understand the Interactive 3D Solar System Simulation.

Last updated on: