91³Ô¹ÏÍø

Watch CBS News

NASA beams back spectacular images of Jupiter and our solar system's biggest moon, Ganymede

NASA's Juno probe has flown closer to Jupiter and its largest moon, Ganymede, than any other spacecraft in more than two decades — and the images it beamed back of the gas giant and its icy orb are breathtaking. 

Juno approached Ganymede on June 7, before making its 34th flyby of Jupiter the following day, traveling from pole to pole in under three hours. 

On Thursday, NASA released an animated series of images captured by the spacecraft's JunoCam imager, providing a "starship captain" point of view of each flyby. They mark the first close-up views of the largest moon in the solar system since the Galileo orbiter last flew past in 2000.

The time-lapse animation lasts three-and-a-half minutes, guiding space enthusiasts within 645 miles of Ganymede at 41,600 miles per hour. The images show the lighter and darker regions of the moon, believed to be the result of ice sublimating, transitioning from a solid to a gas state. 

Also visible is the crater Tros, one of the largest and brightest crater scars on the moon. 

by on

The animation then travels to Jupiter, a 735,000-mile journey from Ganymede that takes Juno 14 hours and 50 minutes. Viewers are brought within 2,100 miles of Jupiter's famous clouds, as the planet's powerful gravity accelerates the probe to nearly 130,000 miles per hour. 

Visible from that perspective are the cyclones at the gas giant's north pole, as well as five "string of pearls" — gigantic storms spinning in the southern hemisphere, appearing as white ovals.

"The animation shows just how beautiful deep space exploration can be," Scott Bolton, principal investigator for Juno, said in a . "The animation is a way for people to imagine exploring our solar system firsthand by seeing what it would be like to be orbiting Jupiter and flying past one of its icy moons. Today, as we approach the exciting prospect of humans being able to visit space in orbit around Earth, this propels our imagination decades into the future, when humans will be visiting the alien worlds in our solar system." 

060821-ganymede1.jpg
NASA's Juno spacecraft captured high-resolution views of Jupiter's moon Ganymede during a flyby in June 2021 at an altitude of about 645 miles. The flyby was the first close-up look at the big moon since NASA's Galileo orbiter flew past for the last time in 2000. NASA/JPL-Caltech/SwRI/MSSS

NASA's animation team also simulated lightning that would be visible if you were actually viewing one of Jupiter's thunderstorms in person. The camera's point of view for the animation was generated by citizen scientist Gerald Eichstädt, using composite images of the planet and its moon. 

"This is the closest any spacecraft has come to this mammoth moon in a generation," Bolton said. "We are going to take our time before we draw any scientific conclusions, but until then we can simply marvel at this celestial wonder, the only moon in our solar system bigger than the planet Mercury."

The next flyby of Jupiter, Juno's 35th such trip, is scheduled for July 21. 

View CBS News In
CBS News App Open
Chrome Safari Continue
const link = doc.createElement('link'); link.rel = 'stylesheet'; link.href = '/fly/fly/bundles/cbsnewscontent/css/cmp-banner.min.css?v=296763317a51cab90faa73f1bb146d5c'; doc.head.appendChild(link); doc.body.innerHTML = CONSENT_MESSAGE; } else { el.insertAdjacentHTML('afterend', CONSENT_MESSAGE); } }); } function hidePrivacyMessage() { // Remove from the main document document.querySelectorAll(`.${CONSENT_MESSAGE_CLASS}`).forEach(el => el.remove()); // Remove from inside any iframes document.querySelectorAll('iframe').forEach(iframe => { const doc = iframe.contentDocument || iframe.contentWindow.document; doc.querySelectorAll(`.${CONSENT_MESSAGE_CLASS}`).forEach(el => el.remove()); }); } function activateGatedScripts() { // Handle both new format (cmp-gated-script) and old OneTrust/Ketch format (optanon-category-4) const gatedScripts = Array.from(document.querySelectorAll('script.cmp-gated-script, script.optanon-category-4')); // Activate scripts sequentially with a small delay to avoid timing issues let delay = 0; gatedScripts.forEach(function(placeholder, index) { setTimeout(function() { // Skip if already processed if (placeholder.hasAttribute('data-cmp-processed')) { return; } placeholder.setAttribute('data-cmp-processed', 'true'); const newScript = document.createElement('script'); newScript.type = 'text/javascript'; // Try new format first (data-cmp-src), then fall back to old format (data-src) const src = placeholder.getAttribute('data-cmp-src') || placeholder.getAttribute('data-src'); if (src) { newScript.src = src; } else if (placeholder.textContent) { // Inline script - just copy the content newScript.textContent = placeholder.textContent; } // Handle new format attributes (data-cmp-attrs) - for both inline and external scripts const attrs = placeholder.getAttribute('data-cmp-attrs'); if (attrs) { const tempDiv = document.createElement('div'); tempDiv.innerHTML = '
<\/div>'; const tempAttrs = tempDiv.firstChild.attributes; for (let i = 0; i < tempAttrs.length; i++) { // For external scripts, allow defer/async. For inline scripts, skip them (not valid) if (src || (tempAttrs[i].name !== 'async' && tempAttrs[i].name !== 'defer')) { newScript.setAttribute(tempAttrs[i].name, tempAttrs[i].value); } } } // Copy other attributes from old OneTrust format for (let i = 0; i < placeholder.attributes.length; i++) { const attr = placeholder.attributes[i]; // Skip attributes we've already handled or don't want to copy if (!['class', 'data-src', 'data-type', 'data-cmp-src', 'data-cmp-attrs', 'data-cmp-processed', 'type', 'async', 'defer', 'src'].includes(attr.name)) { newScript.setAttribute(attr.name, attr.value); } } placeholder.parentNode.replaceChild(newScript, placeholder); // If external script, manually trigger window.onload handlers after it loads // This handles widgets that use window.onload for initialization if (src) { newScript.addEventListener('load', function() { // If page already loaded and script set a new onload handler, trigger it if (document.readyState === 'complete' && window.onload) { const originalOnload = window.onload; window.onload = null; // Clear temporarily to prevent loops originalOnload(); // Execute the handler } }); } }, delay); delay += 500; // 500ms delay between each script to allow full loading }); } cbsoptanon.onScriptsReady(function(cmp) { cmp.ot.targetingAllowed(function(allowed) { if (!allowed) { showPrivacyMessage(); } else { activateGatedScripts(); } }); cmp.ot.awaitInitialConsent(function(consent_model) { cmp.ot.addOnConsentChangedHandler(function() { cmp.ot.targetingAllowed(function(allowed) { if (allowed) { hidePrivacyMessage(); activateGatedScripts(); } else { showPrivacyMessage(); } }); }); }); });