CLI, along with several examples, plus model downloading

This commit is contained in:
connor committed 2026-10-14 18:01:49 -04:00
1 parent 4f9e73a418
commit 51ace681a7
22 files changed
+1804 -18

No files matched your search

+35 -2
View File
@@ -371,6 +371,28 @@ its triangles. That is what M5's ray tracer does, because following rays
gives exact shadows and light bouncing between surfaces. Rasterization can
only approximate those, for example with the shadow maps planned for M2.
### One sample per pixel
Both techniques decide each pixel's value from one point, the pixel's
center. A real pixel collects light over its whole area, about 5.5 um
square on the detector. Where a pixel straddles an edge, say half on a
sunlit panel and half on dark space, the real pixel reads about half the
panel's value. The renderer reads either the full value or none, depending
on which side the center falls.
This shows in two ways. Edges are stair-stepped instead of graded. And
anything thinner than a pixel, like the booms of the example satellite seen
from 40 m, breaks into dashes, because only some pixel centers land on it.
For an algorithm that finds edges or measures brightness at sub-pixel
precision, the graded edge is the signal, so this matters for limb
navigation and pose estimation.
The usual fix is supersampling: shading several points inside each pixel
and averaging. The GPU's multisampling hardware does this cheaply for
rasterized edges. Sampling the bodies' limbs needs it in the ray casting
shader. The lens blur that comes with the point spread function (M3) also
spreads every edge over a few pixels.
## Earth, Moon and Sun
Code: `bodies.rs`, `gpu/bodies.rs`, `shaders/bodies.wgsl`.
@@ -453,8 +475,18 @@ or for anything in the near infrared, where the red value simply continues.
For absolute radiometry of a real spacecraft, give the important materials
measured reflectance spectra (M4 adds those, and BRDFs).
Texture images are not used yet; each material renders with its base color
value alone. The loader removes textures before reading a glTF file, so a
model still loads when its textures are in a format or file the loader cannot
read. A model that relies on textures for its colors (one material with a
painted image) renders in that material's flat base color, often gray.
STL has no units. CAD tools usually export millimeters, so loading a CAD
model usually needs `scale: 0.001`. glTF is always meters.
model usually needs `scale: 0.001`. glTF is meters by its specification, but
models in the wild do not always follow it: of the NASA example models,
Landsat 8 and ICESat-2 are in meters, while the SSL-1300 needs a scale of 0.1
and ACE about 0.005. Checking a model's size against the real spacecraft's is
worth the minute it takes.
## Drawing the target
@@ -535,6 +567,7 @@ velocity as an input, which the scene does not carry yet.
| Earthshine on the Moon's night side | M4 |
| Shadows the target casts on itself | M2 |
| The Sun as a disk that is darker toward its edge (limb darkening) | M2 |
| Pixel-area sampling (anti-aliasing): graded edges, thin parts | M2 |
| Lens distortion | M3 |
| Blur from diffraction and lens imperfections (point spread function) | M3 |
| Noise: photon shot noise, read noise, dark current, pixel-to-pixel variation | M3 |
@@ -543,4 +576,4 @@ velocity as an input, which the scene does not carry yet.
| Earth and Moon albedo maps | M2 |
| Earth's atmosphere: scattering, the bright limb | M4 |
| Motion blur, rolling shutter, stray light | M6 |
| Apparent positions: light time and aberration | not yet planned |
| Apparent positions: light time and aberration | M3 |