From 4c6fe6faeb6eb026ab086b772bd2a59caad63302 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Sun, 13 Sep 2026 13:38:15 +0200 Subject: [PATCH] Mond-3D: Pan und Zoom ohne Blickwinkelveraenderung umsetzen Verschieben nutzt jetzt camera.setViewOffset() statt Kameraposition/-ziel zu bewegen, und Zoom erfolgt ueber camera.zoom (Brennweite) statt ueber Annaeherung der Kamera. So bleibt der Blickwinkel auf den Mond in der Standardansicht immer wie von der Erde aus - nur der freie Kamera-Modus darf ihn aendern. Co-Authored-By: Claude Sonnet 5 --- public/moonphase.php | 37 +++++++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/public/moonphase.php b/public/moonphase.php index d256783..ce576c0 100644 --- a/public/moonphase.php +++ b/public/moonphase.php @@ -596,18 +596,47 @@ function applyMoonZoom() { return; } - const r = MOON_CAMERA_BASE_Z / getMoonZoomFactor(); - if (freeCameraMode) { + const r = MOON_CAMERA_BASE_Z / getMoonZoomFactor(); moonSceneState.camera.position.set( r * Math.sin(cameraOrbitPhi) * Math.sin(cameraOrbitTheta), r * Math.cos(cameraOrbitPhi), r * Math.sin(cameraOrbitPhi) * Math.cos(cameraOrbitTheta) ); moonSceneState.camera.lookAt(0, 0, 0); + moonSceneState.camera.zoom = 1; + moonSceneState.camera.clearViewOffset(); } else { - moonSceneState.camera.position.set(moonPanX, moonPanY, r); - moonSceneState.camera.lookAt(moonPanX, moonPanY, 0); + // Kamera bleibt IMMER exakt auf den Mond ausgerichtet UND auf fester + // Distanz ("Blickwinkel wie von der Erde aus" darf sich weder beim + // Verschieben noch beim Zoomen aendern - genau wie ein Teleskop, das den + // Mond vergroessert, ohne dass sich die Erde-Mond-Distanz aendert). Zoom + // wird deshalb NICHT durch Annaehern der Kamera simuliert (das wuerde + // durch die perspektivische Projektion echte Parallaxe/Verzerrung + // erzeugen, die bei einer realen Fernbeobachtung so nicht auftritt), + // sondern rein optisch ueber camera.zoom (Brennweiten-Vergroesserung + // ohne Positionsaenderung). Das Verschieben passiert ebenfalls ohne + // Positionsaenderung, rein als Bildausschnitt-Versatz (Shift-Objektiv- + // Prinzip via camera.setViewOffset). + moonSceneState.camera.position.set(0, 0, MOON_CAMERA_BASE_Z); + moonSceneState.camera.lookAt(0, 0, 0); + moonSceneState.camera.zoom = getMoonZoomFactor(); + + const fullWidth = Math.max(1, moonCanvas.clientWidth || 900); + const fullHeight = Math.max(1, moonCanvas.clientHeight || 900); + // Der Bildwinkel-Versatz muss mit dem Zoom mitwachsen: die scheinbare + // Mondgroesse auf dem Bildschirm skaliert mit dem Zoomfaktor, sonst reicht + // der Pan-Bereich bei starkem Zoom nicht mehr aus, um den Mond bis an den + // Rand zu ziehen. + const panPixelScale = Math.min(fullWidth, fullHeight) * 0.18 * getMoonZoomFactor(); + const offsetX = moonPanX * panPixelScale; + const offsetY = -moonPanY * panPixelScale; + + if (offsetX === 0 && offsetY === 0) { + moonSceneState.camera.clearViewOffset(); + } else { + moonSceneState.camera.setViewOffset(fullWidth, fullHeight, offsetX, offsetY, fullWidth, fullHeight); + } } moonSceneState.camera.updateProjectionMatrix();