mirror of
https://github.com/bilawalsidhu/gods-eye-view.git
synced 2026-11-06 03:14:00 +00:00
fix(camera): keep the globe in view from orbit
From the whole-globe view the camera could end up facing empty space with only stars on screen. Cesium's free look (Shift+drag) turns the camera in place, and from 18,000 km the planet's edge is only about 15 degrees from nadir, so a few drags turned it out of frame. The rolled pose was then saved into the share hash, so a reload or shared link opened on stars too. - Allow free look only below 1,000 km. Orbit, tilt and zoom are unchanged. - Measure how much of the frame shows the planet's surface by casting a 32x18 grid of view rays at the WGS84 ellipsoid. While the scope mask is on (the default) only the rays inside its keyhole count, since the mask hides or dims the rest of the frame. - When a camera move ends above 1,000 km with no ray on the surface, turn straight down at the same position and heading. Limb glow and a sliver up to about one grid cell thick can count as out of view. The end of a move comes from Cesium's moveEnd and from a check of its own that samples the pose every 250 ms after moveStart and acts once it has held for half a second: at some of these poses the camera drifts by a rounding error every frame, so Cesium never sees it stop and never raises moveEnd. The zoom-out guard from #1522 keeps wheel and pinch zoom-outs in view; this catches the other ways a move can end looking away, such as a saved or shared view that did, or a drag that Cesium turns into an in-place look below its 7,500 km trackball height (one that starts on the stars, or a tilt drag with the screen centre off the planet). Views with more surface, tracked or locked cameras and the 2D and Columbus modes are left alone. - Voice tilt and in-place turns of a free 3D globe camera above 1,000 km stop when about a tenth of the frame still shows the planet (or about as much as it showed when it started, two grid cells of sampling noise allowed), never below about 1% of the visible frame; a view that already shows less only keeps or gains what it has. A turn that cannot go half a degree further without crossing that limit is refused with a reason instead of reported as done, and a turn it accepts turns at least that half degree. A turn that keeps or gains surface is not refused, even after the window has been resized, except that near the limit, where the planet's edge crosses the sample grid, sampling wobble can occasionally refuse one (most often above about 15,000 km and on phone or ultrawide frames); nothing then turns away from the planet. A turn that starts where the last voice turn left the camera keeps that turn's limit, or a higher one if the planet now fills more, so repeating the request does not take any more; once anything else has moved or turned the camera, a turn is measured from what is on screen. A request made while the camera is tracked is judged by the pose voice's release of the follow camera will leave, before that release, so a refused turn keeps the tracking. The frame measure and the look-step limit live in src/globeInView.js, shared by the viewer and the voice camera verbs.
This commit is contained in:
1 parent
1facc09f8d
commit
99520b529c
8 files changed
+1491
-5
No files matched your search
@@ -65,6 +65,46 @@ settling. Oblique views below 300 km are left alone.
|
||||
`QA_BASE_URL=http://localhost:4173 node scripts/qa-zoom-out-guard.mjs` exercises
|
||||
the real browser controller at desktop and phone widths with keyless fixtures.
|
||||
|
||||
Cesium's free look (Shift+drag, which turns the camera in place) works only
|
||||
below 1,000 km. Above that height a few drags could turn the whole planet out of
|
||||
frame and leave only stars, so Shift+drag does nothing there. Orbit, tilt and
|
||||
zoom are unchanged at every height. How much of the frame shows the planet's
|
||||
surface is measured by casting a 32×18 grid of view rays at the ellipsoid; while
|
||||
the scope mask is on (the default) only the rays inside its keyhole count, since
|
||||
the mask hides or dims the rest. Voice tilt and in-place turns of a free 3D
|
||||
camera above 1,000 km stop when about a tenth of the frame still shows the
|
||||
surface (or about as much as it showed when it started), never less than about
|
||||
1% of the visible frame, and a view that already shows less only keeps or gains
|
||||
what it has. A turn that cannot go half a degree further without crossing that
|
||||
limit is refused with a reason instead of reported as done, and a turn it
|
||||
accepts turns at least that half degree. A turn that keeps or gains surface is
|
||||
not refused, even after the window has been resized, except that near the limit,
|
||||
where the planet's edge crosses the sample grid, sampling wobble can
|
||||
occasionally refuse one (most often above about 15,000 km and on phone or
|
||||
ultrawide frames); nothing then turns away from the planet. A turn that starts
|
||||
where the last voice turn left the camera keeps that turn's limit, or a higher
|
||||
one if the planet now fills more, so repeating the request does not take any
|
||||
more; once anything else has moved or turned the camera, a turn is measured from
|
||||
what is on screen. When a camera move ends above 1,000 km with no ray on the
|
||||
surface, the camera turns straight down at the same position and heading. The
|
||||
end of a move is taken from Cesium's move-end event and from a check of its own
|
||||
that samples the pose every 250 ms after a move starts and acts once it has held
|
||||
for half a second, because at some of these poses the camera drifts by a
|
||||
rounding error every frame and Cesium never sees it stop. That check keeps
|
||||
watching until move-end arrives, recovering once after each move that comes to
|
||||
rest, and gives up five minutes after the camera last moved. Limb glow, and a
|
||||
surface sliver up to about one grid cell thick (some 50 px on a 900 px tall
|
||||
frame), can count as out of view. The zoom-out guard above keeps wheel and
|
||||
pinch zoom-outs in view; this catches the other ways a move can end looking
|
||||
away, such as a saved or shared view that did, or a drag
|
||||
that Cesium turns into an in-place look below its 7,500 km trackball height (one
|
||||
that starts on the stars, or a tilt drag with the screen centre off the planet).
|
||||
Views with more surface than that, such as the oblique orbital Director shots,
|
||||
are left as they are, and so are tracked or locked cameras and the 2D and
|
||||
Columbus modes. A voice turn requested while the camera is tracked is judged
|
||||
by the pose voice's release of the follow camera will leave, before that
|
||||
release, so a refused turn keeps the tracking.
|
||||
|
||||
Analyst region queries resolve unique Natural Earth names offline without
|
||||
geocoding, so Gold Coast and Ivory Coast name the West African natural regions.
|
||||
Duplicate names require a geocoded containment anchor; when several entries for
|
||||
|
||||
Reference in new issue
Block a user