Using accurate ephemeris of the Sun, Earth, and Moon, we can simulate both solar and lunar eclipses of the past and future. Using real images of the Sun/Earth/Moont layered as textured images in a 3-D model, the simulation can show realistic eclipses as seen by an observer in space. By allowing a user to choose (1) the observation date and (2) the location of the viewing camera, we will allow students to explore the environment of the eclipse phenomenon so that students can grasp the underlying principles that govern the eclipse even with the minimal information from a lecture.

In the simulation module, we can simulate the dynamics of shadows (both umbra and penumbra) via a fog-like volume rendering.

07/16/2015 NASA/DSCOVR
The animation from the sequence of actual images taken by NASA DSCOVR on 07/16/2015 when the spacecraft flew behind the Moon.
Types of Solar Eclipses
A picture showing types of solar eclipses.

Ridwan and Emre are 1st-year engineering students at UGA, and they are deeply involved in creating 3D astronomical simulations using Blender, Unity, and Unreal Engine. Currently, they are working on the topic of Solar/Lunar Eclipses, and here is a short report on the progress.

Pending Tasks

  • Develop a simulation with the following capabilities
    • Interactive (or script-based) choice of observation date/time, and location on the Earth.
    • Ability to choose the location of a viewing camera (i.e., observer's point of view) from a set of preselected locations of interest. This allows students to transport across the solar system.

Technical Aspects

Prerequisites

  • We can use the SkyTracker as the starting point or build Sun/Earth/Moon specific model from the scratch. It's the latter that was chosen.
  • Accurate ephemeris (done already by obtaining data from NASA)

Newly created components from this simulation

These are newly created (or to-be-developed) components (functions, materials, cameras, etc.) from this topic simulation.

  • Accurate Sun/Earth/Moon system in Blender with textured images on their surfaces
  • By adjusting the sizes of blocking objects, we can see the changing shapes of eclipses.
  • By changing the inclination angle of the lunar orbit, we can see the effect of a 3-D geometrical project and the resultant eclipse frequency.
  • By putting the system in the extreme case, we can connect the concept of “transit” to the eclipse.
  • By simulating transits of the Mercury at two different latitudes on Earth, one can even measure the distance to the Sun.
  • Challenging By allowing a camera placed on the surface of the Earth at a given location (longitude and latitude) looking toward the Sun/Moon, this accurate simulation can even predict the type of solar eclipse whether it is (1) partial eclipse, (2) total eclipse, or (3) annular eclipse.
  • User interactivities can be done via a Python script (eclipses.py)

Tracking Shadow conic regions Using three cones as shown in the below image, we can track the umbra and penumbra regions. Relative sizes and positions of these cones can be determined from radii of the Sun and Earth (or Moon) and the distance between them.

Check https://astro.unl.edu/classaction/animations/lunarcycles/shadowsim.html for a simple simulation of eclipse shadows on 2D. This can demonstrate the formation of shadow cones of Earth and Moon.

Projecting the total eclipse path on the Earth surface This is called groundtracking in satellite engineering. This page, https://docs.poliastro.space/en/stable/examples/Generating%20orbit%20groundtracks.html may provide some useful information.

Astro Concepts

  • What is an eclipse?
  • Requirements for an eclipse
  • Effects of inclination, object sizes, and orbital sizes to eclipse frequency
  • Conjunction & opposition ⇒ solar or lunar eclipse
  • Similarities b/w transit and eclipse
  • Saros cycle and predicting future eclipses

Key Scenes

Utilizing NASA’s resources and measurements, we’ve constructed an accurate scaled model of the Earth-Moon-Sun system. This model reflects the accurate proportions and distances separating the celestial masses, which will provide the foundation for simulating accurate solar eclipses.

Each number on the Simulation Timeline bar below represents one full earth day and the simulation can theoretically continue for an indefinite amount of time. The user is currently able to select any desired time for a lunar viewing session.


Within our Earth model is an interactive orange camera element which is a viewing camera co-moving with Earth. This feature permits users to virtually position a camera anywhere across the globe’s terrain, achieving their unique perspective to observe the moon’s phases and positions.

The image on the right showcases the viewing angle from the camera location depicted by the image above which showcases a dark moon since it is currently daytime. The accuracy in positioning and scale of our Earth-Moon-Sun system is further demonstrated with the relative size of the moon matching that of the sun from Earth's perspective. This would result in producing authentic solar eclipses.



This image showcases how users can track the changing phases of the moon by adjusting camera viewing angles of the globe (i.e., the field of view follows the Moon).

The Earth-comoving camera's Field-of-View follows the motion of the Moon by continuously adjusting camera angle so that we can track the changing phase of the Moon or follow the sequence of an eclipse.


For future development and improvements, Emre and I are currently working to simulate the accurate elliptical revolution the earth takes around the sun as well as simulating the barycenter motion of the sun. In addition, We aspire to develop a python scripted user interface in which users can enter dates and times for a desired lunar viewing session as well as for selecting locations on earth to view space.

Updates in May 2024

Ridwan and Emre worked on the scene in Blender. Why are they still working in Blender? Why not in Unity as we had discussed before the CURO symposium? Here are shared documents from them.

  • Emre's (05/14/2024): emre_0514.pdf
  • Ridwan's (05/24/2024): blender_python_simulation_ui_documentation.pdf
    import bpy
     
    class AccountPanel(bpy.types.Panel):
       bl_label = "Account"
       bl_idname = "OBJECT_PT_custom_account"
       bl_space_type = 'VIEW_3D'
       bl_region_type = 'UI'
       bl_category = "Custom Category"
     
       def draw(self, context):
           layout = self.layout
     
           for label in ["Account Name: "]:
               layout.label(text=label)
     
    class TimePanel(bpy.types.Panel):
       bl_label = "Time"
       bl_idname = "OBJECT_PT_custom_time"
       bl_space_type = 'VIEW_3D'
       bl_region_type = 'UI'
       bl_category = "Custom Category"
     
       def draw(self, context):
           layout = self.layout
     
           layout.label(text="Current Time:")
           layout.label(text="Select Time:")
           layout.prop(context.scene, "day", text="Day")
           layout.prop(context.scene, "month", text="Month")
           layout.prop(context.scene, "year", text="Year")
     
    class SettingsPanel(bpy.types.Panel):
       bl_label = "Settings"
       bl_idname = "OBJECT_PT_custom_settings"
       bl_space_type = 'VIEW_3D'
       bl_region_type = 'UI'
       bl_category = "Custom Category"
     
       def draw(self, context):
           layout = self.layout
     
           layout.label(text="Rendering Strength")
           layout.prop(context.scene, "rendering_strength", text="")
           layout.label(text="Travel Speed")
           layout.prop(context.scene, "travel_speed", text="")
     
    def register():
       bpy.types.Scene.day = bpy.props.IntProperty(name="Day", min=1, max=31)
       bpy.types.Scene.month = bpy.props.IntProperty(name="Month", min=1, max=12)
       bpy.types.Scene.year = bpy.props.IntProperty(name="Year", min=1900, max=2099)
       bpy.types.Scene.rendering_strength = bpy.props.EnumProperty(
           name="Rendering Strength",
           items=[
               ("LIGHT", "Light", ""),
               ("MEDIUM", "Medium", ""),
               ("ULTRA", "Ultra", "")
           ]
       )
       bpy.types.Scene.travel_speed = bpy.props.IntProperty(name="Travel Speed", min=0, max=100)
     
       bpy.utils.register_class(AccountPanel)
       bpy.utils.register_class(TimePanel)
       bpy.utils.register_class(SettingsPanel)
     
    def unregister():
       bpy.utils.unregister_class(AccountPanel)
       bpy.utils.unregister_class(TimePanel)
       bpy.utils.unregister_class(SettingsPanel)
     
    if __name__ == "__main__":
       register()

Go back to the list of topics.