# 天体运动与外形模型

2026-09-15。目录包含 58 个天体，其中 43 颗为卫星。以下说明当前实现及其限制，完整改造和发布验收仍在进行。

2026-09-15 数据补齐轮次改动了外形、环系、环的反射率与相函数四项，每一项的来源、检索日期与残留近似都写在对应小节；
来源质量审计（轨道与自转、程序示意地标、大气与云层）另见[来源审计](SOURCE_AUDIT.md)。

## 唯一物理定义与显示变换

基础值和模型选择集中在 `src/physics/body-definitions.json`。每个天体分别记录半径的类型、单位、来源、不确定性（已知时）、观测历元或静态摘要声明，以及轨道与自转的来源、历元和适用范围。`physical-scale.js` 和 `physics/definitions.js` 仅提供派生接口；IAU 系数和年份星历是被引用的独立模型系数包。来源快照的 SHA-256 保存在定义文件，SBDB 解编号和检索日期同时保留。

`data.js`、`additional-bodies.js` 不再保留旧自转速度、倾角、圆轨道周期或人工初始相位。资料卡从物理定义生成半径、参考周期、半长轴和带参考平面名称的倾角。尺寸类型不会一律写成“平均半径”。显示半径、距离缩放和形状轮廓另行配置，不能反推物理公里数。

同一模拟日期由 `physics/state.js` 生成公里尺度、日心 J2000 赤道坐标的位置、速度和姿态；总览与九个地表共同读取。总览单独缩放各系统的距离，保留方向、相位和偏心率带来的远近变化。冥王星共同质心的太阳轨道与冥王星—卡戎内部位移分别缩放。光照取每个天体真实位置指向太阳的方向。固定全景、程序大气、曝光和夜侧补光不等于精密辐射或实时地形阴影模型。

## 半径与轮廓

| 对象 | 采用值与定义 | 来源及限制 |
| --- | --- | --- |
| 太阳 | 695700 km，采用球面半径 | [NAIF PCK00011](https://naif.jpl.nasa.gov/pub/naif/generic_kernels/pck/pck00011.tpc) 的 BODY10_RADII；不是同期光球测量。 |
| 八大行星、冥王星、谷神星 | JPL 列报半径 | [JPL 行星表](https://ssd.jpl.nasa.gov/planets/phys_par.html)。地球 6371.0084 km 与 PCK 椭球的 (2a+c)/3 一致，明确记作算术平均半径，避免误称严格体积等效值。其它采用球面/体积等效摘要，不是局部地形高度。 |
| JPL 表内 40 颗卫星 | 体积等效半径及表列不确定性 | [JPL 卫星表](https://ssd.jpl.nasa.gov/sats/phys_par/)，逐项保留 WGCCRE 2015、Nimmo 2017 或 Stern 2018 引用。 |
| 灶神星 | 261.385±0.05 km，SBDB 有效直径的一半 | [Park 等，2025](https://www.nature.com/articles/s41550-025-02533-7)；有效直径 522.77±0.10 km，经 [SBDB](https://ssd-api.jpl.nasa.gov/sbdb.api?des=4&phys-par=1&full-prec=1) 获取。显示椭球按其三轴尺寸归一化。 |
| 鸟神星 | 714±7 km，推定等效半径 | JPL 引用 [Brown，2013](https://arxiv.org/abs/1304.1041) 的掩星与形状模型；依赖先验，非完整三维测绘。 |
| 妊神星 | 约 797.5 km，推定体积等效半径 | [Ortiz 等，2017](https://arxiv.org/abs/2006.03113) 的半轴 1161、852、513 km 的几何平均；不再沿用与此轮廓不一致的旧 816 km。 |
| 阋神星 | 1163±6 km，掩星球形拟合半径 | [Sicardy 等，2011](https://www.nature.com/articles/nature10550)，2010-11-06 掩星；不是逐经纬测量。 |
| 妊卫一 | 185±10 km，推定体积等效半径 | [2025 年掩星论文](https://www.nature.com/articles/s41467-025-65749-1)，2021 年两次掩星与测光。半轴统计摘要 240、180、143 km 仅用于轮廓，不以其乘积替代论文的等效直径统计值。 |
| 妊卫二 | 约 80 km，假设密度的数量级估计 | [Ragozzine 与 Brown，2009](https://arxiv.org/html/0903.4213v1)；质量与密度不确定性大，没有形状测量。 |
| 阋卫一 | 350±57.5 km，热辐射等效半径 | [Bernstein 等，2023](https://arxiv.org/abs/2303.13445) 引用 Brown & Butler 2018 的 700±115 km 直径；依赖热模型。 |

妊神星和妊卫一的模型绕椭球最短轴旋转。妊神星窄环位于采用的赤道面，尺寸约为最长半轴两倍，环宽和补光作说明过的显示增强。Atlas 与 Pan 的赤道隆起及其它不规则轮廓仍是近似几何；显示半径包围最长轴，不声称显示网格与物理球面等体积。地标锚点、降落落点与环影交点按同一轮廓计算，扁平天体的标记不会浮在压扁后的极区上方。三颗新增矮行星卫星继续共享现有艺术纹理，没有新增实测地表。

### 着陆天空与总览共用同一份轮廓与贴图

2026-09-16 修正。着陆天空里的天体一度是自己的另一套：球体网格、均匀缩放、按落点写死的贴图路径。
于是同一颗土星在总览里是实测椭球、在土卫二天上是正球；冥王星与冥卫一在总览用
`completed/`、`repaired/` 的成品图，在落点天空却还指向更早的 2k jpg——重采样后逐像素平均差
41.6/255、相关系数 0.52，是两张不同的底图，不是分辨率差异。

现在两边取同一份定义：

- **轮廓**：`surface/surface/SurfaceSky.js` 的 `skyGlobeGeometry` 调用与总览相同的
  `createBodyGeometry`，形状来自 `body-models.js` 的实测三轴半轴；有赤道脊的天体同样按脊的
  雅可比处理法线。木星与土星因此在落点天空里也是扁的（土星极/赤道 0.902，实测圆面比例
  0.874 ± 测量偏差）。
- **贴图**：`body-textures.js` 的 `bodyTexturePath` 给出目录条目的起始贴图键，总览的
  `baseKey` 与落点天空的主星贴图都取自它；总览选中后升级到 `high`，落点天空只用这一级，
  这是分辨率取舍而不是两张图。名称大小写在此归一，落点的 `parent` 字段可以直接传显示名。
- **其余天体**：视直径超过 0.08° 的邻居（木卫三、土卫六等）同样按上面的键加载贴图，
  不再画成灰球；太阳也使用自己的贴图，而不是纯白圆面。
- **夜侧**：地球的夜间灯光是展示增强（真实性标准允许的「夜侧补光」），但它同样只有一份定义：
  `earth-night.js` 给出晨昏带宽度、城市阈值与亮度，总览与落点天空都从这里取。此前落点天空
  只用昼面贴图，月球上看地球夜面是纯黑，而总览是亮的。实测：月球落点在 8× 下可见地球昼面
  与暗面上的城市灯光。
- 落点数据里不再保留 `parentTexture` 字段：这个字段本身就是分叉的来源。

`tests/surface-sky-bodies.test.js` 按天体模型核对轮廓比例、按目录核对贴图键，并检查落点天空
的环取自同一份实测分区与同一套光度学。

### 显示轮廓的三轴半轴

2026-09-15 起，显示网格的扁率不再由人工写死。物理定义的 `radius.semiAxesKm` 记录三轴半轴，
`body-models.js` 把它转成 Three.js 的显示比例 `[1, c/a, b/a]`，其中 Y 轴是自转轴，`a ≥ b ≥ c` 且
`c` 为最短轴。这样网格、地标锚点、降落图钉和环影共用同一份来源数据；
`body-models.test.js` 里的 “every display silhouette is taken from a sourced set of semi-axes”
逐项核对比例、来源键、检索日期与网格包围盒，并在缺少来源时直接失败。

| 组 | 半轴来源 | 检索日期 | 记录数 |
| --- | --- | --- | --- |
| 八大行星、月球、谷神星、木卫一至四、土卫一至九、天卫一至五、海卫一、冥卫一、火卫一、火卫二、木卫五、木卫六、木卫十四至十六、土卫十、土卫十一、土卫十六至十八、海卫八 | [NAIF PCK00011](https://naif.jpl.nasa.gov/pub/naif/generic_kernels/pck/pck00011.tpc) 的 `BODYnnn_RADII` | 2026-09-15 | 48 |
| 冥卫二、冥卫三、冥卫四、冥卫五 | [Weaver 等，2016](https://arxiv.org/abs/1604.05366) 表 2 的三维椭球直径之半 | 2026-09-15 | 4 |
| 妊神星 | [Ortiz 等，2017](https://arxiv.org/abs/2006.03113) 的掩星与光变联合三轴拟合 | 2026-09-15 | 1 |
| 灶神星 | [Park 等，2025](https://www.nature.com/articles/s41550-025-02533-7) 经 [SBDB](https://ssd-api.jpl.nasa.gov/sbdb.api?des=4&phys-par=1&full-prec=1) 获取 | 2026-09-14 | 1 |
| 妊卫一 | [Fernández-Valenzuela 等，2025](https://www.nature.com/articles/s41467-025-65749-1) 的掩星三轴椭球拟合 | 2026-09-15 | 1 |

PCK00011 按体固坐标 X、Y、Z 排列三轴半径，Z 为自转轴。该报告给三个相等半径即表示它按球面采用，
不表示测量到了正球；此类天体（木卫三、木卫四、天卫二至四、海卫二、海卫一、冥卫一、月球、
金星的**形状**）照球面渲染，并在条目里写明没有可用的三轴测量。

**判定标准里的行星扁率**按同一来源列出，赤道半轴与极半轴单位均为千米：

| 天体 | 赤道 / 极 | 极轴/赤道轴 | 扁率 | 处理 |
| --- | --- | --- | --- | --- |
| 土星 | 60268 / 54364 | 0.90204 | 9.80% | 已渲染 |
| 木星 | 71492 / 66854 | 0.93513 | 6.49% | 已渲染 |
| 天王星 | 25559 / 24973 | 0.97707 | 2.29% | 已渲染 |
| 海王星 | 24764 / 24341 | 0.98292 | 1.71% | 已渲染 |
| 火星 | 3396.19 / 3376.20 | 0.99411 | 0.59% | 已渲染 |
| 地球 | 6378.1366 / 6356.7519 | 0.99665 | 0.34% | 已渲染 |
| 水星 | 2440.53 / 2438.26 | 0.99907 | 0.093% | 不做 |
| 金星 | 6051.8 / 6051.8 | 1 | 0 | 不做 |

水星与金星按可忽略处理：水星扁率 0.093%，小于本目标的 0.1% 门槛；金星的 PCK 条目本身就是等半径。
两者都保留三轴半轴记录与来源，只是显示比例落在 1 上，因此不额外压扁网格。
2026-09-15 前的规划草稿把海王星记为 0.984、火星记为 0.9959，与 PCK00011 的 0.98292 与 0.99411 不符；
本表以 PCK00011 为准，草稿的数字不再采用。

**残留近似（明确标注）**：显示半径始终是体积等效半径，本项只按比值压扁网格，因此扁平天体的
渲染赤道半轴等于体积等效半径而不是实测赤道半轴，例如土星渲染赤道为 58232 km、实测赤道为 60268 km。
扁率比值本身是实测值，几何比例正确，绝对尺寸不是。两者不是同一物理量，不能互相换算。
此外：PCK00011 对火卫一只给 13.0 / 11.4 / 9.1 km，比 Horizons 2025 年修订的 13.1 / 11.1 / 9.3 km 旧；
海卫八给 218 / 208 / 201 km，NASA 资料表给 220 / 208 / 202 km；木卫十五的形状只有三到五像素，
NASA 与文献都把它称为粗略估计。Hyperion（确定性翻滚示意）与冥王星四颗小卫星（非同步自转、
极轴与冥王星—卡卫一极轴近乎正交）的自转轴与最短半轴并不对应，这里的 Y 轴分配只是显示约定，
不能读成真实自转轴方向。**没有三轴来源的天体**：鸟神星、阋神星沿用推定等效半径的球面摘要；
阋卫一只有热辐射等效半径；妊卫二没有任何形状测量，其显示比例 `[1, .82, .9]` 在 `body-models.js`
里标记为 `shapeEstimated: true`，是唯一的推定轮廓。

## 轨道、参考平面与时标

核心 19 个天体沿用 Astronomy Engine 2.1.19 与 [随站 JPL 年份星历](../ephemeris/README.md)。1900—2100 内必要星历缺失会暂停相关观测并提供重试；范围外明确标注近似。1971 仍是新会话默认日期。

其余 39 个天体采用固定平均椭圆：

- 31 颗卫星采用 [JPL 平均元素表](https://ssd.jpl.nasa.gov/sats/elem/) 的 a、e、ω、M、i、node、历元与参考平面。公转周期另按下段记录。拉普拉斯面使用表列 ICRF 极轴，黄道面使用 NAIF ECLIPJ2000，主星赤道面固定在元素历元。海卫二采用表列 2020 历元及 e=0.751；不再放在任意主星赤道圆上。倾角大于 90° 本身决定逆行，不再重复反转相位。
- 谷神星、灶神星、鸟神星、妊神星、阋神星采用 2026-09-14 保存的 [JPL SBDB](https://ssd-api.jpl.nasa.gov/doc/sbdb.html) 密切元素，历元 JD 2461200.5 TDB。省略摄动的固定椭圆与 JPL 完整轨道解不同。
- 妊卫一和妊卫二采用 Ragozzine 与 Brown 2009 表 2 的历元元素。论文 HJD 2454615.0 近似作为 TDB 历元，未恢复原观测时标修正；不能用作绝对相位预报。妊卫二真实非开普勒演化在数周内已重要，此处不复现论文的三体积分。
- 阋卫一采用 [Holler 等，2021](https://arxiv.org/html/2009.13733v1) 表 2 的联合拟合，J2000 赤道面；ω=近点经度−节点经度，M=平均经度−近点经度。论文 JD 历元近似作为 TDB，未重新拟合观测时标/光行时。

**这些平均模型不包含节点和拱线进动、摄动或真实交会预报。** 参考周期用于固定椭圆传播或目录摘要，不能当作核心星历在任意日期的瞬时周期。NAIF ECLIPJ2000 的黄赤交角 84381.448 角秒与 Astronomy Engine 的新黄道辅助变换相差约 0.042 角秒；来源为 JPL/NAIF 的平均元素采用前者，输出后共同处于 J2000 赤道坐标。

周期的 `periodSource`、`periodType`、`periodEpochTdbJd` 和 `periodValidity` 与轨道元素来源分开。29 颗卫星的目录周期采用 NASA NSSDCA 的[木星](https://nssdc.gsfc.nasa.gov/planetary/factsheet/joviansatfact.html)、[土星](https://nssdc.gsfc.nasa.gov/planetary/factsheet/saturniansatfact.html)、[天王星](https://nssdc.gsfc.nasa.gov/planetary/factsheet/uraniansatfact.html)、[海王星](https://nssdc.gsfc.nasa.gov/planetary/factsheet/neptuniansatfact.html)资料表；例如 Io 1.769138 天、Europa 3.551181 天。NASA 摘要未给周期的独立历元与误差，不能把它当成 JPL 元素历元的拟合参数。Himalia、Phoebe、Nereid 保留较新 JPL 平均轨道来源的周期，未用较早目录值覆盖。其余周期沿用各自注明的来源。

这项选择处理了 JPL 平均元素表中部分 P 与目录周期的明显差异，但没有重新拟合进动轨道，亦未断言差异必为网页错误。固定椭圆用采用的公转周期近似推进，绝对相位仍不作预测；核心 19 个天体的位置不依赖这列目录周期。IAU 自转系数不因周期摘要而改写，不能为了同步外观强行令两者相等。`scripts/adopt-satellite-periods.py` 从四份原始 HTML 快照重建这项选择。

Janus 与 Epimetheus 真实轨道约四年交换，但当前平均模型未模拟相互引力。已删除将数千公里任意径向摆动写入物理状态的旧马蹄形动画，不再用它证明物理避碰。放大的示意模型可能重叠，不能据此判断实际碰撞。真实共轨道演化需要另用轨道星历或经过校准的动力学模型。

## 独立姿态与跟随

34 个适用的卫星及小天体使用 PCK00011 极轴、经线与周期项；包括 Mars 卫星相位中的二次项。周期来自姿态系数，自转不继承公转逆行标志。Phoebe 按 IAU 极轴独立自转，Triton 按负经线速率转动。月球和主要行星继续保留 Astronomy Engine；地球采用 GAST 和 EQD→J2000 岁差章动，UT1≈UTC、无极移。未额外添加未建模的非刚体物理天平动。

适用范围按天体传入运行时说明。例如 [Horizons 的土卫十一摘要](https://ssd.jpl.nasa.gov/api/horizons.api?format=json&COMMAND=611&MAKE_EPHEM=NO&OBJ_DATA=YES)明确限制其 IAU 极轴/经线模型在 1981 年旅行者飞掠附近使用；其它日期仅作外推示意，不能声称卡西尼时代的地标朝向已获校准。

其余 13 个平均姿态保留边界：鸟神星采用 22.8266 小时双峰解；妊神星采用 3.915341 小时及 2017 掩星环极轴优选解；妊卫一采用 9.68±0.02 小时，并近似与妊神星极轴平行。阋神星采用约 15.7859 天现代同步结果；Himalia 以 7.7819 小时会合周期作近似；Nereid 采用 11.594 小时。来源逐项列在物理定义中。未知极轴、未校准经线以及假定同步的 Namaka/Dysnomia 明确注明；Hyperion 与冥王星四颗小卫星仅作确定性的非规则翻滚示意，不预测混沌朝向。

镜头“跟随自转”只改变相机，不冻结天体。旧 lockSpin 会话迁移为镜头跟随，模型旋转角弃用；日期、速度、选择和正放/倒放与地表共享。

## 土星环影与环的光学厚度

环网格与它投下的影共用同一份光学厚度剖面，因此环缝位置、环的透明度和影的条带互相对齐。
**τ 现在是公里级实测剖面**，不再是逐环范围的中值：`src/ring-tau-profile.json` 每个公里一个值，
由 `scripts/build-ring-tau-profile.mjs` 从 PDS 数据集的掩星剖面生成，见[公里级光学厚度剖面](#公里级光学厚度剖面)。

本节数字的来源与检索日期：

| 用途 | 来源 | 检索日期 |
| --- | --- | --- |
| 公里级 τ(r) 剖面 | [PDS 环月系统节点 COUVIS_8001](https://opus.pds-rings.seti.org/holdings/volumes/COUVIS_8xxx/COUVIS_8001/data/UVIS_HSP_2008_210_BETCEN_E_TAU01KM.TAB)（卡西尼 UVIS 恒星掩星，1 km 分辨率） | 2026-09-15 |
| 环边界半径与 τ 范围（现只用于 D 环与命名地标） | [PDS 环月系统节点《土星环系重要参数》](https://pds-rings.seti.org/saturn/saturn_rings_table.html) | 2026-09-15 |
| 可见光背散射不对称度 g = −0.30（B 环，620 nm，粒子级） | Lumme, Irvine & Esposito 1983, Icarus 53, 174（经 Salo & Karjalainen 2003, Icarus 164, 428 转引） | 2026-09-15 |
| 冲效应半高半宽约 0.1°（BVRI） | French 等 2007, PASP 119, 623 | 2026-09-15 |
| 冲效应振幅：C 环约 0.6、B 环约 0.4、恩克缝外 A 环约 0.7 | 同上，逐环列的指数振幅/线性背景 | 2026-09-15 |
| 环粒子红/蓝几何反照率 0.61±0.04 / 0.41±0.03（B 环，620/450 nm） | Lumme, Irvine & Esposito 1983, Icarus 53, 174 | 2026-09-15 |
| C 环与卡西尼环缝比 A、B 环更偏中性；A 环比 B 环更红 | Estrada & Cuzzi 1996, Icarus 122, 251 与 Estrada, Cuzzi & Showalter 2002, Icarus 166, 212（勘误版） | 2026-09-15 |
| 单次散射反照率 C 环 0.1、B 环 0.6（**338 nm 紫外**） | French 等 2007, PASP 119, 623 §3.3 | 2026-09-15 |
| A 环邦德反照率约 0.5（内、中部 A 环） | Dones, Cuzzi & Showalter 1993, Icarus 105, 184 | 2026-09-15 |
| 半无限保守极限的 H(1) = 2.90781 | Chandrasekhar, *Radiative Transfer*（1960）H 函数表 | 教科书常数，未逐版核对版次 |

本轮核对来源时发现并修正的两处标注问题：

1. 旧文档把 A 环的 0.5 归给 Doyle 等 1989。Doyle, Dones & Cuzzi 1989（Icarus 80, 104）实际是**外侧 B 环**的辐射传输建模，
   给的是 B 环粒子在 0.49 µm 的反照率 0.54–0.58。A 环内、中部约 0.5 的邦德反照率出自 Dones 等 1993，已改正。
2. 旧文档把 C 环 0.1 至 B 环 0.6 引作普通反照率。French 等 2007 的这一对数值标明在 **338 nm**，
   属紫外；可见光逐环的单次散射反照率在可检索到的来源里没有干净给出，因此保留原值但标明波段。

- **不透明度**：环的 alpha 为 1 − exp(−τ/μ)，μ 是视线与环面法线的夹角余弦。环缝让阳光通过，也让背景透出。
- **亮度**：用平面平行粒子层含多次散射的反射率，见下节。阴影射线以云顶实际位置为起点并按扁球轮廓判断本影；太阳圆面的半影按真实视半径积分。
- **几何自洽的结果**：环面穿越日前后 μ₀ → 0，环系随之暗到几乎不可见，而不是保持正视角的亮度。这与环面穿越时环系难以观测的实际情形一致。

### 环的多次散射

2026-09-15 起，环的亮度不再包含任何显示标定常数。原来那个 `uRingExposure = 10` 已经删除。

模型是平面平行、均匀、各向同性散射的粒子层，用离散纵标法数值求解传输方程，再按 Chandrasekhar 有限大气精确解的形式写出出射反射率：

    I/F = μ₀/(μ+μ₀) · [ K(μ,μ₀) + (w/4)·S·(P(α) − 1) ]
    K(μ,μ₀) = X(μ)X(μ₀) − Y(μ)Y(μ₀)，S = 1 − exp(−τ(1/μ + 1/μ₀))

第一项是保留真实 Henyey-Greenstein 相函数的单次散射，其余是多次散射。求解器在
`src/ring-scattering-solver.js`，解好的表在 `src/ring-scattering.json`（由
`scripts/build-ring-scattering.mjs` 生成，15 个环区各一行）。**注意这里没有参考实现可以照抄**：
X 与 Y 本身不写进表里，写入的是 K 的秩二谱分解的两个因子——它们与真实 X、Y 相差一个共同的旋转，
而旋转不改变 XX₀ − YY₀。这样每个环区只需两个数而不是一张方表。

数值校核（`ring-multiple-scattering.test.js`）：

| 校核 | 依据 | 结果 |
| --- | --- | --- |
| 光学薄极限 | 解析单次散射式 | 与解析值差 < 3%（差值是 O(τ) 的二阶项，不是误差） |
| 半无限保守极限 | Chandrasekhar 公布的 H(1) = 2.90781，法向入射出射 I/F = H(1)²/8 = 1.05690 | τ=600 时得 1.0419，差 1.4% |
| 能量守恒 | 保守层反射 + 透射 + 直射束 = 1（解析恒等式） | 步长 0.01 时 0.992，随步长减半趋近 1 |
| 互易性 | μR(μ,μ₀) = μ₀R(μ₀,μ) | 相差 < 1e-9 相对 |
| 秩二结构 | K 只有一个正、一个负本征值 | 残差 ≤ 0.9%（最差一区 0.8%） |
| 与源表一致 | 重新求解与 `ring-scattering.json` 逐项比较 | 一致到 1e-4 相对 |

**残留近似（明确标注）**：

- **多次散射按各向同性处理**，即标准的各向同性多次散射近似。真实环粒子的多次散射同样偏背散射，
  因此本模型在背散射几何下偏低。这是本项最主要的残留近似，量级未单独标定。
- 求解器用一阶迎风格式，**通量有约 0.5%–1% 的离散亏损**（能量校核实测 0.992 而非 1.000），
  随步长减半趋近 1。表按 τ 步长 0.01、16 个方向求解；掠射角（μ < 0.021，即环区最外侧的角度格点）
  的单格误差最大，渲染上影响很小。
- 单次散射反照率仍是 **338 nm 紫外**的逐环值，A 环用的是**邦德**反照率：公式要的是可见光单次散射反照率，
  两者都不是。可见光逐环单次散射反照率在可检索来源里没有干净给出，本次没有换源，只把波段与定义写明。
- 相函数的宽分量仍是**单参数 Henyey-Greenstein**。g = −0.30 是 B 环的粒子级可见光值，套用到全部环区；
  文献同时给出的是 B 环**风化层颗粒**的 g = −0.50（672 nm），两者不是同一个量，
  本实现取粒子级值以匹配平面平行粒子层的设定。

### 环的相函数与粒子颜色

相函数分两部分：一条平缓的宽曲线（Henyey-Greenstein，可见光粒子级 g = −0.30）叠一个很窄的冲效应，
冲效应振幅逐环区取自 French 等 2007 的拟合，半高半宽 0.1°：

    P(α) = P_HG(α; g) + A·exp(−α·ln2 / HWHM)

冲效应乘在**总反射率**上，而不是只乘单次散射项——因为 French 等 2007 的振幅就是相对总 I/F 的线性背景测得的。
逐环区振幅：C 环 0.6、B 环 0.4、恩克缝外 A 环 0.7 为实测；D 环取 C 环锚点、卡西尼环缝取 C 与 B 之间、
环缝与外环稀薄区取相邻值，这三类在 `ring-optical-depth.js` 里注明为插值。振幅顺序（C > B，外 A 最大）
本身是实测结论，回归测试固定了它。

环粒子颜色现在是**逐环区的实测红/蓝比值**，不再是统一底色。输入只有一个数：红波段与蓝波段的反射率之比，
模型由它构造颜色向量（归一到红通道，绿通道取两端平均），因此没有任何一个通道是凭空加的。

| 环区 | 红/蓝比值 | 依据 |
| --- | --- | --- |
| B 环 | 1.49 | Lumme, Irvine & Esposito 1983（Icarus 53, 174）：B 环粒子几何反照率红 0.61±0.04、蓝 0.41±0.03 |
| A 环（含外 A 环、环缝与外环稀薄区） | 1.49 | 同一量测；Estrada 等 2002 称 A 环在 6°–14° 相位间比 B 环更红，取「不比 B 环淡」的保守值 |
| C 环、卡西尼环缝（含其中的窄环） | 1.0 | Estrada & Cuzzi 1996 与 2002 勘误版：C 环与卡西尼环缝比 A、B 环更偏中性 |
| D 环 | 1.0 | 取 C 环值，插值 |

原来的环底色是手工选的十六进制值乘上环贴图的 RGB——该贴图 RGB 的径向变化与任何实测量都不相关，
因此本项不再用贴图取色，只保留它作为资源加载。回归测试固定了比值本身、由比值构造的颜色向量，
以及「B 环比 C 环红、A 环不比 B 环淡」这个实测顺序在锚点表与 400 个公里级区域里都保留下来。

**残留近似**：C 环与卡西尼环缝的**比值大小是取定的**（中性 1.0），只有方向是实测——
可检索到的可见光逐环比值都以图的形式给出，没有数值表（Cuzzi 等 2002、Filacchione 等 2014、
Hedman 等 2013 均未取到数值）。A 环取与 B 环相同也是保守处理，实测只说它「至少一样红」。
另外颜色只按环区分，同一条环内部的颜色变化没有进去。

卡西尼 ISS 的相位曲线（Déau 等 2013, Icarus 226, 591）给出冲效应半高半宽约 0.25°，是法国团队 0.1° 的 2.5 倍；
两篇都属公开测量且互相矛盾，本实现取 French 等 2007 的 BVRI 值并在文档写明分歧，未做折中。

**显示后果（照实记录）**：环的**物理反射率**比改动前低约 5 倍——改动前是「单次散射 × 10」，
那个 10 让 B 环的 I/F 达到 0.75，比任何真实环都亮；现在同一几何下 B 环 I/F ≈ 0.147。
但**屏幕上的环反而比 2026-09-13 的验收状态亮约 2.4 倍**，因为改动前环的底色是手选的十六进制值
乘上环贴图的 RGB，在线性空间里只有约 0.03，而现在是实测粒子颜色的约 0.85，相差近 30 倍；
两个变化方向相反，净效果是变亮。这两个数字来自同一视角、同一日期下的框内量测。

判断依据不是这些亮度数字，而是**相对行为**：环与环之间的对比、相位角依赖、环缝与环面穿越的消失
都由光学厚度和角度算出，并由 `ring-multiple-scattering.test.js` 的解析校核固定。
渲染器的色调映射没有按绝对光度标定，屏幕亮度不是光度陈述；若要恢复观感，
应当调整的是有说明的场景曝光（`REALISM_STANDARD.md` 允许有说明的曝光调整），
而不是再往环的反射率里塞一个常数。

**一处更正**：本节早先把「去掉显示标定常数后环暗 7–8 倍」写了进来，那个量测复现不出来
（同一次改动前后两次运行给出完全相同的数字，说明读到了陈旧图像），已按上面可复现的量测改写。

### 公里级光学厚度剖面

2026-09-15 之前 τ 是逐环范围的中值，每环内部是平的。现在整条剖面来自一次卡西尼 UVIS 恒星掩星：
PDS 数据集 `COUVIS_8001` 的 `UVIS_HSP_2008_210_BETCEN_E_TAU01KM.TAB`，产品跨度 63,449–145,021 km，
1 km 一格，第 5 列是法向光学厚度（列定义见随附 `.LBL`）。取 66,900–140,612 km 的部分即整个环系；
标签说明负值表示信号太弱无法定值，这些样本（2,333 个，占 66,122 个样本的 3.5%）线性插值补上。

**为什么取这一次掩星。** 数据集的参考论文 Colwell 等 2010（AJ 140, 1569）指出，
由掩星反演的法向光学厚度依赖环面张开角：低仰角的视线从自引力尾迹之间穿过，会低估 τ；
仰角越大越接近真实法向值。因此本项取标签评为 GOOD、且未被标为行星掩星的剖面里**仰角最高**的一次
（β 半人马座，66.7°）。四次候选的每环平均 τ 与各自仰角：

| 掩星 | 环面仰角 | 标签 | C 环平均 τ | B 环平均 τ | A 环平均 τ |
| --- | --- | --- | --- | --- | --- |
| α 室女座（I） | 17.3° | GOOD，非行星 | 0.10 | 1.62 | 0.53 |
| ε 豺狼座（E） | 51.0° | GOOD，**行星掩星** | 0.11 | 2.88 | 0.71 |
| γ 十字（I） | 62.3° | **POOR** | 0.25 | 1.24 | 0.54 |
| β 半人马座（E） | 66.7° | GOOD，非行星 | 0.10 | 3.54 | 0.76 |

C 环在三次 GOOD 掩星之间一致（0.10–0.11），B 环相差 2.9 倍，正是尾迹效应。
本实现取仰角最高的一次，即最接近法向值的一次；这是一个判断而非唯一解——
换成 α 室女座会让 B 环暗一倍。四次全部列在上表，可据此重算。

**D 环仍用公布值。** ε 豺狼座被标为行星掩星，它在约 69,000 km 以内读到 τ = 4–5，
那是土星大气而不是 D 环；α 室女座没有行星掩星，但在 D 环读数为 0.000，低于它在 1 km 尺度上的探测下限。
两次掩星都分辨不了 D 环，所以 D 环保留公布的 1e-5–1e-3 范围中值 5e-4，实测剖面从 C 环内缘开始。

**从剖面到环区。** 一次多次散射求解要为每个环区建一对表行，所以环区数有上限。剖面按
「先把任何超过 400 km 的区域切开，再按区内平方误差最大处继续切」分成 400 个区域
（`src/ring-regions.json`），每个区域取该跨度内实测 τ 的平均值。这样 C 环、环缝和 A 环都有足够分辨
（平均约 165 km），而 7 条命名窄环各自独立成区：Titan 环 25 km 宽、区内平均 τ = 3.14，
Maxwell 0.26、Bond 0.74、Dawes 1.23，Huygens、Herschel、Laplace 同样各自成区。
反照率与冲效应振幅仍取各区域所属**命名环**的公开值，因为没有来源按公里给出这两个量。

环影用的径向剖面纹理相应从 8,192 个样本提到 16,384 个（跨度 73,712 km，约 4.5 km 一格），
最窄的命名窄环也有几个纹素宽。渲染网格是 400 圈环带（206k 顶点），每条环按实测宽度绘制。

**残留近似（明确标注）**：

- **单次掩星，不是多次合成。** 论文与文献的常规做法是合成数十次掩星；本项只用一次，
  它的仰角、经度与观测时刻都被带进结果，上表 2.9 倍的差异就是这个不确定性的大小。
- τ 在浓密的 B 环里**局部饱和**：本剖面 B 环最高读到 8.3，而公布范围是 0.8–5，
  论文对该区域的说法是「两次掩星在这段都达到 τ_max」。因此 B 环最密的区域里表值是**下限**。
- 每个区域取跨度内的**算术平均**而不是中值：平均才是单位面积的等效不透明度，
  但跨 400 km 的区域内部若仍有密度波，平均值会抹平它的对比度。
- 插值样本 3.5%，集中在信号弱处（D 环附近与外环）；插值不是测量。
- 比 1 km 更细的结构、未命名小环与自引力尾迹的细节没有进去。


**两个方向的影是两件事，这里分开写清楚。** 一是**环在行星上的影**：射线以云顶实际位置为起点投向环面，
按扁球轮廓判断本影、按太阳视半径积分半影——就是可点击标记所指的那条暗带。二是**行星在环上的影**：
环的着色器把环面每一点沿太阳方向与行星椭球求交，落在本影里的环被压暗（`planetTransmission`，`dynamics.js`）。
后者在天王星、海王星、木星上也有几何意义，但只有土星会在文档与验收里逐项检查。
观测设置的投影开关同时关掉两者；2026-09-15 的环渲染一般化曾在重写这段着色器时漏掉第二个方向的那一行，
现象是"土星投在环上的影整条消失"，由用户看出、现已修复并补了像素断言（见下）。

**同一行影后来又出过一次量纲错误，一并记在这里。** 环的网格按赤道半径归一化建立（顶点半径就是 km 除以赤道半径，
再由 `ring.scale` 乘回天体半径），行星网格是一条被 `shape` 压扁的单位球，两者都以赤道半径为长度单位。
恢复这行影时沿用了更早版本的 `vActivityPosition / uBodyRadius`——那时环网格建在场景单位里，除以天体半径正好换成半径单位，
网格改成归一化之后这句就多除了一个 2.18。后果不是影消失，而是**影的形状错**：每个环面点被缩进行星半径以内，
本影判据退化成"这个点在不在行星的背阳侧"，整片环系的背阳半边一起变黑，用户看到的是一条影变成半个盘。
与之独立的还有一处轴线错误：该函数按 `lightDirection.y / uBodyPolarRatio` 处理扁平率，而环网格的局部 +Z 才是极轴
（环面是 z = 0，`ringMu0` 用的也是 `.z`），扁平率被加在了面内的一条轴上，效果是影的背阳延伸变长而不是变宽。
两处一起修：函数对极向分量同时缩放环面点与太阳方向，调用处不再除天体半径，`uBodyRadius` 这个已无用的 uniform 一并删除。
在正对极轴的取景里量（行星本体遮住 1.05 倍半径以内，所以看到的半宽略小于理论值 1.00）：
影的横向半宽 0.77 个赤道半径、背阳侧之外 0 个暗像素，修前同一次量测读数为 2.18；2002 至点的背阳延伸 2.05 个赤道半径——
不压扁应是 2.22，扁平率把影缩短约 8%，这一项是本轮唯一按扁平率算进影的几何。

**环辐条已移除（2026-09-17，用户要求）。** 它曾按四个观测条件绘制（掠射日照的季节、实测 B 环的径向范围、晨侧扇区、对比度随散射几何），但形态上用了等距、平行、笔直正对径向三条**没有观测依据**的简化，观感被判定不合格；同时实测可见度极低（同一取景开关辐条最大差异 10/255、仅 0.53% 像素有差异），因此不再保留：着色器、`RING_SPOKE_LEVEL` 与相关说明一并删除。对照截图与差异图留在 `outputs/effects-20260916/`。真实辐条中「不随环物质转」的漂移至今没有解释，重做时也不应编造。

**环的显示亮度是一个具名的显示系数。** `dynamics.js` 的 `RING_DISPLAY_LEVEL`（当前 0.85）乘在环的辐射上，
不改反射率本身。它的允许范围由量测决定：同帧比较环与行星盘时，带状平均、24 角表插值与逐带覆盖度带来的
离散度约 ±20%，系数落在这个范围内就仍在模型自身的不确定度里；超出它就等于把环的亮度从「光度陈述」变成「观感」。
之所以取在下沿，是因为受光面在默认取景下比行星盘本身还亮。

**环的两个面不是同一个面。** 环是粒子层：太阳所在的那一面把阳光反射出来，另一面只有穿过整层的透射光，
所以光学厚的 B 环从背光面看近乎全黑，薄的 C 环在透射里仍看得见。旧实现取太阳方向与环法线夹角的**绝对值**
当入射余弦，两面共用同一个反射解，正反两个方向就一样亮。现在按两个余弦的符号判定看的是哪一面：
同号用反射解，异号用同一张表的**透射解**——Chandrasekhar 的 `T = mu0/(mu - mu0)·[X(mu)Y(mu0) - Y(mu)X(mu0)]`，
与反射共用同一对谱因子，所以不需要第二张表；一阶项同样换成真实相函数，饱和项改为 `exp(-tau/mu) - exp(-tau/mu0)`；
`mu = mu0` 是可去奇点，着色器在千分之一处跨过它。冲效应只乘在反射面上：那是按反射 I/F 拟合的测量量，
透射方向没有实测的冲效应，相干前向峰没有建模。

**透射面的残差**：用反射的秩二近似对算出的透射，与解算器自己的透射解相比，在 tau ≤ 1 的环区相差 16% 以内，
在所有环区上相差不超过受光面亮度的 12%（最大的一档出现在光学最厚的区域，那里两者都只有受光面的几个百分点）。
`ring-multiple-scattering.test.js` 用两条界限把这个残差钉住。

环影采用场景内可点击标记，依据当前太阳方向，从 B 环半径约 1.7 倍土星半径处反向求与云顶的交点。
求交在把各轴除以半轴的空间里进行，那里椭球变成单位球，所以交点落在真实的椭球云顶上，
而不是先与单位球求交、再按比例贴回压扁后的表面——后者的落点陷在云顶以内，两者相差可达扁率量级。
标记不随云纹自转；无有效投影、关闭阴影或被球体遮挡时不显示。观测设置仍可关闭投影。
太阳仰角超过约 36 度时，从 1.7 倍半径处射向天体的光线整条掠过球体，此时没有可指向的表面交点，
标记隐藏而不是被吸附到最近的表面点。

### 环的倾角、透明度、遮挡与光照复核

2026-09-15 按环平面周期的三个节点逐项复核：2002 年北至点（太阳在环面以北最远）、
2017 年南至点（最南）、2025 年 3 月春分（太阳在环面内）。桌面 1440×900、减少动态效果模式，
截图与量测留在 `outputs/ring-multiple-scattering/viewpoints/`。

| 复核项 | 方法 | 结果 |
| --- | --- | --- |
| 环倾角 | 三个日期各拍一张，看环面张开角是否随季节变化 | 两个至点环面张开、春分近乎侧视，与土星 26.7° 的转轴倾角一致 |
| 透明度 | 春分视角量测穿过球面的环线像素与相邻球面像素 | 环线最暗 10 像素均值 18.5，同一列球面均值 80.0：侧视时环近于不透明，把球面挡住，符合环面穿越时视线穿过大量环物质的预期 |
| 光照 | 两个至点量测球体上方的环带与同区域深空 | 2002 年环带均值 69.8、深空 2.9；2017 年 57.0、2.2。两个至点亮度不同，来自各自的相位与入射角几何，不是固定底色 |
| 前后遮挡 | 逐张检查环跨过球体的位置 | 近侧环画在球体之前、远侧被球体遮住；春分图上环线在球体左缘之前连续跨过 |
| 环影 | 两个至点的环影标记与云顶暗带 | 可点击标记出现，南北两侧的暗带位置随日照方向翻转；观测设置可关闭投影 |
| 行星投在环上的影 | 关掉动态层后在 2002 至点取景下比较投影开关两帧 | 4,564 个环面像素被压暗超过 10%、最深 0.527；缺这一项时读数为 0 与 0.003，`verify-saturn-shadows.mjs` 会失败 |
| 行星投在环上的影的形状 | 正对极轴取景（相机放在北极轴 11 倍半径处）下量横向半宽与背阳一侧 | 半宽 0.77 个赤道半径、背阳侧之外 0 个暗像素；把环面点除以天体半径的旧实现读数为 2.18，同一断言会失败 |
| 环的两个面 | 2002 至点正对极轴、南极北极各一张（关闭投影与动态层），量 B 环与 A 环背光面/受光面的线性亮度比 | B 环 6.5%、A 环 47%（薄环透射得多）；取绝对值、两面按同一面渲染时读数被拉平到 54% 与 59%，`verify-ring-faces.mjs` 会失败 |
| 运行错误 | 各页收集 pageerror 与 console error | 0 |

**这一项复核的是「有没有按物理量走」，不是绝对光度**：色调映射未按绝对光度标定，
上一节记的显示后果（物理反射率低约 5 倍，屏幕亮度高约 2.4 倍）在这三个日期上同样成立。
土星其余视角的贴图与本体比例、土卫二地表视角仍按[待办](TODO.md)保留，不在本轮范围。

## 其余行星的环系

2026-09-15 起，环渲染不再特化于土星。`src/ring-systems.js` 是唯一的声明处：每个天体一份
环形区列表 `[名称, 内缘 km, 外缘 km, 法向光学厚度, 单次散射反照率, 冲效应振幅]`，
网格、反射率、散射表与镜头取景都只读这一份列表。一个环区就是一圈独立的环带几何
（`createRingSystemGeometry`），半径按实测内缘与外缘绘制，光学厚度、反照率、冲效应振幅
和环区序号作为逐顶点属性送进着色器。**用环带而不是径向剖面纹理，是因为天王星最窄的环只有
1.6 km 宽**：整个环系径向跨度 68,000 km，任何能覆盖全系的剖面都要在 2 km 尺度上取样才留得住它。

土星现有 29 个环区：原有的 15 个分区，加上 **7 条实测命名的窄环**——
Titan（23 km，τ≈4）、Maxwell、Bond、Dawes 三条在 C 环内，Huygens、Herschel、Laplace 三条在卡西尼环缝内。
这些环的半径与光学厚度来自
[PDS 大气节点《卡西尼环系科学》](https://pds-atmospheres.nmsu.edu/data_and_services/atmospheres_data/Cassini/sci-rings.html)（2026-09-15），
是上一版 15 分区把整条环取平均时抹掉的那一档结构：Titan 环 23 km 宽、τ≈4，而它所在的 C 环平均值只有 0.2。
环带几何正好适合表达这种结构——每一条环就是一圈按实测宽度绘制的环带，
径向剖面纹理反而要在 9 km 尺度上取样才留得住 17 km 宽的 Bond 环。
该纹理的分辨率因此从 2048 提到 8192（跨越 74,000 km，间距约 9 km），它仍然驱动土星本体上的环影查找。

土星的环区列表就是 `ring-optical-depth.js` 里的表，不是两份数据。其余三个系统的来源与检索日期（均为 2026-09-15）：

| 系统 | 半径 | 光学厚度 | 反照率 |
| --- | --- | --- | --- |
| 天王星 13 条环 | [PDS 环月系统节点《天王星环系重要参数》](https://pds-rings.seti.org/uranus/uranus_rings_table.html) 逐环列报的中线与宽度（内缘 = 中线 − 宽/2）；ε 环 τ 为范围 0.5–2.3，取中值 1.4 | 同表逐环法向光学厚度 | [NASA 天王星环资料表](https://nssdc.gsfc.nasa.gov/planetary/factsheet/uranringfact.html) 的几何反照率约 0.015，ε 环 0.018；ν、μ 无值，取 0.004 作插值 |
| 海王星 5 条环 | [PDS 环月系统节点《海王星环系重要参数》](https://pds-rings.seti.org/neptune/neptune_rings_table.html) 的中线与宽度 | 同表：Galle 1e-4、Le Verrier 0.003、Lassell 1e-4、Adams 0.0515 | 同站点资料表的约 0.015 |
| 木星环 | [PDS 环月系统节点《木星环系重要参数》](https://pds-rings.seti.org/jupiter/jupiter_rings_table.html) 的内、外边界（该表直接给出公里数，无需换算） | 同表：晕环 1e-6、主环 8e-6、两条薄纱环 5e-7 与 1e-7、Thebe 延伸 1e-8 | 资料表只给主环约 0.015，其余空白，取同一值 |

**已取到**：完整公里级 τ(r) 剖面，见[土星环影与环的光学厚度](#公里级光学厚度剖面)。
数据集仍是 [PDS 环月系统节点 COUVIS_8001](https://pds-rings.seti.org/ringocc)（卡西尼 UVIS 恒星掩星），
只是取数走了同节点的 OPUS 接口：`pds-rings.seti.org` 在本机对每个路径都返回 HTTP 504，
而 `opus.pds-rings.seti.org` 可达，且把卷文件映射在 `/holdings/` 下，因此可以按单个产品下载，
不必取那 438 MB 的整卷。上面那 7 条命名窄环在剖面里都能对上，半径与 τ 也据此更新。

**残留近似（明确标注）**：

- 天王星、海王星与木星的环粒子**没有公开的可见光单次散射反照率**。上表用的是**几何/邦德反照率**，
  与公式需要的单次散射反照率不是同一个量。海王星还另有一个来源冲突：Le Verrier 环的 τ 在 PDS 为 0.003、
  在 NASA 资料表约为 0.01，本实现取 PDS 值。
- 天王星、海王星与木星**没有各自的相函数测量**，`g` 与冲效应振幅沿用土星的值，是假定而非测量。
- 环区半径有两处按可渲染性做过调整，因为来源本身互相矛盾或缺少宽度：海王星 Lassell 环的内缘按 PDS
  的宽度落在 Le Verrier 环内部，这里贴到 Le Verrier 外缘，避免同一条环带画两遍；木星两条薄纱环
  与主环径向重叠，来源靠垂直厚度区分，而本渲染不建模垂直结构，因此把内缘贴到主环外缘。
  Arago 环按「Lassell 外缘的亮度增强」从 Lassell 外缘画到 IAU 公布的 Arago 半径。
  Galatea 轨道上的无名尘环没有任何宽度来源，未声明。
- 木星晕环厚约一万千米、两条薄纱环各数千千米，**垂直结构完全没有建模**，全部按平面环绘制。
- **环影只在土星本体上投射**。天王星环面与轨道面近乎垂直，其余系统的环又窄又薄，
  在整星视图中都在一像素以下，本项不做更远的环影。
- **物理宽度下的窄环在整星视图里几乎看不见**（天王星自 2026-09-25 起另加下述艺术增强）：天王星最宽的 ε 环 58 km，
  在能看见整个环系的视距下只有约 0.4 像素，其粒子反照率 0.015 又只有土星 B 环的四十分之一。
  这与天王星环只能靠恒星掩星发现、海王星环在旅行者影像上需增强才可见的事实一致。
  放大到环附近可以看到它们，`outputs/ring-multiple-scattering/ring-systems/` 保留了原图与增强图。

### 天王星环的艺术增强

2026-09-25，按用户要求改善「环不明显、球面上有黑线」。环区公里半径、光学厚度、反照率与散射求解保持原数据；`ring-display.js` 单独实现显示处理，并在天王星资料和画面注记中标明「环系艺术增强」。

- 窄环采用银蓝色显示，在线性颜色空间使用 `(0.78, 0.9, 1)`。亮度取原散射结果的 6 倍与柔和补光项中的较大值；补光随光学厚度、日照张角及所见环面变化，背光面更弱，随后仍乘行星遮光项。因此这些环的屏幕颜色和光度**不代表可见光实测值**。
- 窄环的屏幕覆盖取原覆盖率的 0.3 次幂，再乘 0.6 透明度系数，提升背景下的细环可见度，并减轻掠过球面的黑色划痕感。宽而稀薄的尘环不采用覆盖率提升；ε 环保留为最醒目的外圈。这是艺术显示处理，不再宣称天王星的显示总光量守恒。
- 环带仍以观测半径为中心，最小栅格宽度沿投影后的切线法向计算，缓解侧视时的断续斑点；扩展不能越过相邻环间隙中点。公里宽度数据未改，屏幕宽度存在此抗锯齿与展示增强，不应由截图反算环宽。
- 其它行星的显示增强权重为 0。总览与落点环材质共用显示函数；当前落点天空的环入口仍仅绘制土星，未新增天王星地表或天空环入口。

同日截图覆盖默认视角、斜视、近环平面、另一侧、手机与短横屏；原始物理显示与增强版在相同日期、相同镜头对比，脚本和验收记录在 `outputs/uranus-rings-20260925/`。

### 落点天空中的环

2026-09-16 修正。土卫二与土卫六的天空里，土星环一度是一条几乎看不见的暗线。原因不是贴图：
当时的环是一段 74,500–136,780 km 的 Lambert 环带，而**这两颗卫星几乎就在环平面内**，
太阳也几乎在环平面内，平面在掠入射下 `cos(入射角)→0`，环于是拿不到光。真实情况恰好相反——
环平面穿越时环是横贯土星的一条亮线。

现在落点天空的环直接取 `createRingSystemGeometry(ringSystemFor('saturn'))` 的 401 段实测分区
（D 环 66,900 km 到 F 环 140,612 km），并用 `ring-photometry.js` 中与总览共用的同一套
Chandrasekhar 粒子层光度学：反射/透射两支、Henyey-Greenstein 相函数与冲日增亮，
不透明度取 `1 - exp(-τ/μ)`，因此掠射时环变得更不透明而不是变黑。显示系数同样取
`RING_DISPLAY_LEVEL`，光照强度与落点天空的平行光一致，使环与旁边的行星尺度可比。

未被移植的是行星在环上的投影：落点视角几乎在环平面内，日下点阴影落在行星背后的环段上，
被行星自身遮住，因此这里不做投影。这一点写在 `ring-photometry.js` 的注释里。

### 落点天空中土星本体上的环影

2026-09-24 补齐与定案。土卫二等卫星表面仰望土星时，此前只移植了大气天气模型（`patchSaturnWeather`），漏掉了总览视图中的环影管线。现在落点天空中土星球体材质接入 `patchSaturnRingShadow`（`saturn-ring-shadow.js`）：
- **机制**：复用与总览一致的 `saturnShadowFunctions` 与 `saturnDirectLighting`。落点天空中球体姿态由 `setRotationFromMatrix` 设定，其旋转正交基由 `[prime, north, east.negate]` 构成（`SurfaceSky.js:325`），因此在土星模型局部坐标系中，**+Y 严格对应土星北极轴，XZ 平面严格对应土星赤道环平面**，与总览中 `saturnShadowFunctions`（以 `p.y` 为转轴分量、`p.xz` 为赤道环平面）**完全同口径**。
- **光照衰减**：通过顶点 varying 传递表面点在土星本体局部坐标系的位置 `vActivityPosition`（以赤道半径为单位）与视空间到局部空间的旋转逆变换 `vActivityViewToLocal`，将物理太阳平行光方向还原至土星局部系；射线与环平面求交并采样 `uRingOpticalDepth`（16384 点半精度纹理），经 9 点太阳视圆面带状积分计算 `ringTransmission`，衰减直射光入射强度。
- **半球与朝向校验**：以 1971-08-01 UTC 土卫二（落点纬度 -75°S）为例，太阳位于土星南纬 -24.16°（南半球），阳光自南向北穿过环面，投影必然落在土星**北半球**（$p.y > 0$）。由于观察者位于土卫二南纬 -75°，天顶朝南、地平朝北，望向土星时画面上方（屏幕 -Y 方向）指向土星南极（$p.y < 0$），画面下方（屏幕 +Y 方向）指向土星北极（$p.y > 0$），土星赤道横贯屏幕第 350 行。因此，实测位于屏幕第 384–424 行的环影暗带（$p.y \in [+0.15, +0.35]$）**严格落在土星北半球**，与暗极冠（北极极夜区）同侧，几何方向 100% 物理真实。
- **来源链接**：NASA Cassini ISS / UVIS 恒星掩星光深度剖面（与总览视图一致，参见 `solar-system/src/ring-optical-depth.js` 与 `solar-system/src/dynamics.js`）。
- **已知限制**：行星投在环上的投影仍未移植（因落点视角处于环平面内，背日阴影区被行星遮挡）；环影只在土星本体生效。

### 亚像素环的覆盖（抗锯齿）

环按实测宽度绘制带来一个原设计没考虑到的问题：**宽度远小于一个像素的环会变成斑点**。
天王星可见的环是 1.6–58 km，而在能看见整个环系的取景下 1 像素约 140 km，
于是每一条都只有 **0.02–0.4 像素宽**。这种比采样间隔细几十倍的薄片，光栅化的固定采样点
在有些像素上命中、有些上落空，本该是一条很淡的连续线，实际成了沿线的散点——
用户 2026-09-15 报告的正是这个现象。它比"看不见"更糟：读起来像球面上多了一串噪点。
土星最窄的几条也同一类（Titan 环 25 km、Keeler 缝 35 km，在应用里的土星取景约 110 km/像素）。

修法是在**顶点着色器里把环带撑到至少 1.5 个设备像素宽，并按同一比例压低不透明度**
（`dynamics.js` 的 `RING_MIN_PIXELS`）。环带的两行顶点带 `aRingEdge`（±1）说明自己该往哪边撑，
带 `aRingHalfWidth` 说明真实半宽，着色器据此算出 `vRingCoverage = 真实半宽 / 撑宽后的半宽` 并乘进 alpha。
由于混合本来就是 `rgb × alpha`，同时压低 alpha 也就同比例压低了它贡献的光，**总光量不变**：
一条只占千分之一像素的环仍然只贡献千分之一的像素光，只是把这千分之一摊在整条线上而不是撒在几个点上。

这一历史步骤仅为抗锯齿；**2026-09-25 的天王星艺术增强另见上节**。原步骤没有以可见性为目的调亮，
1.5 像素是让覆盖确定化的下限，不是显示加粗。回归检查是 `scripts/verify-ring-thin-coverage.mjs`：
在天王星环面张角约 1.7°、1 像素约 141 km 的取景下沿线逐行做高通，量每一行被窄暗特征压掉多少。
连续覆盖时各行凹陷稳定（斑点指数 1.29，35% 的行没有凹陷，这些空缺是环系本身的分组空隙）；
不加这个下限时读数为 2.17 与 66%，脚本会直接失败——阈值就是按这两个状态定的。

**残留**：撑宽让环的绘制边缘比真实边缘外扩约 0.75 像素（同比例压低不透明度，光量不变）；
同一环区内部的宽度差仍然只按区域平均处理；环影与环的落点仍按公里半径对齐，不看这个显示宽度。

**「总光量不变」只在撑宽的环带互不重叠时成立，这一条后来被量测推翻并修好。** 相邻环带各自
对称撑到 1.5 像素后是会重叠的：土星那 401 条公里级环带彼此贴合，在一个像素里能落进好几条，
而半透明「over」合成的 alpha 小于各自之和（`a₁+a₂−a₁a₂ < a₁+a₂`），于是每条按自己撑宽倍数
压掉的光没有被加回去。2026-09-15 用关闭色调映射的一帧量到：B 环相对行星只有物理值的 0.58 倍，
把 `RING_MIN_PIXELS` 设为 0 则回到 1.03 倍——**撑宽让整条环带丢了约四成光**。
修法是给每个顶点再加一个 `aRingRoom`：该边到相邻环带中点之间的距离，撑宽量取 `min(撑宽, aRingRoom)`。
贴合的环带因此撑宽为 0（整条带远宽于一个像素，不会漏采样），孤立的细环照旧撑到 1.5 像素
（天王星专项读数不变：斑点指数 1.288、34% 的行无凹陷），修好后 B 环的份额回到 1.03 倍。
`ring-multiple-scattering.test.js` 的「an annulus may only widen into the gap beside it」按声明半径
逐边核对这个上界，并确认土星确实存在被上界卡住的相邻对。

## 土星大气与白色风暴

2026-09-19：土星采用独立的 `saturn-weather.js` 材质模块，保留目录中原有的全球贴图与实测扁率。总览和着陆天空共用薄霾、北极六边形及涡旋的外观实现；没有生成或放大新的贴图。

- **云带**：赤道向东的主流叠加中高纬交替急流，纹理按纬度差速平移，细云纹用球面连续噪声补充。两组有界采样平滑交替，避免长期运行拉烂原图；像素无法分辨的细节逐级淡出。系数是观感参数，不是实测风速剖面。
- **薄霾**：云顶斜视路径增加时，以弱暖色混合降低局部对比度。它与云纹共用日照和环影，夜侧只保留原有环境补光。当前没有垂直大气积分、真实折射、光谱散射或延伸到轮廓外的体积大气；不能将此项称为完整辐射传输。
- **北极**：六边形边界约处于行星中心纬度 77–79°N，使用从实测扁球恢复的方向计算；边界保持稳定，云纹沿其内部和边缘运动，极点有独立风眼与卷动云墙。颜色参考自然色观感，不能把卡西尼假彩色影片的鲜艳色调当作肉眼颜色。原全球贴图的极区纹理仍作为外观底图，未进行季节色彩反演或经度校准。
- **白色风暴**：参考 2010–2011 年北纬约 35°的大风暴，展示局部亮云头、扩展的湍流尾迹和衰减。纬度按行星中心纬度换算至扁球 UV；演示初始经度选择当时朝阳的子午线，随后云头和地标共用同一漂移坐标，绝不修改天体姿态、日期或太阳方向。初始经度、大小细节与发生时刻均不表示历史重现。
- **时钟与控制**：沿用项目独立的活动时钟，默认一轮 36 个演示秒，受活动速度 0.5–4×及播放暂停控制；不随日期倒放，也不与真实气象周期对应。按用户要求自动间歇演示白色风暴：聚焦土星并播放约 11–12 个演示秒后首次出现，此后两次开始间隔 43 个演示秒（36 秒演变、约 7 秒间歇），也可手动触发并重新计算下一次间隔。自动出现只更新云层和标记，不自动取景；手动触发仍进入风暴跟随。关闭动态活动冻结云流并取消风暴；关闭简介保留跟随，结束或关闭活动会清理标记与跟随，恢复先前自转跟随偏好。环粒仍保留原有绕行动画，风暴不再使环粒额外变亮。
- **跨视图边界**：着陆天空目前显示同一材质的基准云态（活动时间为零），天体姿态仍随共享物理日期推进；总览中的演示风暴和独立活动时间尚未跨视图传递。这不是同步天气模型。

资料核对于 2026-09-19：[NASA 土星大气概况](https://science.nasa.gov/saturn/facts/)、[卡西尼六边形与自然色极区影像](https://science.nasa.gov/mission/cassini/science/saturn/hexagon-in-motion/)、[2010 年风暴近自然色影像](https://science.nasa.gov/resource/spotting-saturns-northern-storm/)、[JPL 巨大风暴生命周期](https://www.jpl.nasa.gov/news/cassini-chronicles-life-of-saturns-giant-storm/)、[Nature 原始论文：35° 行星中心纬度](https://www.nature.com/articles/nature10205)。

`scripts/verify-saturn-weather.mjs` 覆盖桌面正常转场、手机及短横屏减少动态模式、暂停像素、风暴生命周期、关闭活动、标签及简介操作；`scripts/verify-saturn-weather-render.mjs` 固定相机和物理姿态，单独核验云流、极区运动、32 秒采样周期边界、经度接缝上的风暴、夜侧亮度与着陆天空 Lambert 材质的编译。另复用目录地标和环影专项。测试检查实现行为，不证明程序云流具备科学预报能力。

## 金星大气与超级自转云系

2026-09-21：金星采用独立的 `venus-weather.js` 材质模块，保留目录原有的全球云层贴图与雷达地表贴图（正球网格）。总览与着陆天空共用云顶超级自转、行星尺度云波与极区双涡旋外观实现；未生成或额外修改静态底图。

- **高空超级自转**：金星高空浓云（约 65–70 km 云顶）以约 4–5 个地球日的周期向西高速超快自转，自转速度比金星固本地表自转（243.02 天逆行）快约 60 倍，赤道向西急流达 ~100 m/s。着色器构建向西主急流场，并在中低纬至极区之间平滑减速。采用两组 28 秒周期的有界采样平滑循环交替（`ages.x`、`ages.y`），彻底避免长时间漂移导致的纹理过度拉伸或 UV 接缝撕裂；像素足迹无法分辨的高频细节逐级衰减以防止闪烁。
- **行星尺度 Y 形暗纹与波动**：参考水手 10 号、先驱者金星号、金星快车与破晓号（Akatsuki）在紫外波段观测到的行星尺度开尔文波与罗斯贝重力波系统（低纬水平向西展开的 V/Y 形人字形波系，横向波臂伸向中高纬，主干沿赤道）。**必须强调的写实界限**：此特征在自然界主要在 283–365 nm 紫外波段显现，可见光下金星整体为反照率极高、色调柔和的黄白色浓云；本实现采用微弱对比度（约 4%–7%）的浅奶油色调示意紫外云波结构，严禁做成木星式深色浓彩条带或肉眼级深色划痕。
- **极区冷领与偶极双涡旋**：南北纬 65°–75° 环绕一圈明亮的低温浓云环带（冷领，Cold Collar）；极区中心（纬度 > 75°）存在高速旋转的偶极涡旋（Polar Dipole Vortex，金星快车 VIRTIS 观测），在着色器中以旋转双叶形态和极区风眼呈现。
- **高地驻留重力波**：参考破晓号在阿佛洛狄忒高地（Aphrodite Terra）等近赤道高地上空发现的巨大弓形重力波。该波动相对于下覆地表保持静止，超快自转的高空云流从中穿流而过，表现为微弱的驻留波纹。
- **云顶硫酸云霾与边缘柔化**：视线掠过云顶斜视路径增加时，以弱暖奶黄色调进行平滑菲涅尔漫反射衰减，使金星边缘呈现自然柔和的高光散射，且严格处于漫反射（Albedo）阶段，夜半球受光自然遮蔽，绝不在背阳夜侧产生非物理边缘自发光。
- **云层开关与雷达地表**：当用户切换至“观测地表”（关闭云层）时，着色器检测 `uVenusCloudVisible < 0.5`，直接穿透回传雷达测高表面贴图（`8k_venus_surface.jpg`），同时冻结云流形变与边缘云霾；再次开启云层时无缝切回动态硫酸云。
- **时钟与控制**：沿用项目独立的演示活动时钟，单轮演示周期为 18 秒，受 0.5–4× 速率与暂停控制。活动状态下适度增强波动对比度与湍流对流，展示行星大气循环。演示速度与发生频率经过显著加速，不代表真实气象预报。
- **跨视图兼容**：在着陆天空视图（`SurfaceSky.js`）中，金星天体与总览共用该材质编译逻辑，通过 MeshLambertMaterial 补丁验证，不破坏金星 13 号落点的浓密大气散射。

资料核对于 2026-09-21：[NASA 金星科学概况](https://science.nasa.gov/venus/)、[先驱者金星号紫外云图](https://solarsystem.nasa.gov/resources/688/pioneer-venus-uv-image/)、[金星快车极区偶极双涡旋与冷领 (ESA)](https://www.esa.int/Science_Exploration/Space_Science/Venus_Express/Vortex_dynamics_at_Venus_South_Pole)、[破晓号 (Akatsuki) 阿佛洛狄忒高地弓形驻留波 (Nature Geoscience)](https://www.nature.com/articles/ngeo2873)。

`scripts/verify-venus-weather.mjs` 覆盖桌面转场、云层开关与雷达地表穿透、暂停确定性、活动生命周期、减少动态模式与标签状态；`scripts/verify-venus-weather-render.mjs` 固定相机与姿态，核验金星云流、行星尺度 Y 波、极区双涡旋、周期循环平滑度、夜侧非发光与着陆天空 Lambert 材质编译。

## 海王星大气与暗斑涡旋

2026-09-24：海王星改用独立的 `neptune-weather.js` 材质模块（与土星、金星同构，接管 `map_fragment`，退出通用 `gasMap` 路径），保留目录原有的全球贴图，不生成、不改写贴图内容。总览与"观测大气"近景共用同一材质实现。

- **双模风带**：云顶风是太阳系最快且双向的——赤道以约 400 m/s 逆着自转向西奔流，中高纬有顺行向东的急流（约 70°S 处 ~300 m/s，旅行者 2 号测得；云跟踪特征跨越约 20 m/s 向东至 325 m/s 向西）。着色器按此构造赤道逆行核 + 高纬顺行瓣的双模剖面，相邻纬度差速剪切；采样沿用 26 秒有界双相位循环，长期运行不拉烂原图。演示速率经过加速，不是实测风速的实时映射。
- **贴图中的大暗斑**：全球贴图带有一枚艺术增强的大暗斑（约 16°S，`data.js` 注明"风暴并非实时观测"）。2026-09-25 改为局部坐标形变：面积守恒的长短轴伸缩、缓慢倾斜、沿边缘传播的扰动与差速卷动，重采样原有暗斑，不叠画第二枚暗核。周边叠加断续、单侧较强的甲烷冰云丝。中心保留在目录地标，仅表示固定的示意参考位置；局部位移逐渐接入外围风带。修正旧版在有界相位之外又叠加 `jet × time` 导致贴图暗斑持续离开地标的问题；背景采样仅使用 26 秒双相位偏移，连续平流只驱动无固定地标的程序云纹。
- **新生暗斑事件**：参考 1989 年旅行者 2 号同时观测到两枚暗斑、哈勃 2016（跨约 4,800 km）与 2018 年拍到短期暗斑的记录，触发的活动在南北半球交替生成一枚**新的**暗斑涡旋，经度逐次错开；暗斑西移、缓慢偏向赤道（暗斑靠近赤道时趋于消散），在 22 个演示秒内经历"伴云先导 → 暗核加深 → 暗核消散、伴云残留"。伴生卷云先于暗核出现、又在其后残留，对应 Simon et al. 2019（doi:10.1029/2019GL081961）关于伴生云提前出现且存续更久的结论。出生经纬度、时刻与频率均为示意，不对应任何一次真实暗斑。
- **新生形态与云丝（2026-09-25）**：以出生时固定的事件种子区分轮次；局部环流按事件年龄演进，形态不会因经度漂移重新随机生成。非对称剪切、差速卷绕的多尺度边界及西向/赤道向暗色伸出结构共同改变轮廓；晚期沿风向拉伸并逐步侵蚀。伴云使用弯曲、断裂的细长云片和偏向一侧的尾丝，取代两条对称高斯亮带；南北半球镜像局部纬向坐标，令示意环流反向。没有人为加入亮环或风眼。暗斑形态与云丝参考 PIA01992 和 PIA00047，但振幅、种子、演示周期和速度不是观测反演，也不是流体求解结果。
- **暗斑成因的表述**：2023 年 VLT/MUSE 光谱分析支持深层气溶胶变暗，并非“上层云盖空洞”的定论。新生暗核表现为柔和的蓝灰色反照率降低；RGB 混色不声称复现观测光谱或气溶胶微物理。
- **Scooter 亮云**：南纬约 42° 处一团小型亮云按独立演示速率快速西移，重现 1989 年时间序列里它超过大暗斑的相对运动。
- **南极其瞳**：极区附近叠加缓慢转动的斑驳加深，参考旅行者 2 号影像的南极暗斑；幅度很小，坐标用笛卡尔分量避免极点经线挤压。
- **光照边界**：全部效果位于漫反射/反照率路径，夜半球零自发光；云顶斜视霾按视线掠射角轻微混色，与真实日照、阴影共用同一光源。
- **时钟与控制**：沿用项目独立活动时钟，单轮 22 个演示秒、间隔 41 秒，受活动速率 0.5–4× 与暂停控制；自动间歇演示不打扰当前取景，手动触发进入"新生暗斑涡旋"地标跟随，行为与土星白色风暴一致。关闭活动冻结云流并取消进行中的涡旋，不改动日期与姿态。
- **跨视图边界**：观测大气近景（`SurfaceSky.js`）共用该材质的基准云态（活动时间为零），与土星、金星的先例一致；演示活动状态不跨视图传递。

资料核对于 2026-09-24，形态与成因于 2026-09-25 补查：[NASA 海王星概况](https://science.nasa.gov/neptune/neptune-facts/)、[JPL PIA01992：大暗斑伸出结构及伴云](https://www.jpl.nasa.gov/images/pia01992-neptune-dark-feature/)、[JPL PIA00047：36 小时云系变化](https://www.jpl.nasa.gov/images/pia00047-neptune-changes-in-great-dark-spot/)、[哈勃 2016 年南半球暗斑 (ESA/Hubble)](https://esahubble.org/images/opo1622a/)、[Simon et al. 2019《Formation of a New Great Dark Spot on Neptune in 2018》(AGU/GRL)](https://news.agu.org/press-release/hubble-captures-birth-of-giant-storm-on-neptune/)、[ESO / VLT-MUSE 2023 年暗斑光谱结果](https://www.eso.org/public/news/eso2314/)。

`scripts/verify-neptune-weather.mjs` 覆盖桌面、手机与短横屏的转场、暂停像素确定性、自动/手动涡旋生命周期、地标跟随与清理、关闭活动后的日期与姿态不变；`scripts/verify-neptune-weather-render.mjs` 固定相机与姿态，核验差速流动、中高纬条纹运动、26 秒周期边界平滑、伴云先于暗核、暗核加深与消散的分期、夜侧非发光与观测大气 Lambert 材质编译。2026-09-25 增加 0/26/300/3600 演示秒的大暗斑地标保留、独立事件形态差异与回放确定性、生命周期阶段连续性、经度接缝像素比较、南北半球及时间序列截图。另复用目录地标专项。测试检查实现行为，不证明程序云流具备科学预报能力。

## 地标和活动定位

地标操作只改变相机的位置、距离及跟随状态，不改写日期或天体姿态。地图地标跟随当前网格，环影跟随照明方向。进入地标观测会启用镜头跟随，退出时恢复先前设置；用户在观测中手动调整的跟随设置优先保留。

**降落图钉与地标的取景方向用的是不同的约定**，这一点写清楚：
图钉位置落在实测椭球面上（`shapeSurfacePoint` 按各轴比例缩放单位方向，缩放后的点满足椭球方程），
但它的方向仍取**从球心指向该点的半径向量**，不是椭球法线。
原因是地表观测本身用地心方向定义地平线（`surface/geometry.js` 的 observer 位置就是 centerKm + up·半径），
图钉若改用法线，就会和它要打开的那个视角对不上。地标没有这个约束——地标方向只决定相机方位，所以改用了椭球法线。
两种约定在哪一站可分辨、图钉实际跟的是哪一种，由 `feature-anchors.test.js` 的
「landing markers sit on the measured ellipsoid of every shaped body」逐站检查。

**网格法线是变换出来的，不是重新算的。** 球体克隆后按半轴缩放，法线取该线性映射的逆转置作用于原法线
（赤道脊那一路多一个随纬度变化的赤道缩放，其雅可比同样有闭式解）。不用 `computeVertexNormals()` 是必须的：
球体的 UV 接缝是一列**重复顶点**，逐面平均只看得到各自一侧的面，两列法线相差可达 3.3°，着色沿整条子午线折出一道缝；
极点处三角扇退化，`computeVertexNormals` 给出的法线长度为零。这两件事只有给天体加上 `shape` 之后才会上屏，
2026-09-15 之前多数天体是单位球、用的是 three.js 自带的解析法线，所以看不出。
`body-models.test.js` 的「a shaped globe keeps one normal per surface point, seam and poles included」
断言接缝两列夹角 < 0.05°、法线都是单位长度、与参数曲面的有限差分法线相差 < 0.05°，并带反向对照
（旧的逐面平均必须仍然超过 0.5°，否则测试本身失效）；对着未修改的实现跑，它以退化法线的断言失败。
证据与量测留在 `outputs/globe-seam/`。

静态地标的取景方向取该点处椭球的真实法线，即 x²/sx² + y²/sy² + z²/sz² 的梯度，而不是从球心指向标记的半径向量。
球体上两者相同，扁球上不同：土星中纬度处相差可达数度，若沿用半径向量，相机会偏轴看向标记边缘。
标记位置仍在压扁后的表面上按显示约定的 1.017 抬升，取景距离沿用同一 `extent`，不因这次修正改变缩放节奏。
`feature-anchors.test.js` 对照椭球方程、环平面半径与梯度法线逐项检查，并确认球体上新旧取值一致。

- 火星北极标记指向北极冰冠区域，采用 [USGS 北极地区地质图](https://www.usgs.gov/maps/geologic-map-north-polar-region-mars) 的地貌解释。**2026-09-16 起极冠的范围随季节变化**：`mars-seasons.js` 由模拟日期算出火星的太阳黄经 L_s，再按本影的实测季节走势给出南北两个霜冻边界（北缘约 80°N–55°N，南缘约 87°S–55°S，南半球夏季 CO₂ 会全部升华而北半球留有水冰残余）。**边界的季节变化有观测依据，霜冻如何着色是展示近似**（当前是在经纬贴图上按纬度加白），不表示同期实测的霜线形状。
- 土星六边形及中心极地涡旋新增程序形状，位置在北极、边界近北纬 78 度，依据 [NASA 北极六边形影像](https://science.nasa.gov/photojournal/saturns-north-pole-hexagon-and-aurora/)。色彩、云纹和边界宽度为示意，不能视作同期实测或急流动力学模拟。
- 日珥标记读取当前拱环网格的中点，太阳喷发、木卫一火山喷发、土卫二冰粒喷流、海卫一氮气喷流与木卫三极光卵的标记取动画内代表位置。**海卫一与木卫三是 2026-09-16 新增**：海卫一复用土卫二的冰粒喷流机制，但喷流轴按天体各自指定（土卫二沿南极虎纹、海卫一在南纬约 55°–60° 的南极区），依据是旅行者 2 号 1989 年拍到的约 8 km 高氮气喷流，**不表示当前正在喷发**；木卫三的极光卵是发光项，相位按木星 System III 自转周期推进，依据是哈勃观测到的等离子体扫过导致的摆动，**亮度与摆动幅度为示意**，不是某次观测的重演。它一度完全不显示，原因有三个，都已修掉并记在这里：球面材质在细节到达时会被替换，挂在旧材质上的 `onBeforeCompile` 会被无声丢弃（改为逐帧核对材质身份并重挂）；驱动量所在的 uniform **必须由每帧的维护函数自己创建**——`ensureDetail` 那条挂载路径在这个取景下没跑到，uniform 不存在，着色器读到未赋值的 0，于是带公式、UV 纬度、挂点全都正确却什么都不显示；模拟日期是毫秒数，`Date.parse` 得 NaN（改为 `new Date(date).getTime()`）。另一处取舍：这份材质可靠接受的是反照率阶段 `map_fragment`（`lights_fragment_end` 与 `emissivemap_fragment` 实测都不生效），因此极光是加在反照率上、受日照调制，**夜面不会自己发光**——真正的自发光项在这份材质上做不到。活动时间、喷发规模及太阳和木卫一的演示热点均非同期观测；木卫一热点不对应特定命名火山。土卫二南极标记表示虎纹区域，不定位单条裂缝。
- 瞬时喷发的标记与动画活动阶段同步出现及消失；日珥和持续冰粒喷流在相应动画可用时显示。关闭动态模拟会隐藏活动标记，静态地形标记保留。
- 卫星目录按中文名称序数排列，例如土卫二、土卫三、土卫十；未收录的序号保留空缺。可降落图标只依据现有落点清单，不能解释成所有物理上可能着陆的天体。
- 同一星球可以有多个落点：2026-09-16 起落点共十六处，落点以自身的稳定 ID 标识，天体 id 仍用于物理与姿态查询。一个天体有多个落点时，每个落点各有一个图钉，标签避让沿用同一套碰撞检查；该天体以与天体 id 同名的落点作为默认，选中天体后不点击图钉的入口仍进入这一处。`landing-expansion.test.js` 检查 ID 唯一、默认落点、同天体落点坐标不重复，以及各落点的天空关系。

`scripts/verify-catalog-landmarks.mjs` 检查目录切换、标记定位、活动生命周期、镜头跟随，以及桌面、手机和短横屏的标签避让与画布像素；`scripts/verify-saturn-shadows.mjs` 保留南北两侧环影与开关检查。

## 数值证据及边界

- PCK 提取由 `scripts/build-iau.py` 重建；34 个天体、170 组姿态与独立 CSPICE 矩阵比较，覆盖历史与未来日期。
- `scripts/build-mean-reference.py` 为 39 个固定椭圆生成 351 组 CSPICE conics 参考，覆盖多个周期及历史范围边界。这验证转换/传播实现，不证明真实星历精度。另以 2009 论文表 3 的妊神星卫星位置及 13.41° 相互倾角检查来源转换；原表 2 的舍入角导致公里至几十公里差异。
- 年份包的 1 km 编码要求、阿波罗 15、水星共振、太阳视直径和地表独立参考校验继续保留；编码误差不等于总科学误差。
- 九落点新增 359 个 DE440/Horizons/CSPICE 几何、角尺度、相位及食相样本；另检查实际材质的明暗半球像素及太阳前后遮挡次序。来源、误差、有限摆动和验收边界见[地表科学校核](GROUND_AUDIT.md)。

## 卫星影凌（2026-09-26）

### 已实现机制与来源

总览接入木卫一、二、三、四，以及土卫三、四、五、六；不新增按钮、事件列表或地标。实现位于 `src/moon-transits.js` 和 `src/moon-transit-discs.js`。本节替代同日开发中间版本中“将本体放在影心”“切平面画斑”等初稿描述，最终实现没有这两种做法。

1. **影（由几何算出）**：共享物理帧的太阳、卫星、主星位置都在日心 J2000 赤道坐标中。按主星当天的 prime / north / −east 正交基转换为网格局部坐标，以 `body-models.js` 同源半轴 [a,c,b] 求太阳—卫星中心射线与实测扁球交点。展示轨道、相机和屏幕坐标不参与影心计算。单测将真实展示轨道比例改为 23 倍，已发生的木卫一影凌中心及直径完全不变。
2. **光照（几何加光学近似）**：每个行星表面片元计算太阳盘与卫星视圆盘的角半径和重叠面积，衰减直射光，保留原有环境光。有限太阳产生本影、半影和可能的伪本影；不是阴影贴图、`castShadow` 或贴在云上的黑圆。逐点几何自然产生斜入射的拉长轮廓、临边裁切及中心射线未命中时的擦边半影。土星同时沿用环透射率，已被环挡住的光不会强行显示第二个暗点。
3. **本体（物理投影加显示变换）**：太阳影凌与观察者凌星分别判断；不能因有影就强造本体在圆面内。总览相机没有真实公里距离，采用其朝向定义的远方平行视线，将真实卫星相对位置投到天空平面，大小用该卫星实测网格半轴与主星赤道半径之比。仅绘制重叠圆面的近侧卫星，复用它自己的当前网格与贴图引用、独立的日期姿态和真实太阳方向。绘制副本的深度限制在相机前方，并按透视距离补偿位置与尺寸，避免虚拟近景镜头穿入卫星轨道；这一步是显示变换，不是新的轨道解，也不声称是地球望远镜视角。显示物理副本时隐藏放大的轨道实例，退出重叠或选中卫星后恢复；原半径、轨道和姿态数据不变。
4. **时钟与演示速度**：直接读取总览模拟日期，遵守暂停、倒放及既有 1k 等倍率，无独立影凌演示周期。关闭动态气象不会停止几何变化；关闭原有投影状态只隐藏影子，本体继续存在。本次不调整默认日期和默认镜头。

来源：半轴沿用 [NAIF PCK00011](https://naif.jpl.nasa.gov/pub/naif/generic_kernels/pck/pck00011.tpc) 与项目物理定义；等效遮挡半径沿用 [JPL 卫星物理参数](https://ssd.jpl.nasa.gov/sats/phys_par/)。木星四大卫星实际 provider 是 [Astronomy Engine 2.1.19](https://github.com/cosinekitty/astronomy/tree/v2.1.19) 中的 IMCCE L1.2 模型，不能误标为本次新接入的 JPL 原始星历。土卫六沿用本地 JPL SAT441 年份包；土卫三、四、五沿用 [JPL 平均元素](https://ssd.jpl.nasa.gov/sats/elem/) 的既有固定椭圆。未升级或改动这些物理源。

### 真实性边界

| 分类 | 本次实际能力与限制 |
| --- | --- |
| 实测参数 | 主星及卫星轮廓取已采用的 PCK 半轴；这是有来源的静态形状摘要，不是高程模型。 |
| 由几何算出 | 影心、随日期运动、主星扁球交点、真实太阳相位、观察方向下的近侧凌星及大小比例。独立计算复核的是相同输入的几何，不是一次新的观测星历校准。 |
| 轨道近似 | 土卫三/四/五未含摄动与节点进动，不能把其发生日期用于真实交会预报；范围外轨道沿用项目已有外推标注。 |
| 示意：光学 | 遮挡卫星用目录平均半径的圆盘，未求其三轴投影的精细影形；太阳取均匀亮度圆盘，没有临边昏暗、衍射、云顶高度或大气散射。重叠半影及环影以各透射率相乘近似，未计算太阳盘联合遮挡。未分辨边缘有屏幕导数抗锯齿，不能用最外侧柔边反推物理半径。 |
| 示意：素材 | 严格“全部使用纯实测全球贴图”在当前目录下**没有达成**。木卫一/二/三保留探测区域并有 AI 补绘；木卫四和土卫五含既有参考修复；土卫六当前整张为 AI 雾霾示意。来源见 [补绘记录](../solar-system/textures/completed/README.md) 和 [修复记录](../solar-system/textures/repaired/README.md)。本次依照禁止替换贴图的要求复用这些素材，不把它们重新标成实测。 |
| 示意：镜头 | 本体采用远方平行视线与深度压缩的展示约定。默认相机偏离日照方向约 0.72 弧度且土星额外抬高极纬，因此不能保证有影时默认镜头同时看到凌星本体。自动更改默认镜头或新设事件入口需要另行产品决定。 |

### 可复核数字与截图

独立路径在 `scripts/moon-shadow-reference.mjs`：用标量点积与二分求椭球交点，另用视圆盘接触条件二分求本影、半影半径；不导入实现模块。实现则使用二次方程根与相切圆锥公式。浏览器预测屏幕轮廓再从相机射线独立二分求表面点、判断太阳盘内切，不能读取实现输出充当预测。

日期由 `scripts/find-moon-shadow-events.mjs` 顺序扫描选取：Io 从 2026-01-01 起每 10 分钟，Titan 从 2025-01-01 起每 30 分钟，选第一个真实轴线命中且入射余弦 >0.90 的样本；分别检查 223、2623 帧。此条件只是选可读样本，运行时不限制为这些日期。

- 木卫一：2026-01-02 13:00:00 UTC；预测局部影心 (18201.550797, −9183.807210, −68435.070403) km，除以木星赤道半径后 (0.254595630, −0.128459229, −0.957240956)。本影轴向截面直径 3011.009252 km，约木星赤道直径的 2.106%，小于卫星本体的 2.548%；有限太阳导致本影收缩。
- 土卫六：2025-02-24 15:00:00 UTC；预测影心 (54590.788343, −17776.117371, 16239.659019) km，本影截面直径 3991.595326 km。采用 2025 年实际几何，不把它伪装成 2026 年事件。
- 两套数值路径的影心差 <0.00001 km、直径差 <0.000001 km，只表明实现算术一致；不代表天文模型具有这种绝对精度。

`test-results/moon-shadow-transits/report.json` 及同名 PNG 保存原始结果（不进 Git）。以下单位为 CSS 像素，桌面 1440×900 / DPR 2；测量为开关阴影两帧的亮度差，阈值为局部最大衰减的 80%，预测为完全本影内切条件。半影、抗锯齿与阈值使测得宽度略大。

| 取景 | 预测影心 x,y | 预测本影宽 | 实测影心 x,y | 实测宽 |
| --- | --- | --- | --- | --- |
| jupiter-default-scale | 827.089,439.860 | 6.5 | 826.825,439.675 | 7.0 |
| jupiter-close | 783.436,456.169 | 11.0 | 783.220,455.952 | 12.0 |
| saturn-default-scale | 893.707,491.497 | 10.5 | 893.465,491.238 | 11.5 |
| saturn-close | 899.784,528.604 | 18.5 | 899.521,528.329 | 19.5 |

default-scale 表示保留默认取景距离、人工对准凌星方向，**不是未旋转的默认镜头**；另存两张 `*-native-default.png` 作为真实默认方向证据。手机 390×844 / DPR 3 与短横屏 800×450 / DPR 2 亦各有两张 `*-phone-close.png`、`*-short-close.png`：八组像素影心与独立本影栅格质心之差最大 0.286 CSS px、宽度差最大 1 CSS px。每张也核验本体存在有色像素，不能仅用诊断字段存在作为画面证据。

复现：先运行 `npm run dev -- --port 5191`，另终端运行 `node --import tsx scripts/verify-moon-shadow-transits.mjs`；`--numeric-only` 只执行数值双路径。`ATLAS_URL`、`ATLAS_OUTPUT`、`ATLAS_BROWSER_CHANNEL` 可覆盖地址、输出目录与浏览器。单测另覆盖活动影凌下 23× 展示比例、贴图/轮廓不变、前后遮挡、缺失槽位清理、时间推进、暂停和倒放。

### 范围取舍与未做

在主星直径 500 CSS px 时，按目录半径算的本体直径上限：土卫三 4.41 px、土卫四 4.66 px、土卫五 6.33 px、土卫六 21.36 px，故复用同一路径纳入；实际本影通常更小。土卫一 1.64 px、土卫二 2.09 px、火卫一 1.63 px、火卫二 0.91 px；木卫五、木卫六不足 0.60 px，本轮未纳入。这个取舍是辨识度与既定范围，不代表这些卫星不会造成食。天王星/海王星留作后续；海卫一本体比值约 5.46%（同尺度约 27.31 px），选择近景时并不小，不能只以行星在全局总览太小为由否定其价值。未改贴图、轨道、天体半径、姿态、日期、太阳方向；未增加入口或发布。

## 火卫一真实星历（2026-09-26）

火卫一的位置提供者由固定平均椭圆改为 MAR099 原始 Chebyshev 年份包，1900—2100 共 201 包；轨道目录中的平均元素仍仅作尺度/历史比较元数据。相对位置为 NAIF (401/4) − (499/4)，再加原有 Astronomy Engine 火星日心平移。火星本体、其它天体、半径与 PCK00011 姿态没有改动。范围内缺失年包不会由平均轨道冒充；范围外单独标注边界二体外推。

来源、处理、误差界及独立 CSPICE/Horizons 样本见 [年份包说明](../ephemeris/README.md#2026-09-26-火卫一-mar099)。这次独立验证证明的是系数表示、求值、坐标链路与候选地平变换，不是消除轨道解、未来闰秒、IAU 定向和地形误差。未登记火卫一落点，也未制作全景；原有落点校核不变量继续生效。候选报告单独保留三条原经纬度，不替用户选择或移动坐标来保留旧结论。

## 土卫六北极海面镜面高光（2026-09-26）

总览中的土卫六使用 `titan-glint.js` 以现有物理星历的太阳方向和当前相机方向计算镜面反射：
球面法线取太阳方向与视线方向的角平分线，片元着色器只在反射方向接近相机且独立湖海掩膜为液体的片元增加高光。
查表资产是 `public/surface/titan-north-lakes-mask.png`，由 Cassini RADAR 合成图 PIA17655 的蓝黑液体像元
保守腐蚀并重采样为 1024×512 经纬网格；仅覆盖确定液体内部，没有改动土卫六既有底图。解析角平分线与独立反射光线优化在所选真实几何下相差 0.00000148°。

依据与边界：Stephan 等在 2009-07-08 的 VIMS 5 μm 观测报告 Kraken Mare 镜面反射（DOI
[10.1029/2009GL042312](https://doi.org/10.1029/2009GL042312)），NASA 的 PIA17655 是 2004—2013
Cassini 雷达湖海合成图（[NASA/JPL/Caltech/ASI/USGS](https://science.nasa.gov/photojournal/titans-north/)）。
可见光下土卫六浓雾会强烈弥散这类反射；此处是视觉增强，不是 5 μm 辐射传输模型。底图的 AI 雾霾示意仍保留其艺术重建限制。
同类 VIMS 实例见 [PIA18432 Specular Spectacular](https://science.nasa.gov/photojournal/specular-spectacular/)（2014-08-21）。掩膜加载一次，GPU 每片元一次采样；无每帧 CPU 海域重算。太阳向量直接与 `bindPhysicalSun` 共用 `body.sunDirection` 引用，不从展示位置反推；IAU 姿态不变。昼面、可见面、液体三道门限之外严格为零；反射光线与相机夹角大于等于 2°也严格为零，0.35°内达到归一化峰值 1。2°展宽与线性辐亮度系数 12 是有意的显示增强，不是粗糙度或实测辐射参数。

演示：使用现有日期和倍率控件（推荐 1k×，需暂停检查时可暂停），自由旋转相机寻找镜面几何；没有新增“什么时候能看”入口。验证脚本只调相机、不改物理量。2014-08-19 14:00 UTC、63.1055°N/42.0117°E 的太阳高度为 49.7195°；固定该取景到 2014-08-20 06:00 UTC，全部掩膜中心的高光强度为 0，最接近的反射错角仍为 4.078°。这不是重建卡西尼相机轨迹。扫描口径、镜头向量与画布差分证据见 `outputs/titan-glint-20260926/`，生成方法见表面素材 README。
