diff --git a/plugin/contents/ui/dancer.html b/plugin/contents/ui/dancer.html
index c67898c..f6fa245 100644
--- a/plugin/contents/ui/dancer.html
+++ b/plugin/contents/ui/dancer.html
@@ -1269,14 +1269,16 @@ const TWINKLE_MAG = 4.0; // até esta magnitude a estrela cintila; acima é e
const DEG = Math.PI / 180;
window.__skyTimeOffset = 0; // debug: ms somados ao relógio p/ testar a rotação
const PLANET_SPECS = [
- [Astronomy.Body.Mercury, 'Mercúrio', [205, 190, 165]],
- [Astronomy.Body.Venus, 'Vênus', [255, 232, 180]],
- [Astronomy.Body.Mars, 'Marte', [255, 120, 82]],
- [Astronomy.Body.Jupiter, 'Júpiter', [255, 218, 170]],
- [Astronomy.Body.Saturn, 'Saturno', [238, 205, 135]],
- [Astronomy.Body.Uranus, 'Urano', [145, 225, 235]],
- [Astronomy.Body.Neptune, 'Netuno', [105, 150, 255]],
+ [Astronomy.Body.Mercury, 'Mercúrio', [205, 190, 165], 2439.7],
+ [Astronomy.Body.Venus, 'Vênus', [255, 232, 180], 6051.8],
+ [Astronomy.Body.Mars, 'Marte', [255, 120, 82], 3389.5],
+ [Astronomy.Body.Jupiter, 'Júpiter', [255, 218, 170], 69911],
+ [Astronomy.Body.Saturn, 'Saturno', [238, 205, 135], 58232],
+ [Astronomy.Body.Uranus, 'Urano', [145, 225, 235], 25362],
+ [Astronomy.Body.Neptune, 'Netuno', [105, 150, 255], 24622],
];
+const KM_PER_AU = 149597870.7;
+const MOON_RADIUS_KM = 1737.4;
let solarSystemFrame = { moon: null, planets: [] };
let skyTimeScale = 1;
let skyClockRealMs = Date.now();
@@ -1823,36 +1825,35 @@ function updateSolarSystem(date, lst, W, H, horizonPx) {
if (typeof Astronomy === 'undefined') return;
try {
const observer = new Astronomy.Observer(obsLat, obsLon, 0);
- const bodyCoordinates = body => {
- const eq = Astronomy.Equator(body, date, observer, true, true);
+ const bodyCoordinates = (body, aberration = true) => {
+ const eq = Astronomy.Equator(body, date, observer, true, aberration);
const aa = altAz(eq.ra * 15, eq.dec, lst);
const sc = skyToScreen(aa.alt, aa.az, W, horizonPx);
return { eq, aa, sc };
};
- const projectBody = body => {
- const coords = bodyCoordinates(body);
- return coords.sc ? { ...coords.sc, alt: coords.aa.alt, az: coords.aa.az } : null;
- };
-
- const moonCoords = bodyCoordinates(Astronomy.Body.Moon);
- const sunCoords = bodyCoordinates(Astronomy.Body.Sun);
+ const moonCoords = bodyCoordinates(Astronomy.Body.Moon, false);
+ const sunCoords = bodyCoordinates(Astronomy.Body.Sun, false);
const moonScreen = moonCoords.sc
? { ...moonCoords.sc, alt: moonCoords.aa.alt, az: moonCoords.aa.az }
: null;
const phase = Astronomy.MoonPhase(date);
const moonIllumination = Astronomy.Illumination(Astronomy.Body.Moon, date);
- const moonRadius = Math.max(12, Math.min(22, H * 0.0085));
- const deltaAz = (((sunCoords.aa.az - moonCoords.aa.az) % 360 + 540) % 360 - 180) * DEG;
- const moonAlt = moonCoords.aa.alt * DEG, sunAlt = sunCoords.aa.alt * DEG;
- const bearing = Math.atan2(
- Math.sin(deltaAz) * Math.cos(sunAlt),
- Math.cos(moonAlt) * Math.sin(sunAlt) -
- Math.sin(moonAlt) * Math.cos(sunAlt) * Math.cos(deltaAz)
+ const angularRadiusPx = (radiusKm, distanceAu) =>
+ Math.asin(Math.min(1, radiusKm / (distanceAu * KM_PER_AU))) / DEG *
+ (horizonPx / ALT_TOP);
+ const moonRadius = angularRadiusPx(MOON_RADIUS_KM, moonCoords.eq.dist);
+
+ /* Transformação vetorial oficial do exemplo camera.js do Astronomy
+ Engine: ângulo do limbo claro em relação ao alto do horizonte. */
+ const moonHorizontal = Astronomy.Horizon(
+ date, observer, moonCoords.eq.ra, moonCoords.eq.dec, false
);
- const brightDx = Math.sin(bearing) /
- Math.max(0.16, Math.abs(Math.cos(moonAlt))) * (W / FOV_AZ);
- const brightDy = -Math.cos(bearing) * (horizonPx / ALT_TOP);
- const brightAngle = Math.atan2(brightDy, brightDx);
+ let cameraRotation = Astronomy.Rotation_EQD_HOR(date, observer);
+ cameraRotation = Astronomy.Pivot(cameraRotation, 2, moonHorizontal.azimuth);
+ cameraRotation = Astronomy.Pivot(cameraRotation, 1, moonHorizontal.altitude);
+ const sunCameraVector = Astronomy.RotateVector(cameraRotation, sunCoords.eq.vec);
+ const brightTilt = Math.atan2(sunCameraVector.y, sunCameraVector.z);
+ const brightAngle = -Math.PI / 2 - brightTilt;
const moon = moonScreen ? {
...moonScreen,
radius: moonRadius,
@@ -1863,14 +1864,14 @@ function updateSolarSystem(date, lst, W, H, horizonPx) {
} : null;
const planets = [];
- for (const [body, name, color] of PLANET_SPECS) {
- const screen = projectBody(body);
- if (!screen) continue;
+ for (const [body, name, color, radiusKm] of PLANET_SPECS) {
+ const coords = bodyCoordinates(body);
+ if (!coords.sc) continue;
const illumination = Astronomy.Illumination(body, date);
planets.push({
- ...screen, name, color, body,
+ ...coords.sc, alt: coords.aa.alt, az: coords.aa.az, name, color, body,
magnitude: illumination.mag,
- radius: Math.max(1.8, Math.min(5.2, 3.45 - illumination.mag * 0.46)),
+ radius: Math.max(0.55, angularRadiusPx(radiusKm, coords.eq.dist)),
});
}
solarSystemFrame = { moon, planets };
@@ -1886,7 +1887,7 @@ function drawSolarSystem(c) {
const fade = extinction(moon.alt);
c.globalAlpha = fade;
c.shadowColor = 'rgba(205,220,255,0.7)';
- c.shadowBlur = moon.radius * 1.25;
+ c.shadowBlur = Math.max(2, moon.radius * 1.25);
c.translate(moon.x, moon.y);
c.rotate(moon.brightAngle);
c.drawImage(moon.texture, -moon.radius, -moon.radius,
@@ -1904,23 +1905,17 @@ function drawSolarSystem(c) {
c.save();
c.globalAlpha = fade;
c.shadowColor = `rgba(${r},${g},${b},0.95)`;
- c.shadowBlur = planet.radius * 3.2;
+ c.shadowBlur = Math.max(2.5, 5.5 - planet.magnitude * 0.45);
c.fillStyle = `rgb(${r},${g},${b})`;
c.beginPath();
c.arc(planet.x, planet.y, planet.radius, 0, Math.PI * 2);
c.fill();
- if (planet.body === Astronomy.Body.Saturn) {
- c.strokeStyle = `rgba(${r},${g},${b},0.82)`;
- c.lineWidth = Math.max(1, planet.radius * 0.34);
- c.beginPath();
- c.ellipse(planet.x, planet.y, planet.radius * 1.8,
- planet.radius * 0.62, -0.18, 0, Math.PI * 2);
- c.stroke();
+ if (showConstellations) {
+ c.shadowColor = 'rgba(4,8,20,0.95)';
+ c.shadowBlur = 4;
+ c.fillStyle = `rgba(${r},${g},${b},0.92)`;
+ c.fillText(planet.name, planet.x + planet.radius + 7, planet.y - 1);
}
- c.shadowColor = 'rgba(4,8,20,0.95)';
- c.shadowBlur = 4;
- c.fillStyle = `rgba(${r},${g},${b},0.92)`;
- c.fillText(planet.name, planet.x + planet.radius + 7, planet.y - 1);
c.restore();
}
c.restore();