diff --git a/docs/superpowers/plans/2026-10-04-accurate-planet-positions.md b/docs/superpowers/plans/2026-10-04-accurate-planet-positions.md new file mode 100644 index 0000000000..1fd853f5cf --- /dev/null +++ b/docs/superpowers/plans/2026-10-04-accurate-planet-positions.md @@ -0,0 +1,331 @@ +# Accurate planet positions — implementation plan + +> **For agentic workers:** REQUIRED SUB-SKILL: use superpowers:subagent-driven-development under the +> lean protocol in `docs/superpowers/conventions/sdd-execution.md`. Steps use checkbox (`- [ ]`) syntax. + +**Goal:** The eight planets match JPL DE (Horizons) to ≤ 1,000 km over 1900–2100, Earth wobbles about +the Earth–Moon barycentre, and every orbit trail stays through its body. + +**Architecture:** Each planet's position is today's Keplerian position plus a generated correction +series: a cubic polynomial plus fitted sinusoids, about 17 kB of constants. The correction is +evaluated in `deriveBodyStates`. A one-row pair table subtracts the Moon's reflex from Earth. Orbit +trails anchor on the snapshot body position, so they follow both corrections without needing to know +about either. + +**Tech stack:** TypeScript, Vitest, tsx tools, the JPL Horizons API. + +**Spec:** `docs/superpowers/specs/2026-10-04-accurate-planet-positions-design.md` + +## Global constraints + +- Accuracy: ≤ **1,000 km** from Horizons for every planet over **1900-01-01 → 2100-01-01**. The fit + stops at ≤ **900 km** on its sample grid, and the tool verifies every planet on the dense 1-day grid + and throws above 1,000 km. +- Outside the span the correction is **frozen at its edge value**: clamp `simDays` to + `[startJd, endJd]`. No fade and no new setting. +- Horizons query: `EPHEM_TYPE='VECTORS'`, `CENTER='500@10'` (Sun centre), `REF_PLANE='FRAME'` + (equatorial ICRF), `TIME_TYPE='UT'`, `OUT_UNITS='KM-S'`, `CSV_FORMAT='YES'`, `VEC_TABLE='1'`. + - Targets: Mercury `199`, Venus `299`, Earth–Moon barycentre `3`, then system barycentres `4`–`8` + for Mars through Neptune. + - Fetch 1-day steps in 50-year chunks, retrying each chunk up to 5 times. +- `OBLIQUITY_DEG = 23.4392911`. +- Earth–Moon pair: `secondaryMassFraction = 1 / 82.30057`, the Moon's share of the pair mass. +- `simDays` stays a UTC Julian date. No runtime TDB conversion: the UT query absorbs the offset. +- Conventions: one symbol per `utils/` and `@types/` file, `type` and never `interface`, and pass and + frame files export only their one symbol. +- Prep (Tasks 1–2) is a **separate PR** on branch `accurate-planets-prep` off `main`. This spec and + plan are committed there too. Features (Tasks 3–6) go on `accurate-planets`, stacked on the prep + branch. Never commit on `main`. + +## Review focus + +1. **Dates outside 1900–2100** (a tour in 1850, a scrub to 2200). Positions stay finite and equal + Kepler plus the frozen edge correction, with no jump at either boundary. Tests are in Task 3. +2. **A camera parked at an Earth surface site with the clock running.** The site keeps its offset from + Earth while Earth wobbles. Tested in Task 6. +3. **Moon, Hubble and the easter eggs after the Earth reflex.** Each still sits on its own trail, + because its trail is centred on the reflexed Earth. Tested in Task 6. +4. **Any element-row edit or frame change without regenerating.** The Horizons check fails loudly + instead of drifting silently. Tested in Task 6. +5. **Chunk seams in the Horizons fetch.** The duplicated boundary row is dropped exactly once, with + no gap and no duplicate. Tested in Task 4. + +--- + +## PR 1: prep (`accurate-planets-prep`) + +### Task 1: Orbit trails anchor on the snapshot body position (P1) + +**Files:** `src/services/engine/frame/passes/orbitTrailsPass.ts:96-109` (modify), +`src/data/bodies/orbitalElements.ts:1-9` (header, modify), +`tests/services/engine/frame/passes/orbitTrailsPass.test.ts` (modify) + +**Before → after** (`orbitTrailsPass.ts:105-109`): + +```ts +// before: centre = focus + centerOffset (focus re-read, conic re-derived: a mirror of deriveBodyStates) +// after: centre = state.positionMpc − keplerianPositionMpc(propagated) + centerOffsetMpc +``` + +The body is now on its trail by construction: any later change to the snapshot position moves the +trail with it. Keep `meanAnomalyRad` as the fade anchor, unchanged. + +- [ ] Add the test `trail follows a snapshot position that differs from raw Kepler`. Stub the states + map so one row's `positionMpc` is the Kepler position plus a 1e6 km vector (converted with + `SCALE_UNITS.KM_TO_MPC`). Read the packed eye-relative km basis (floats 34..45, written by + `eyeRelativeOrbitBasisKm`): the body point `C + A·cosE + B·sinE` at the row's propagated E must + equal the stubbed position, eye-relative in km, to ≤ 1 m. Use km tolerances throughout: + 1e-15 Mpc is 30,000 km. +- [ ] Run that test and confirm it fails against the current code. +- [ ] Implement the after-line. Rewrite the `orbitalElements.ts` header sentence about "a body sitting + on its own trail is structural" so it names the snapshot anchoring. +- [ ] The comparisons against `keplerianEllipse` (`orbitTrailsPass.test.ts:345-378`, `:511-573`) were + exact to 18–20 digits. Loosen them to `toBeCloseTo(…, 15)`, or the relative tolerance f64 can + hold for `(a + b) − b`, and give the reason in one line. +- [ ] `npm test -- orbitTrailsPass`, then commit "Orbit trails anchor on the snapshot body position". + +### Task 2: Exact obliquity (P2) + +**Files:** +- `src/data/bodies/orbitPlaneFrames.ts:72` (and the header comments at `:25`, `:29`, `:77-78`) +- `src/utils/orbit/rotationLookAt.ts:19` +- `src/data/defaults.ts:138-141` +- `tests/data/bodies/orbitPlaneFrames.test.ts:50-53` +- `tests/data/orientation/orientationFrames.test.ts:54` +- `tests/utils/orbit/propagateElements.test.ts:94` +- `tests/services/engine/frame/earthTerminator.test.ts:17` +- `tests/fixtures/bodyStatesJ2000.json` +- `tests/fixtures/camera/settleGoldenTrace.json` +- `tests/fixtures/camera/driverGoldenTrace.json` +- `tools/perf/perfScenarios.ts:52` + +Set `OBLIQUITY_DEG = 23.4392911` and say "IAU J2000 mean obliquity" in its comment. Comments that +say `23.44°` become `23.439°`. Test literals use the exact value; in `orientationFrames.test.ts:54`, +66.56° becomes `90 − 23.4392911`. No new test: this is a constant, and the existing frame tests pin it. + +- [ ] Change the constant, comments and test literals. +- [ ] Regenerate `bodyStatesJ2000.json` with a one-off tsx snippet that is not committed. It + serialises `deriveBodyStates(2451545.0)` for every `ORBITAL_ELEMENTS` id in the fixture's + existing shape (`positionMpc`, `orientation`, `meanAnomalyRad`), leaves anchors out, and keeps + the key order. Diff it: only rotated values may change. +- [ ] Re-record the camera traces with `SETTLE_GOLDEN_RECORD=1` and `DRIVER_GOLDEN_RECORD=1` + (`npm test -- settleGoldenTrace driverGoldenTrace`). The spec rules this. Then run once more + without the flags. +- [ ] Update `EARTH_TARGET` in `perfScenarios.ts:52` to the new J2000 Earth position, taken from the + regenerated fixture. +- [ ] `npm run typecheck:fast`, then `npm test -- orbitPlaneFrames orientationFrames propagateElements earthTerminator deriveBodyStates`. + Commit "Exact J2000 obliquity". + +--- + +## PR 2: feature (`accurate-planets`, stacked on prep) + +### Task 3: Correction type and evaluator + +**Files:** +- `src/@types/scene/EphemerisCorrection.d.ts` (create) +- `src/utils/orbit/ephemerisCorrectionMpc.ts` (create) +- `tests/utils/orbit/ephemerisCorrectionMpc.test.ts` (create) + +**Interfaces, produced:** + +```ts +export type EphemerisCorrection = { + startJd: number; + endJd: number; // fitted span (UTC JD); outside it the edge value is held + polyKm: readonly [Vec3, Vec3, Vec3, Vec3]; // coefficients of τ⁰..τ³, τ = 2(t − startJd)/(endJd − startJd) − 1 + terms: readonly number[]; // flat, 7 per term: ω (rad/day), cos x,y,z (km), sin x,y,z (km); phase ω·(t − startJd) +}; +export function ephemerisCorrectionMpc(c: EphemerisCorrection, simDays: number): Vec3; +``` + +Sum in f64 km, then multiply by `SCALE_UNITS.KM_TO_MPC`. + +- [ ] Test `evaluates polynomial and terms at a known instant`: a hand-built two-term correction, + checked against values worked out by hand. +- [ ] Test `holds the edge value outside the span`: `simDays` 100 years before `startJd` returns + exactly (`toEqual`) the value at `startJd`, and likewise at `endJd`. +- [ ] Test `is continuous across both span edges`: evaluations at edge ± 1e-6 day differ by < 1 m. +- [ ] Implement, `npm test -- ephemerisCorrectionMpc`, then commit "Ephemeris correction evaluator". + +### Task 4: Horizons planet fetcher + +**Files:** +- `tools/parsers/horizonsVectorsCsv.ts` (create) +- `tests/tools/parsers/horizonsVectorsCsv.test.ts` (create) +- `tools/fetch/fetchHorizonsPlanets.ts` (create) +- `tools/utils/io/rawDataRegistry.ts` (add `horizons.planets` and `horizons.planets.readme`, using the + entry shape at `:17-25`) +- `data/raw/horizons/planets/README.md` (create, committed; it records the exact query in Global + constraints) +- `package.json` (add `"fetch-horizons-planets": "tsx tools/fetch/fetchHorizonsPlanets.ts"`) +- `docs/DATA.md` (add a Horizons entry wherever the fetchers are listed) + +**Interfaces, produced:** + +```ts +export type HorizonsVectorRow = { jd: number; xKm: number; yKm: number; zKm: number }; +export function parseHorizonsVectorsCsv(result: string): HorizonsVectorRow[]; // rows between $$SOE/$$EOE +``` + +The output goes to `data/raw/horizons/planets/.csv` with the columns `jd,x_km,y_km,z_km`, +written through `rawDataPath('horizons.planets')`. Chunks are concatenated and a row whose `jd` is ≤ +the previous row's is dropped (Review focus 5). + +- [ ] Test `parses the SOE/EOE block of a Horizons vectors result`: use a trimmed real response + pasted as a string literal, three rows. +- [ ] Test `concatenating two chunks drops the shared boundary row once`, through a small exported + merge step, or by asserting the fetcher's `mergeChunks` if you extract it. Keep it + one-symbol-per-file if extracted. +- [ ] Implement the parser and the fetcher, which writes all eight CSVs. Announce the download size + before running it: 8 × ~3 MB. +- [ ] Run `npm run fetch-horizons-planets`. Commit "Horizons planet fetcher", without the gitignored + CSVs. + +### Task 5: Fit tool and generated corrections · `review: yes` + +**Files:** +- `tools/utils/math/fft.ts` (create) +- `tools/utils/math/fitSinusoidSeries.ts` (create) +- `tests/tools/utils/math/fft.test.ts` (create) +- `tests/tools/utils/math/fitSinusoidSeries.test.ts` (create) +- `tools/bodies/buildPlanetEphemeris.ts` (create, using the `tools/bodies/buildPlanetFacts.ts` + template: banner, prettier, CLI guard) +- `src/data/bodies/planetEphemerisCorrections.generated.ts` (generated) +- `package.json` (add `"build-planet-ephemeris": "tsx tools/bodies/buildPlanetEphemeris.ts"`) + +**Interfaces, produced:** + +```ts +export function fft(re: Float64Array, im: Float64Array): void; // in-place radix-2, length a power of two +export type FitResult = { polyKm: [Vec3, Vec3, Vec3, Vec3]; terms: number[]; maxErrKm: number }; +export function fitSinusoidSeries(tJd: Float64Array, residualKm: [Float64Array, Float64Array, Float64Array], + startJd: number, endJd: number, stopKm: number, maxTerms: number): FitResult; +export const PLANET_EPHEMERIS_CORRECTIONS: Readonly>; // keys: planet ids +``` + +**Method.** The spike is `planetSeriesFit.mts` in the brainstorm scratchpad; it measured ~590 terms. +1. Fit the cubic in τ first. +2. Then loop: + - take the FFT of the residual, zero-padded ×8, with power summed over x, y and z; + - find the peak and refine it parabolically; + - add a cos column and a sin column; + - Gram–Schmidt each new column against the kept ones, which makes it an exact least-squares refit; + - stop when the max 3D error is ≤ `stopKm`. +3. Recover the coefficients of the original basis from the orthogonal one. Keep R, or refit by normal + equations once at the end, so the generated `terms` are plain (ω, cos, sin) amplitudes. +4. The tool computes the residual as `Horizons − keplerianPositionMpc(propagateElements(row, jd))`. + It converts km with the same `MPC_TO_KM` the app uses, imports the `src/` modules directly, and + uses the app's own element rows. + +**Sample steps (days) for fitting:** Mercury 2, Venus 4, Earth 4, Mars 6, Jupiter through Neptune 10. +The tool then **verifies on every 1-day row** with `ephemerisCorrectionMpc` (from Task 3) and throws +if any planet exceeds 1,000 km. That way the shipped evaluator is exactly what gets verified. + +- [ ] Test `fft finds a pure sinusoid's bin`: N = 64, a sinusoid in bin 5, and the power peaks at k = 5. +- [ ] Test `fitSinusoidSeries recovers a synthetic two-term signal`: a cubic plus two sinusoids at + non-bin frequencies. With `stopKm` 1, it should use ≤ 4 terms, and evaluating the result through + `ephemerisCorrectionMpc` reproduces the signal to ≤ 1 km. +- [ ] Implement, then run `npm run build-planet-ephemeris`. Report each planet's term count and + verified max error; expect ~35–180 terms and a total of ~17 kB of numbers. +- [ ] Commit "Planet ephemeris fit tool + generated corrections". + +### Task 6: Wire corrections and the Earth–Moon pair into `deriveBodyStates` · `review: yes` + +**Files:** +- `src/@types/scene/BarycentricPair.d.ts` (create) +- `src/data/bodies/barycentricPairs.ts` (create) +- `src/services/engine/frame/deriveBodyStates.ts:60-68` (modify; the header gains one clause) +- `src/data/bodies/scenePlanets.ts:3` (fix the stale "via keplerianPositionMpc" header) +- `tests/fixtures/horizonsPlanets.json` (create) +- `tests/data/bodies/planetEphemeris.test.ts` (create) +- `tests/services/engine/frame/deriveBodyStates.test.ts` (modify) +- `tests/fixtures/bodyStatesJ2000.json` +- `tests/fixtures/camera/{settle,driver}GoldenTrace.json` +- `tools/perf/perfScenarios.ts:52` +- `docs/backlog/2026-08-16-barycentric-orbit-pairs.md` +- `docs/BACKLOG.md` (the "Barycentric orbit pairs" line) + +**Interfaces:** + +```ts +export type BarycentricPair = { primaryId: string; secondaryId: string; secondaryMassFraction: number }; +export const BARYCENTRIC_PAIRS: readonly BarycentricPair[]; // [{ primaryId: 'earth', secondaryId: 'moon', secondaryMassFraction: 1 / 82.30057 }] +``` + +**1b loop, after this task:** +`position = focus + kepler(el) + correction(el.id) − k · kepler(propagate(secondaryRow))`. +- `correction` is `ephemerisCorrectionMpc(PLANET_EPHEMERIS_CORRECTIONS[el.id], simDays)` when a + correction exists, and zero otherwise. +- The reflex term applies only when `el.id` is a pair's `primaryId`. +- The secondary row comes from `ORBITAL_ELEMENTS` and is propagated inline, because `FOCUS_ORDER` + resolves `earth` before `moon`. +- Resolve pair and correction lookups into id-keyed maps at module load, beside `FOCUS_ORDER`, never + per frame. + +**Fixture.** `tests/fixtures/horizonsPlanets.json` uses the Global constraints query, except with +target `399` (Earth centre) for Earth. +- Dates: 1900-06-01, 1979-03-05, 1980-11-12, 1986-01-24, 1989-08-25 and 2099-06-01 (Voyager flybys + plus both ends). +- Shape: `{ [id]: { [jd]: [xKm, yKm, zKm] } }`. +- The test header records the query URL. + +- [ ] Test `every planet is within 1,000 km of Horizons at the fixture dates`, from `deriveBodyStates` + positions. Earth is compared with Horizons `399` and gets its own tolerance: measure the max, + round up to the next 500 km, and write the measured number in a one-line comment, since it + includes the app Moon's error. This test is Review focus 4. +- [ ] Test `Earth–Moon reflex keeps the barycentre and the separation`. At three dates, with + k = 1/82.30057, (1−k)·Earth + k·Moon equals the corrected EMB (Earth-row Kepler plus the + correction) to ≤ 1 m. Moon − Earth equals the Moon's raw Kepler offset to ≤ 1 m. +- [ ] Test `an Earth surface site keeps its offset from the wobbling Earth` (Review focus 2): a site + hosted on `earth` minus Earth's position is independent of the reflex. Compare with the site + offset computed from `sitePointBodyFixed` and Earth's orientation. +- [ ] Test `Moon, Hubble and Saturn sit on their trails at a non-J2000 date` (Review focus 3): drive + `orbitTrailsPass` packing at a 1989 date. Each body's position lies on its packed conic at its + propagated E, to ≤ 1 m, reading the eye-relative km basis as Task 1's test does. +- [ ] Implement the pair table and the 1b term. Fix the `scenePlanets.ts:3` header. +- [ ] Regenerate `bodyStatesJ2000.json` with Task 2's one-off snippet. Re-record the golden traces + with the record flags, then rerun without them. Update `EARTH_TARGET`. +- [ ] Backlog: in the detail file, add that `BARYCENTRIC_PAIRS` exists, so Pluto's wobble is one row, + while the minor moons still need the invisible node. Update the BACKLOG line's clause to match. +- [ ] `npm run typecheck:fast`, then `npm test -- planetEphemeris deriveBodyStates orbitTrailsPass`. + Commit "Accurate planet positions: corrections + Earth–Moon pair". + +--- + +## Dispatch grouping (controller) + +| PR | Dispatch | Tasks | Model | +|---|---|---|---| +| 1 | A, or inline (< 50 lines of source) | 1, 2 | Sonnet | +| 2 | B | 3, 4, 5 (the tool chain; Task 5 has `review: yes`) | Opus | +| 2 | C | 6 (`review: yes`) | Opus | + +Ask at plan start: parallelism, and whether to run the perf gate. Recommended: no perf gate, because +the per-frame cost is about 590 sinusoids per new `simDays` and trails add nothing. + +## Definition of done + +**Deliverables:** +- `PLANET_EPHEMERIS_CORRECTIONS` (generated) +- `ephemerisCorrectionMpc` +- `BARYCENTRIC_PAIRS` +- `npm run fetch-horizons-planets` and `npm run build-planet-ephemeris` +- `OBLIQUITY_DEG = 23.4392911` +- trails anchored on the snapshot + +**Manual smoke** (the user looks; the dev server stays running): +- The clock set to 1980-11-12: Saturn is where Horizons puts it, and the inspector's position + matches JPL to within ~1,000 km. +- Zoom close to Saturn and Jupiter with time running fast: each stays on its trail. +- Park at Earth with a 1-day/s clock: the Earth–Moon wobble is visible against the trail, and the + Moon stays on its trail. +- Set the clock to 1850 and to 2200: the planets are finite, there is no jump as the clock crosses + 1900 and 2100, and the trails are intact. + +**Out of scope (deferral boundary):** +- moon accuracy +- the Pluto–Charon pair row and Pluto's minor moons +- spacecraft and Voyager (the mission-trails spec is next) +- runtime TDB conversion +- any margin in `orbitReachByRegion` diff --git a/docs/superpowers/specs/2026-10-04-accurate-planet-positions-design.md b/docs/superpowers/specs/2026-10-04-accurate-planet-positions-design.md new file mode 100644 index 0000000000..9ec3c8750f --- /dev/null +++ b/docs/superpowers/specs/2026-10-04-accurate-planet-positions-design.md @@ -0,0 +1,188 @@ +# Accurate planet positions — design spec + +Child of the Voyager mission-trails brainstorm (2026-09-28 → 2026-10-03). Voyager's flybys +are only as honest as the planets they pass: today's Keplerian planets drift from JPL by +98k km at Jupiter up to 1.6M km at Saturn at the flyby dates, 9–16× the miss distances. On +2026-10-03 the user ruled that **the accurate physical planet position is the source of +truth**, independent of any flyby window, and that it ships as its own spec and PR before the +mission-trails spec. + +## 1. What this is + +Heliocentric positions of the eight planets match JPL DE (Horizons) to **≤ 1,000 km over +1900–2100**. That is 3% of the closest planet flyby (Voyager 2 at Neptune, ~29,000 km from +centre). Four parts: + +- **A correction series per planet**, added on top of today's Keplerian position. It is a + cubic polynomial plus fitted sinusoids, generated offline from Horizons and shipped as + constants. All eight planets together take ~590 terms, about 17 kB. A build tool fits it + and checks it against JPL. +- **Earth wobbles around the Earth–Moon barycentre (EMB).** The `earth` element row already + describes the EMB, so Earth = EMB − k·(Moon's geocentric offset), with k the Moon's share of + the pair's mass. +- **Orbit trails follow the corrected body.** Each trail is the same Keplerian conic, + translated so it passes through the body's snapshot position. +- **Exact obliquity.** `OBLIQUITY_DEG` becomes 23.4392911° instead of the rounded 23.44°. + +**Out of scope:** +- Moon accuracy. Moons keep their own element rows. +- Pluto–Charon. That becomes one more pair row later (§6). +- Spacecraft. Mission trails is the next spec and reuses the fetch tool. +- Any runtime TDB time scale. + +## 2. Ground preparation + +Refactor-ground ran on 2026-10-03. It sent an Explore trace over every reader of a planet's +position and over the trail pass, and ran a greenfield cross-check. The user signed off on the +checkpoint. + +| Touchpoint | Verdict | Seam | +|---|---|---| +| Body position (`deriveBodyStates.ts:63-67`) | growth | one added term in the 1b loop; it is the only place positions are composed | +| Orbit trail (`orbitTrailsPass.ts:101-109`) | **bolt-on → P1** | the pass re-propagates each conic and re-folds the focus itself, a mirror of `deriveBodyStates`. The body sits on its trail only because both happen to agree, so adding the correction here would make a second copy | +| Obliquity (`orbitPlaneFrames.ts:72`) | **wrong constant → P2** | the fit is generated against the app's frame, so the constant must be right before the first generation | +| Earth wobble | growth | a new pair table read in the same 1b loop. No focus-graph node: the backlog's invisible-node design is needed only for Pluto's minor moons | +| Synchronous readers at module load (`bodyRegions.ts:29`, `starCatalog/create.ts:63`) | growth | the generated `.ts` is a static import, as with `bodyFacts.generated.ts` | +| Generated data | growth | `tools/bodies/buildPlanetFacts.ts` precedent: banner, prettier, committed output | + +**The greenfield cross-check diverged on three points, all resolved by measurement or ruling:** +- **Residual table → fitted series.** A table needs ~140 kB in f32 (Mercury needs a 13-day + step); the series needs ~17 kB. +- **Sampled trail with a geometric tail → translated conic.** With a translated conic the + worst case is Saturn: 4 px with the whole orbit 1,000 px wide, and 0.34° tangent error close + up. Mercury through Earth stay under 0.1 px. +- **Spacecraft in planet-relative legs → rejected.** With accurate planets, heliocentric + samples are enough. That decision belongs to the mission-trails spec. + +**Prep, as a separate PR (ruled 2026-10-04):** + +- **P1: trails anchor on the snapshot body.** `orbitTrailsPass` takes + `centreMpc = state.positionMpc − keplerianPositionMpc(propagated) + centerOffsetMpc` instead + of `focus + centerOffsetMpc`. + - This is behaviour-neutral today, apart from f64 rounding. + - Once this lands, the body sits on its own trail by construction rather than by coincidence. + - Any later change to a body's position (correction, pair reflex, a moon's parent) moves the + trail with it. + - The 18–20-digit trail tests (`orbitTrailsPass.test.ts:345-378`, `:511-573`) move to a + tolerance that f64 can actually hold. + - The `orbitalElements.ts` header line about the invariant is rewritten to name the new + mechanism. +- **P2: exact obliquity.** `OBLIQUITY_DEG = 23.4392911` (IAU 1980 / J2000 mean obliquity). + - The obliquity literals in tests follow: `orbitPlaneFrames.test.ts:53`, + `orientationFrames.test.ts:54`, and the comments in `propagateElements.test.ts:94` and + `earthTerminator.test.ts:17`. So do the `23.44°` comments in `rotationLookAt.ts` and + `defaults.ts`. + - The fixture `tests/fixtures/bodyStatesJ2000.json` and the camera golden traces are + re-recorded, under this ruling, with `SETTLE_GOLDEN_RECORD=1` and `DRIVER_GOLDEN_RECORD=1`. + +## 3. Data shapes + +```ts +// src/@types/scene/EphemerisCorrection.d.ts — one planet's DE − Kepler correction, km +export type EphemerisCorrection = { + startJd: number; endJd: number; // fitted span; outside it the edge value is held + polyKm: readonly [Vec3, Vec3, Vec3, Vec3]; // cubic in τ = 2(t−start)/(end−start) − 1 + // flat (ω rad/day, cos x,y,z, sin x,y,z) per term; phase measured from startJd + terms: readonly number[]; +}; + +// src/@types/scene/BarycentricPair.d.ts — the primary's element row describes the pair barycentre +export type BarycentricPair = { primaryId: string; secondaryId: string; secondaryMassFraction: number }; + +// src/data/bodies/planetEphemerisCorrections.generated.ts (GENERATED — DO NOT EDIT) +export const PLANET_EPHEMERIS_CORRECTIONS: Readonly>; + +// src/data/bodies/barycentricPairs.ts +export const BARYCENTRIC_PAIRS: readonly BarycentricPair[] = + [{ primaryId: 'earth', secondaryId: 'moon', secondaryMassFraction: 1 / 82.30057 }]; +``` + +**Frame and time are pinned by construction, not converted at runtime.** +- **Frame.** The fit tool computes `DE − app Kepler` in the app's own equatorial frame, so any + residual frame bias is absorbed into the correction. +- **Time.** Horizons is fetched with `TIME_TYPE='UT'`, which is verified to be accepted for + vector tables, so the TDB−UTC gap (~69 s, ~2,000 km at Earth) is absorbed as well. `simDays` + stays a UTC Julian date. +- **Planet targets.** Mercury and Venus use their planet centres (199, 299). Earth through + Neptune use their system barycentres (3–8), because the planet-centre wobble caused by moons + is ≤ 300 km. + +## 4. Runtime + +- **`src/utils/orbit/ephemerisCorrectionMpc.ts`** — + `(c: EphemerisCorrection, simDays: number) => Vec3`. It clamps `simDays` to + `[startJd, endJd]` (the ruled freeze-at-edge), sums the polynomial and the terms in f64 km, + then converts to Mpc. The conversion happens before the sum joins an au-scale position, as in + the site-offset precedent at `deriveBodyStates.ts:88-94`. +- **`deriveBodyStates` 1b:** + `position = focus + kepler(el) + correction(el.id) − pairReflex(el.id)`. + - `pairReflex` is `secondaryMassFraction · keplerianPositionMpc(propagateElements(secondary))` + for a primary listed in `BARYCENTRIC_PAIRS`. + - The secondary's offset is computed inline, because `FOCUS_ORDER` resolves `earth` before + `moon`. + - Dependants of `earth` (the Moon, Hubble, the easter eggs, Earth sites) follow the + reflexed Earth automatically. So Moon = EMB + (1−k)·geo, which is physically right. +- **Cost:** about 590 sinusoid evaluations per new `simDays`, a few µs. The existing one-deep + memo makes paused frames free. Trails add nothing, because P1 reads the snapshot. + +## 5. Tools + +- **`tools/fetch/fetchHorizonsPlanets.ts`** (`npm run fetch-horizons-planets`). + - Fetches 1-day equatorial heliocentric vectors, 1900–2100, in 50-year chunks with retry. + - Writes them to `data/raw/horizons/planets/.csv`. + - The output is gitignored, registered in `rawDataRegistry.ts` with a README next to it + that records the exact API query. +- **`tools/bodies/buildPlanetEphemeris.ts`** (`npm run build-planet-ephemeris`). + - Subtracts the app's Kepler position using the `src/` propagation, imported as + `buildPlanetFacts` imports `src` types. + - Fits each planet greedily: cubic polynomial, then sinusoids. Each frequency is the + zero-padded FFT peak of the remaining residual, and a Gram–Schmidt step refits all + coefficients exactly by least squares. + - Stops once a planet is ≤ 900 km, leaving margin. + - **Verifies every planet on the dense 1-day grid** and throws above 1,000 km. + - Writes the generated file with a banner plus prettier. + - Helpers go one function per file under `tools/utils/math/` (`fft.ts`, + `fitSinusoidSeries.ts`). +- **Regeneration rule:** any edit to a planet's element row or to the frame requires + re-running the build tool. The test in §7 fails until it is re-run. + +## 6. Docs and backlog + +- `scenePlanets.ts:3`: rewrite the stale "positions via keplerianPositionMpc" header. +- `docs/backlog/2026-08-16-barycentric-orbit-pairs.md`: note that the pair table now exists. + Pluto's wobble becomes one `BARYCENTRIC_PAIRS` row; the minor moons still need the invisible + node. The BACKLOG line stays and its clause is updated. +- `docs/DATA.md`: add a Horizons fetch entry. +- `orbitReachByRegion` gets no margin for the correction. ≤ 8M km is negligible against + Pluto's ~50 au reach. Recorded here, not backlogged. + +## 7. Tests + +- **`tests/data/bodies/planetEphemeris.test.ts`.** + - Fixture: a committed Horizons fixture, `tests/fixtures/horizonsPlanets.json`, with 6 dates + × 8 planets, UT, equatorial. + - `deriveBodyStates` must be ≤ 1,000 km from each fixture vector. + - It fails if anyone edits a planet's elements or the frame without regenerating. + - Earth is checked against Horizons 399 (Earth centre) to ≤ 1,000 km plus the Moon-model + error. The tolerance is stated in the test after measurement. +- **`ephemerisCorrectionMpc.test.ts`:** a clamped date returns exactly the edge value + (freeze), with continuity across `startJd` and `endJd`. +- **Pair reflex:** + - Earth–Moon distance is unchanged. + - The EMB, computed as (1−k)·Earth + k·Moon, equals the old Earth position. +- **Re-recorded:** + - `tests/fixtures/bodyStatesJ2000.json` + - the camera golden traces + - `tools/perf/perfScenarios.ts:52` `EARTH_TARGET` + - the 2024-04-08 eclipse test keeps its 2° tolerance, and should tighten. + +## 8. PR sequence + +1. **Prep PR** (separate, ruled): P1 and P2, each its own commit. They are behaviour-neutral + except for the obliquity. +2. **Feature PR**, built on top of it: + - fetch tool and raw-registry entry + - fit tool and helpers + - generated corrections + - pair table and the `deriveBodyStates` term + - tests, docs and backlog edits diff --git a/src/data/bodies/orbitPlaneFrames.ts b/src/data/bodies/orbitPlaneFrames.ts index 2fc9c25919..5dc8c9f39b 100644 --- a/src/data/bodies/orbitPlaneFrames.ts +++ b/src/data/bodies/orbitPlaneFrames.ts @@ -20,13 +20,13 @@ * sits ~15° off Saturn's equator) rides its true plane rather than the shared * equatorial one — hence `planeFrameFromPole` is exported. The ecliptic is * simply the frame of the ecliptic pole, so `planeFrameFromPole` reproduces - * `ECLIPTIC_FRAME` exactly (it equals `planeFrameFromPole(270, 66.56)` to + * `ECLIPTIC_FRAME` exactly (it equals `planeFrameFromPole(270, 66.5607089)` to * floating-point noise); `ECLIPTIC_FRAME` is written out directly from the - * obliquity so the 23.44° has a single, legible source. + * obliquity so the 23.439° has a single, legible source. * * The ecliptic — the plane of Earth's orbit, which every OTHER solar-system * body (the Moon, the planets) also orbits near — is tilted from the scene's - * equatorial xy-plane by Earth's axial tilt, the obliquity ε ≈ 23.44°. The two + * equatorial xy-plane by Earth's axial tilt, the obliquity ε ≈ 23.439°. The two * planes share one line: the equinox, where the Sun crosses the equatorial * plane heading north each spring. That shared line is exactly frame +x, so +x * needs no transform to land in the ecliptic; rotating equatorial +y by ε about @@ -68,14 +68,14 @@ export function planeFrameFromPole(poleRaDeg: number, poleDecDeg: number): Orbit return { xAxis, yAxis, normal }; } -// Earth's axial tilt: the angle between the equatorial and ecliptic planes. -const OBLIQUITY_DEG = 23.44; +// IAU J2000 mean obliquity: the angle between the equatorial and ecliptic planes. +const OBLIQUITY_DEG = 23.4392911; /** * The ecliptic frame: the equinox +x is the shared node, and the y/z axes carry * the obliquity ε — `yAxis` is equatorial +y rotated by ε about +x, `normal` is * equatorial +z rotated the same. Written directly from `OBLIQUITY_DEG` so the - * 23.44° has one source. + * 23.439° has one source. */ const eps = degToRad(OBLIQUITY_DEG); export const ECLIPTIC_FRAME: OrbitPlaneFrame = { diff --git a/src/data/bodies/orbitalElements.ts b/src/data/bodies/orbitalElements.ts index 024a69fb8e..103a0a1138 100644 --- a/src/data/bodies/orbitalElements.ts +++ b/src/data/bodies/orbitalElements.ts @@ -1,12 +1,13 @@ /** * orbitalElements — the J2000 Keplerian table, single source of truth for BOTH body - * positions (`keplerianPositionMpc`) and their trails (`keplerianEllipse`), so a body sitting - * on its own trail is structural rather than an invariant to remember. Per row: `focusId` (the - * Sun for planets, the parent planet for a moon) and `plane` (omitted = ecliptic, which is how - * JPL publishes the planets and the Moon; a planet's own moons ride their OWN Laplace pole — - * see `orbitPlaneFrames.ts`). No buried Mpc/radian literals, and JPL's `L`/`ϖ` columns are - * converted inline (`ω = ϖ − Ω`, `M = L − ϖ`, likewise the rates) so every transcription stays - * checkable against the source: JPL SSD approx_pos.html Table 1 (planets), sats/elem (moons). + * positions (`keplerianPositionMpc`) and their trails (`keplerianEllipse`); the trail pass + * anchors each trail on the snapshot body position, so a body sits on its own trail by + * construction. Per row: `focusId` (the Sun for planets, the parent planet for a moon) and + * `plane` (omitted = ecliptic, which is how JPL publishes the planets and the Moon; a planet's + * own moons ride their OWN Laplace pole — see `orbitPlaneFrames.ts`). No buried Mpc/radian + * literals, and JPL's `L`/`ϖ` columns are converted inline (`ω = ϖ − Ω`, `M = L − ϖ`, + * likewise the rates) so every transcription stays checkable against the source: JPL SSD + * approx_pos.html Table 1 (planets), sats/elem (moons). */ import { SCALE_UNITS } from '../scaleUnits'; diff --git a/src/data/defaults.ts b/src/data/defaults.ts index 101f150d20..fbbc6e769f 100644 --- a/src/data/defaults.ts +++ b/src/data/defaults.ts @@ -135,9 +135,9 @@ export const DEFAULT_FOV_DEG = 60; * * Ecliptic, not equatorial: the descent lands in the solar system, and the * ecliptic frame puts Earth's orbital plane flat so the planets read as a disk - * and Earth's 23.44° obliquity is *desired* — the tilt between the equatorial + * and Earth's 23.439° obliquity is *desired* — the tilt between the equatorial * and ecliptic poles is exactly what makes the seasons legible in that view. * Booting equatorial would instead flatten Earth's equator and rake the orbital - * plane at that same 23.44°, which is the wrong "up" for the arrival scene. + * plane at that same 23.439°, which is the wrong "up" for the arrival scene. */ export const DEFAULT_ORIENTATION: OrientationFrameId = 'ecliptic'; diff --git a/src/services/engine/frame/passes/orbitTrailsPass.ts b/src/services/engine/frame/passes/orbitTrailsPass.ts index dd77c0d804..5ff7f1fb15 100644 --- a/src/services/engine/frame/passes/orbitTrailsPass.ts +++ b/src/services/engine/frame/passes/orbitTrailsPass.ts @@ -15,6 +15,7 @@ import { ORBIT_REACH_BY_REGION } from '../../../../data/bodies/orbitReachByRegio import { CULL_PX, FULL_PX } from '../../../../data/bodies/orbitTrailConstants'; import { regionRelativeDistanceMpc } from '../../../../utils/regions/regionRelativeDistanceMpc'; import { propagateElements } from '../../../../utils/orbit/propagateElements'; +import { keplerianPositionMpc } from '../../../../utils/orbit/keplerianPositionMpc'; import { keplerianEllipse } from '../../../../utils/orbit/keplerianEllipse'; import { composeOrbitConic } from '../../../../utils/camera/composeOrbitConic'; import { sampledDepthBinding } from '../sampledDepthBinding'; @@ -96,17 +97,19 @@ export const orbitTrailsPass: ContentPass = { for (let i = 0; i < limit; i++) { const elements = rows[i]!; // Re-derived at the frame instant, never baked. `keplerianEllipse` returns - // FRESH vectors per call, so the in-place focus fold below cannot alias a + // FRESH vectors per call, so the in-place anchoring below cannot alias a // shared scratch across orbits. const propagated = propagateElements(elements, ctx.snapshot.simDays); const { centerOffsetMpc, semiMajorMpc, semiMinorMpc } = keplerianEllipse(propagated); - // The snapshot seeds anchors (the Sun) alongside every element row, so a - // heliocentric focus and a moving parent are the same lookup. - const focus = states.get(elements.focusId)!.positionMpc; + // Centre = the snapshot body position, less its raw Kepler offset, plus the + // ellipse centre offset: the body sits on its trail by construction, so any + // later correction to the snapshot position moves the trail with it. + const bodyMpc = states.get(elements.id)!.positionMpc; + const keplerMpc = keplerianPositionMpc(propagated); const centerMpc = centerOffsetMpc; - centerMpc[0] += focus[0]; - centerMpc[1] += focus[1]; - centerMpc[2] += focus[2]; + centerMpc[0] += bodyMpc[0] - keplerMpc[0]; + centerMpc[1] += bodyMpc[1] - keplerMpc[1]; + centerMpc[2] += bodyMpc[2] - keplerMpc[2]; const dx = centerMpc[0] - camPos[0]; const dy = centerMpc[1] - camPos[1]; diff --git a/src/utils/orbit/rotationLookAt.ts b/src/utils/orbit/rotationLookAt.ts index fa395fe089..861d3fff15 100644 --- a/src/utils/orbit/rotationLookAt.ts +++ b/src/utils/orbit/rotationLookAt.ts @@ -16,7 +16,7 @@ import { mat3FromColumns } from '../math/mat3FromColumns'; import { normalize3 } from '../math/normalize3'; // Positions are equatorial-world, so the ecliptic pole is the obliquity-tilted -// frame normal rather than +z; `ECLIPTIC_FRAME` owns the 23.44°. +// frame normal rather than +z; `ECLIPTIC_FRAME` owns the 23.439°. // Below this residual length (≈ the boresight-to-pole angle in radians) the // projection has no direction left to carry the roll, so a second, always // non-parallel reference takes over — the equinox, the frame's own +X. diff --git a/tests/data/bodies/orbitPlaneFrames.test.ts b/tests/data/bodies/orbitPlaneFrames.test.ts index 39aee8f5e7..89ae6b0ce2 100644 --- a/tests/data/bodies/orbitPlaneFrames.test.ts +++ b/tests/data/bodies/orbitPlaneFrames.test.ts @@ -47,9 +47,9 @@ describe('orbit plane frames', () => { it('tilts the ecliptic normal from frame +z by the obliquity', () => { // Both are unit vectors, so the dot product is cos(angle) directly. The - // expected obliquity is written as the literal 23.44° in radians rather than + // expected obliquity is written as the literal 23.4392911° in radians rather than // through degToRad, so a broken conversion would not hide behind a mirror. const cosAngle = dot(ECLIPTIC_FRAME.normal, [0, 0, 1]); - expect(Math.acos(cosAngle)).toBeCloseTo((23.44 * Math.PI) / 180, 12); + expect(Math.acos(cosAngle)).toBeCloseTo((23.4392911 * Math.PI) / 180, 12); }); }); diff --git a/tests/data/orientation/orientationFrames.test.ts b/tests/data/orientation/orientationFrames.test.ts index 588230975e..787bdd6ed3 100644 --- a/tests/data/orientation/orientationFrames.test.ts +++ b/tests/data/orientation/orientationFrames.test.ts @@ -51,8 +51,8 @@ describe('ORIENTATION_FRAMES', () => { }); it('ecliptic pole matches the obliquity pole from planeFrameFromPole', () => { - // 66.56° = 90° − 23.44°: the ecliptic north pole in equatorial RA/Dec. - const pole = planeFrameFromPole(270, 66.56).normal; + // 66.5607089° = 90° − 23.4392911°: the ecliptic north pole in equatorial RA/Dec. + const pole = planeFrameFromPole(270, 90 - 23.4392911).normal; const mid = col(ORIENTATION_FRAMES.ecliptic, 1); expect(mid[0]).toBeCloseTo(pole[0], 4); expect(mid[1]).toBeCloseTo(pole[1], 4); diff --git a/tests/fixtures/bodyStatesJ2000.json b/tests/fixtures/bodyStatesJ2000.json index e97a9abef9..17b64148f2 100644 --- a/tests/fixtures/bodyStatesJ2000.json +++ b/tests/fixtures/bodyStatesJ2000.json @@ -1,11 +1,15 @@ { "callisto": { - "positionMpc": [1.9395074114394832e-11, 1.3353048102062752e-11, 5.254328189844694e-12], - "orientation": [-0.17492209617849083,-0.8904283175465342,-0.4201662427894122,0.984536438326655,-0.162305061611009,-0.06591713421039394,-0.009500625010351543,-0.4251993394711415,0.9050498659398374], + "positionMpc": [1.9395074114394832e-11, 1.3353112790826594e-11, 5.254163647580489e-12], + "orientation": [ + -0.17492209617849083, -0.8904283175465342, -0.4201662427894122, 0.984536438326655, + -0.162305061611009, -0.06591713421039394, -0.009500625010351543, -0.4251993394711415, + 0.9050498659398374 + ], "meanAnomalyRad": 1.5254177662430441 }, "charon": { - "positionMpc": [-4.791450444930355e-11, -1.3566802983502213e-10, -2.790299055313828e-11], + "positionMpc": [-4.791450444930355e-11, -1.3566837505179883e-10, -2.7901311982952056e-11], "orientation": [ 0.3334893355513799, 0.43442810728528536, 0.8366941392611901, 0.65509112052934, 0.5314492493346875, -0.5370449880458906, -0.6779679099169169, 0.7272096774535675, @@ -14,49 +18,77 @@ "meanAnomalyRad": 5.307546255314756 }, "deimos": { - "positionMpc": [6.7424822969448034e-12, 6.384457595165361e-15, -1.795630494941746e-13], - "orientation": [-0.4463842202746905,0.6779087814648913,0.5841068497308886,-0.7834711648414804,-0.6114518589447622,0.11090337260394045,0.4323355892726048,-0.40812535844490344,0.8040644439611346], + "positionMpc": [6.7424822969448034e-12, 6.3822415228828266e-15, -1.7956313479591653e-13], + "orientation": [ + -0.4463842202746905, 0.6779087814648913, 0.5841068497308886, -0.7834711648414804, + -0.6114518589447622, 0.11090337260394045, 0.4323355892726048, -0.40812535844490344, + 0.8040644439611346 + ], "meanAnomalyRad": 3.5779249665883754 }, "dione": { - "positionMpc": [3.1097913153309065e-11, 2.9839498609464e-11, 1.0980813348118515e-11], - "orientation": [0.1500314083433411,-0.9868524640256249,0.060106495132111006,0.9849676241424642,0.14392708758779407,-0.0955184424582236,0.08561165751031316,0.07353371815057563,0.9936113105200084], + "positionMpc": [3.1097913153309065e-11, 2.983963447795244e-11, 1.0980444303639635e-11], + "orientation": [ + 0.1500314083433411, -0.9868524640256249, 0.060106495132111006, 0.9849676241424642, + 0.14392708758779407, -0.0955184424582236, 0.08561165751031316, 0.07353371815057563, + 0.9936113105200084 + ], "meanAnomalyRad": 3.7000980142279785 }, "earth": { - "positionMpc": [-8.589504546518782e-13, 4.302223432556485e-12, 1.865304005019885e-12], + "positionMpc": [-8.589504546518782e-13, 4.302246510960393e-12, 1.8652507750193955e-12], "orientation": [ 0.1761742596326785, -0.9843589945964214, 0, 0.9843589945964214, 0.1761742596326785, 0, 0, 0, 1 ], "meanAnomalyRad": -0.04316391697638581 }, "enceladus": { - "positionMpc": [3.1104454125073664e-11, 2.982129424379336e-11, 1.0981597288866233e-11], - "orientation": [-0.6101639042418044,0.79225204377477,-0.006058803107722217,-0.7876361177972574,-0.6057470523491235,0.11269363119366291,0.08561165751031316,0.07353371815057563,0.9936113105200084], + "positionMpc": [3.1104454125073664e-11, 2.9821430112281805e-11, 1.0981228244387354e-11], + "orientation": [ + -0.6101639042418044, 0.79225204377477, -0.006058803107722217, -0.7876361177972574, + -0.6057470523491235, 0.11269363119366291, 0.08561165751031316, 0.07353371815057563, + 0.9936113105200084 + ], "meanAnomalyRad": 0.9948376736367678 }, "europa": { - "positionMpc": [1.9366208544821226e-11, 1.3288486688770912e-11, 5.223331413650205e-12], - "orientation": [0.8440426953875887,0.47876521241452585,0.24161084359880872,-0.5360821137690424,0.7653676116425182,0.35612973246493035,-0.014418587301453609,-0.43011195104333155,0.902660408963376], + "positionMpc": [1.9366208544821226e-11, 1.3288551377534754e-11, 5.2231668713859995e-12], + "orientation": [ + 0.8440426953875887, 0.47876521241452585, 0.24161084359880872, -0.5360821137690424, + 0.7653676116425182, 0.35612973246493035, -0.014418587301453609, -0.43011195104333155, + 0.902660408963376 + ], "meanAnomalyRad": 6.028367236388414 }, "ganymede": { - "positionMpc": [1.935782125182158e-11, 1.327889867944624e-11, 5.2186285300575744e-12], - "orientation": [0.7670029894074187,0.5750114317615406,0.28472489807466117,-0.6415017437254595,0.6965288928160546,0.3214389744098182,-0.013488033113756947,-0.42919617288133427,0.903110579135655], + "positionMpc": [1.935782125182158e-11, 1.3278963368210082e-11, 5.218463987793369e-12], + "orientation": [ + 0.7670029894074187, 0.5750114317615406, 0.28472489807466117, -0.6415017437254595, + 0.6965288928160546, 0.3214389744098182, -0.013488033113756947, -0.42919617288133427, + 0.903110579135655 + ], "meanAnomalyRad": 5.668829410477583 }, "iapetus": { - "positionMpc": [3.112403542854821e-11, 2.9938815769420106e-11, 1.0993574885840525e-11], - "orientation": [-0.21672383799832437,-0.9676171771685296,-0.12941320060829367,0.9570764250126249,-0.18446342993435108,-0.2235575087128771,0.19244608265259502,-0.17230856468922595,0.9660612112109715], + "positionMpc": [3.112403542854821e-11, 2.993895163790855e-11, 1.0993205841361646e-11], + "orientation": [ + -0.21672383799832437, -0.9676171771685296, -0.12941320060829367, 0.9570764250126249, + -0.18446342993435108, -0.2235575087128771, 0.19244608265259502, -0.17230856468922595, + 0.9660612112109715 + ], "meanAnomalyRad": 1.3055062804917585 }, "io": { - "positionMpc": [1.9397356297216674e-11, 1.3302582071640613e-11, 5.2304387922836454e-12], - "orientation": [-0.9506246068355796,-0.2738659162314874,-0.1459805357072911,0.30999719228532685,-0.8601582721252644,-0.40500554029506025,-0.014649151986168717,-0.43026178870679127,0.9025852843498605], + "positionMpc": [1.9397356297216674e-11, 1.3302646760404455e-11, 5.23027425001944e-12], + "orientation": [ + -0.9506246068355796, -0.2738659162314874, -0.1459805357072911, 0.30999719228532685, + -0.8601582721252644, -0.40500554029506025, -0.014649151986168717, -0.43026178870679127, + 0.9025852843498605 + ], "meanAnomalyRad": 5.775294494849236 }, "jupiter": { - "positionMpc": [1.938440693074091e-11, 1.3298849430765319e-11, 5.228454608751198e-12], + "positionMpc": [1.938440693074091e-11, 1.3298914119529161e-11, 5.2282900664869925e-12], "orientation": [ 0.22825610082668613, -0.8802468632436776, -0.41601035105519185, 0.9734916178676621, 0.19993790151295504, 0.1110806260335145, -0.014602136035502334, -0.4303374202742101, @@ -65,7 +97,7 @@ "meanAnomalyRad": 0.34327067101878284 }, "mars": { - "positionMpc": [6.7421474995208884e-12, 6.8954934330600985e-15, -1.7911067654834298e-13], + "positionMpc": [6.7421474995208884e-12, 6.893277360777564e-15, -1.791107618500849e-13], "orientation": [ -0.7067491138500313, -0.7065745401448309, 0.035469836358746884, 0.5490428766969101, -0.5794164477979991, -0.6023524712072909, 0.4461587269353554, -0.4062376142607543, @@ -74,7 +106,7 @@ "meanAnomalyRad": 0.3384227896851049 }, "mercury": { - "positionMpc": [-6.306874292609911e-13, -1.942141141157702e-12, -9.72034974689076e-13], + "positionMpc": [-6.306874292609911e-13, -1.942153167646951e-12, -9.720109452033183e-13], "orientation": [ 0.9314951469471263, -0.27146527694401956, -0.24212268507444376, 0.3520893147390993, 0.8400821208129223, 0.4126683229144372, 0.09137781820826621, -0.46964735036425953, @@ -83,12 +115,16 @@ "meanAnomalyRad": 3.050705107870811 }, "mimas": { - "positionMpc": [3.109980743972915e-11, 2.982140995496761e-11, 1.0982152797121401e-11], - "orientation": [-0.0067762384652490515,0.9972926234328449,-0.07322230424328367,-0.9963055388236075,-0.00046426434886024867,0.08587815652431914,0.08561165751031316,0.07353371815057563,0.9936113105200084], + "positionMpc": [3.109980743972915e-11, 2.982154582345605e-11, 1.0981783752642522e-11], + "orientation": [ + -0.0067762384652490515, 0.9972926234328449, -0.07322230424328367, -0.9963055388236075, + -0.00046426434886024867, 0.08587815652431914, 0.08561165751031316, 0.07353371815057563, + 0.9936113105200084 + ], "meanAnomalyRad": 4.804891430740389 }, "moon": { - "positionMpc": [-8.684282394279855e-13, 4.293715726229506e-12, 1.8628749417615773e-12], + "positionMpc": [-8.684282394279855e-13, 4.293738774580142e-12, 1.8628218170240537e-12], "orientation": [ 0.7845965380655952, 0.5687413064909984, 0.24686352251070906, -0.6200066702864299, 0.7197447865505031, 0.3123446350326911, -0.000035437512628813665, -0.3981215499370551, @@ -97,7 +133,7 @@ "meanAnomalyRad": 2.3609068791727297 }, "neptune": { - "positionMpc": [8.147178919019027e-11, -1.1141464182571051e-10, -4.763257192058855e-11], + "positionMpc": [8.147178919019027e-11, -1.1141523115780291e-10, -4.7631193423792595e-11], "orientation": [ 0.018461554711798778, -0.731133128996666, -0.6819849842050542, 0.9343480499713713, 0.2554057808141049, -0.24851882955106883, 0.3558832568586489, -0.6326232961330795, @@ -106,12 +142,16 @@ "meanAnomalyRad": -1.746809150875549 }, "phobos": { - "positionMpc": [6.742083325040046e-12, 6.612080728136197e-15, -1.7921372187202975e-13], - "orientation": [0.21437170084218637,0.9136615583170651,0.34535102538093126,-0.8689765057514275,0.016949534034514047,0.49456298461171994,0.4460096482477342,-0.4061222354779966,0.7975839288252284], + "positionMpc": [6.742083325040046e-12, 6.609864655853662e-15, -1.7921380717377167e-13], + "orientation": [ + 0.21437170084218637, 0.9136615583170651, 0.34535102538093126, -0.8689765057514275, + 0.016949534034514047, 0.49456298461171994, 0.4460096482477342, -0.4061222354779966, + 0.7975839288252284 + ], "meanAnomalyRad": 3.3108895910332428 }, "pluto": { - "positionMpc": [-4.791428248023062e-11, -1.3566774569531757e-10, -2.790246761511439e-11], + "positionMpc": [-4.791428248023062e-11, -1.3566809091209427e-10, -2.7900789044928168e-11], "orientation": [ -0.3334893355513804, -0.4344281072852858, -0.8366941392611896, -0.6550911205293397, -0.5314492493346873, 0.5370449880458912, -0.6779679099169169, 0.7272096774535675, @@ -130,8 +170,12 @@ "meanAnomalyRad": 0.08515672394345941 }, "rhea": { - "positionMpc": [3.1115776493412146e-11, 2.98215761066705e-11, 1.0980684148716999e-11], - "orientation": [-0.9382412075174634,0.34145382677816394,0.055791761889368914,-0.33523213510967576,-0.937076695569866,0.09750221643464865,0.08557366479227414,0.07277740582357002,0.9936702657801585], + "positionMpc": [3.1115776493412146e-11, 2.9821711975158945e-11, 1.098031510423812e-11], + "orientation": [ + -0.9382412075174634, 0.34145382677816394, 0.055791761889368914, -0.33523213510967576, + -0.937076695569866, 0.09750221643464865, 0.08557366479227414, 0.07277740582357002, + 0.9936702657801585 + ], "meanAnomalyRad": 0.5497787143782138 }, "s1": { @@ -320,7 +364,7 @@ "meanAnomalyRad": 5.630129826433361 }, "saturn": { - "positionMpc": [3.1099752807904804e-11, 2.9827398693151044e-11, 1.0981551367914625e-11], + "positionMpc": [3.1099752807904804e-11, 2.9827534561639487e-11, 1.0981182323435745e-11], "orientation": [ -0.9801892579246128, 0.18502086117224825, 0.07068450735682215, -0.1786683742380381, -0.9800019411711303, 0.08760027025045486, 0.0854788318610716, 0.07323575787752883, @@ -329,17 +373,25 @@ "meanAnomalyRad": -0.7442892730041829 }, "tethys": { - "positionMpc": [3.1108738218666247e-11, 2.9830450110316054e-11, 1.0980470694683058e-11], - "orientation": [-0.9415593714971506,-0.32012363104449437,0.10481798887967395,0.3257861170219318,-0.9445176828105657,0.04183004678376551,0.08561165751031316,0.07353371815057563,0.9936113105200084], + "positionMpc": [3.1108738218666247e-11, 2.9830585978804496e-11, 1.0980101650204179e-11], + "orientation": [ + -0.9415593714971506, -0.32012363104449437, 0.10481798887967395, 0.3257861170219318, + -0.9445176828105657, 0.04183004678376551, 0.08561165751031316, 0.07353371815057563, + 0.9936113105200084 + ], "meanAnomalyRad": 0 }, "titan": { - "positionMpc": [3.111648567869407e-11, 2.9792764657318893e-11, 1.0982498512163092e-11], - "orientation": [-0.4351255139787793,0.8999577882506432,-0.027235389692707796,-0.8960258662696234,-0.4298602432577761,0.11116572422350515,0.08833704806293895,0.07277465653217519,0.9934286161099598], + "positionMpc": [3.111648567869407e-11, 2.9792900525807336e-11, 1.0982129467684212e-11], + "orientation": [ + -0.4351255139787793, 0.8999577882506432, -0.027235389692707796, -0.8960258662696234, + -0.4298602432577761, 0.11116572422350515, 0.08833704806293895, 0.07277465653217519, + 0.9934286161099598 + ], "meanAnomalyRad": 0.20420352248333654 }, "uranus": { - "positionMpc": [6.993663216219453e-11, -6.064674486105524e-11, -2.7552288916504907e-11], + "positionMpc": [6.993663216219453e-11, -6.06470857509395e-11, -2.755153855411126e-11], "orientation": [ -0.8693317262684063, 0.3040596708473847, -0.3896281127785479, 0.44645103553580323, 0.1449623050604645, -0.8829877705724841, -0.2119995815377986, -0.9415591572895124, @@ -348,7 +400,7 @@ "meanAnomalyRad": 2.48332127460649 }, "venus": { - "positionMpc": [-3.4824959657808e-12, -2.2458100936506426e-13, 1.1936386084274154e-13], + "positionMpc": [-3.4824959657808e-12, -2.2457953250190632e-13, 1.1936663949337553e-13], "orientation": [ -0.954821497429634, 0.2665104385944917, 0.13148419740182907, -0.296591573568662, -0.8824137725799873, -0.36521140788482953, 0.018690814168902045, -0.38770880836179883, @@ -362,12 +414,12 @@ "meanAnomalyRad": 2.1093550674103057 }, "whale": { - "positionMpc": [-8.589504546518782e-13, 4.302442865722174e-12, 1.865304005019885e-12], + "positionMpc": [-8.589504546518782e-13, 4.3024659441260814e-12, 1.8652507750193955e-12], "orientation": [-1, 1.2246467991473532e-16, 0, -1.2246467991473532e-16, -1, 0, 0, 0, 1], "meanAnomalyRad": 0 }, "petunias": { - "positionMpc": [-8.589504533555665e-13, 4.30244286572217e-12, 1.865304005019885e-12], + "positionMpc": [-8.589504533555665e-13, 4.3024659441260774e-12, 1.8652507750193955e-12], "orientation": [ 0.31895930929807, -0.9477684100095857, 0, -0.5730199417863159, -0.19284251607872754, 0.7965299180241964, -0.7549258939308582, -0.25406063248824595, -0.6045991148623748 @@ -375,25 +427,25 @@ "meanAnomalyRad": -0.000005907546891153448 }, "voyager1": { - "positionMpc": [-9.849911903784252e-11, -3.472694889308621e-10, 7.700732265421764e-11], + "positionMpc": [-9.849911903784252e-11, -3.47268536120473e-10, 7.701161928836898e-11], "orientation": [ - 0.26209637816188736, 0.9437270931800531, -0.20170439299219164, -0.9486015462831995, - 0.2903566657747011, 0.12588928877915567, 0.1773713475833796, 0.1583419724461146, - 0.971322410334658 + 0.2620963781618873, 0.9437245974921663, -0.2017160693714547, -0.9486015462831995, + 0.29035822333520933, 0.1258856962912936, 0.17737134758337958, 0.15835399025559568, + 0.9713204511522379 ], "meanAnomalyRad": 21.812722680769564 }, "voyager2": { - "positionMpc": [7.68472828852993e-11, -1.8208692576490295e-10, -2.1201749638295566e-10], + "positionMpc": [7.68472828852993e-11, -1.820895489669245e-10, -2.120152434709163e-10], "orientation": [ - -0.26417090791453673, 0.6336504634512483, 0.7271181620477015, -0.9569166485951118, - -0.2664011872494653, -0.11550296564839521, 0.12051663392705755, -0.7263039980614822, - 0.6767261213717097 + -0.26417090791453673, 0.6336594597733262, 0.7271103220635683, -0.956916648595112, + -0.2664026163055799, -0.11549966955381757, 0.12051663392705765, -0.7262956251178432, + 0.6767351076171333 ], "meanAnomalyRad": 12.997179255974443 }, "hubble": { - "positionMpc": [-8.5896919141719e-13, 4.3024188450404305e-12, 1.8652002002526575e-12], + "positionMpc": [-8.5896919141719e-13, 4.302441923444338e-12, 1.865146970252168e-12], "orientation": [ -6.123233995736766e-17, 6.123233995736766e-17, 1, -6.123233995736766e-17, -1, 6.123233995736766e-17, 1, -6.123233995736766e-17, 6.123233995736766e-17 diff --git a/tests/fixtures/camera/driverGoldenTrace.json b/tests/fixtures/camera/driverGoldenTrace.json index 825918f1c4..9257d51b8c 100644 --- a/tests/fixtures/camera/driverGoldenTrace.json +++ b/tests/fixtures/camera/driverGoldenTrace.json @@ -3,15 +3,31 @@ "label": "boot 0", "winner": "resting", "displayed": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.7, 0.3, 1.23882029118e-15, 0 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.7, + 0.3, + 1.23882029118e-15, + 0 ], "register": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.7, 0.3, 1.23882029118e-15, 0 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.7, + 0.3, + 1.23882029118e-15, + 0 ], "follow": { "fromDistance": null, "distanceTarget": null, - "panOffset": [0, 0, 0] + "panOffset": [ + 0, + 0, + 0 + ] }, "epochs": { "tween": { @@ -35,21 +51,39 @@ "refNull": true } }, - "actions": ["engine/engineScaleChanged"] + "actions": [ + "engine/engineScaleChanged" + ] }, { "label": "boot 3", "winner": "resting", "displayed": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.7, 0.3, 1.23882029118e-15, 0 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.7, + 0.3, + 1.23882029118e-15, + 0 ], "register": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.7, 0.3, 1.23882029118e-15, 0 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.7, + 0.3, + 1.23882029118e-15, + 0 ], "follow": { "fromDistance": null, "distanceTarget": null, - "panOffset": [0, 0, 0] + "panOffset": [ + 0, + 0, + 0 + ] }, "epochs": { "tween": { @@ -73,21 +107,39 @@ "refNull": true } }, - "actions": ["engine/engineScaleChanged"] + "actions": [ + "engine/engineScaleChanged" + ] }, { "label": "drag 0", "winner": "orbitDrag", "displayed": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.7, 0.3, 1.23882029118e-15, 0 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.7, + 0.3, + 1.23882029118e-15, + 0 ], "register": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.7, 0.3, 1.23882029118e-15, 0 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.7, + 0.3, + 1.23882029118e-15, + 0 ], "follow": { "fromDistance": null, "distanceTarget": null, - "panOffset": [0, 0, 0] + "panOffset": [ + 0, + 0, + 0 + ] }, "epochs": { "tween": { @@ -111,21 +163,39 @@ "refNull": true } }, - "actions": ["engine/engineScaleChanged"] + "actions": [ + "engine/engineScaleChanged" + ] }, { "label": "drag end", "winner": "resting", "displayed": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.61, 0.3, 1.23882029118e-15, 0 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.61, + 0.3, + 1.23882029118e-15, + 0 ], "register": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.61, 0.3, 1.23882029118e-15, 0 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.61, + 0.3, + 1.23882029118e-15, + 0 ], "follow": { "fromDistance": null, "distanceTarget": null, - "panOffset": [0, 0, 0] + "panOffset": [ + 0, + 0, + 0 + ] }, "epochs": { "tween": { @@ -149,21 +219,41 @@ "refNull": true } }, - "actions": ["camera/commitCameraPose", "camera/endDrag", "engine/engineScaleChanged"] + "actions": [ + "camera/commitCameraPose", + "camera/endDrag", + "engine/engineScaleChanged" + ] }, { "label": "follow 0", "winner": "followApproach", "displayed": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.61, 0.3, 1.23882029118e-15, 0 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.61, + 0.3, + 1.23882029118e-15, + 0 ], "register": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.61, 0.3, 1.23882029118e-15, 0 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.61, + 0.3, + 1.23882029118e-15, + 0 ], "follow": { "fromDistance": 1.23882029118e-15, "distanceTarget": 8.95283314668e-16, - "panOffset": [0, 0, 0] + "panOffset": [ + 0, + 0, + 0 + ] }, "epochs": { "tween": { @@ -187,21 +277,39 @@ "refNull": true } }, - "actions": ["engine/engineScaleChanged"] + "actions": [ + "engine/engineScaleChanged" + ] }, { "label": "follow 7", "winner": "followApproach", "displayed": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.61, 0.3, 1.08011618333e-15, 0 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.61, + 0.3, + 1.08011618333e-15, + 0 ], "register": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.61, 0.3, 1.08011618333e-15, 0 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.61, + 0.3, + 1.08011618333e-15, + 0 ], "follow": { "fromDistance": 1.23882029118e-15, "distanceTarget": 8.95283314668e-16, - "panOffset": [0, 0, 0] + "panOffset": [ + 0, + 0, + 0 + ] }, "epochs": { "tween": { @@ -225,21 +333,39 @@ "refNull": true } }, - "actions": ["engine/engineScaleChanged"] + "actions": [ + "engine/engineScaleChanged" + ] }, { "label": "follow 9", "winner": "followApproach", "displayed": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.61, 0.3, 1.04608780247e-15, 0 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.61, + 0.3, + 1.04608780247e-15, + 0 ], "register": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.61, 0.3, 1.04608780247e-15, 0 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.61, + 0.3, + 1.04608780247e-15, + 0 ], "follow": { "fromDistance": 1.23882029118e-15, "distanceTarget": 8.95283314668e-16, - "panOffset": [0, 0, 0] + "panOffset": [ + 0, + 0, + 0 + ] }, "epochs": { "tween": { @@ -263,23 +389,39 @@ "refNull": true } }, - "actions": ["engine/engineScaleChanged"] + "actions": [ + "engine/engineScaleChanged" + ] }, { "label": "notch under follow a", "winner": "followApproach", "displayed": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.61, 0.3, 9.91065552e-16, - 2.94167982154e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.61, + 0.3, + 9.91065552e-16, + 0 ], "register": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.61, 0.3, 9.91065552e-16, - 2.94167982154e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.61, + 0.3, + 9.91065552e-16, + 0 ], "follow": { "fromDistance": 1.23882029118e-15, "distanceTarget": 8.29734065771e-16, - "panOffset": [0, 0, 0] + "panOffset": [ + 0, + 0, + 0 + ] }, "epochs": { "tween": { @@ -303,23 +445,39 @@ "refNull": true } }, - "actions": ["camera/commitCameraPose", "engine/engineScaleChanged"] + "actions": [ + "engine/engineScaleChanged" + ] }, { "label": "notch under follow b", "winner": "followApproach", "displayed": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.61, 0.3, 9.74097988688e-16, - 3.14314171398e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.61, + 0.3, + 9.74097988688e-16, + 0 ], "register": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.61, 0.3, 9.74097988688e-16, - 3.14314171398e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.61, + 0.3, + 9.74097988688e-16, + 0 ], "follow": { "fromDistance": 1.23882029118e-15, "distanceTarget": 8.29734065771e-16, - "panOffset": [0, 0, 0] + "panOffset": [ + 0, + 0, + 0 + ] }, "epochs": { "tween": { @@ -343,23 +501,39 @@ "refNull": true } }, - "actions": ["engine/engineScaleChanged"] + "actions": [ + "engine/engineScaleChanged" + ] }, { "label": "follow settle 0", "winner": "followApproach", "displayed": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.61, 0.3, 9.583638658e-16, - 3.32995853114e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.61, + 0.3, + 9.583638658e-16, + 0 ], "register": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.61, 0.3, 9.583638658e-16, - 3.32995853114e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.61, + 0.3, + 9.583638658e-16, + 0 ], "follow": { "fromDistance": 1.23882029118e-15, "distanceTarget": 8.29734065771e-16, - "panOffset": [0, 0, 0] + "panOffset": [ + 0, + 0, + 0 + ] }, "epochs": { "tween": { @@ -383,23 +557,39 @@ "refNull": true } }, - "actions": ["engine/engineScaleChanged"] + "actions": [ + "engine/engineScaleChanged" + ] }, { "label": "follow settle 3", "winner": "followApproach", "displayed": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.61, 0.3, 9.1809669046e-16, - 3.80806497446e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.61, + 0.3, + 9.1809669046e-16, + 0 ], "register": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.61, 0.3, 9.1809669046e-16, - 3.80806497446e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.61, + 0.3, + 9.1809669046e-16, + 0 ], "follow": { "fromDistance": 1.23882029118e-15, "distanceTarget": 8.29734065771e-16, - "panOffset": [0, 0, 0] + "panOffset": [ + 0, + 0, + 0 + ] }, "epochs": { "tween": { @@ -423,23 +613,39 @@ "refNull": true } }, - "actions": ["engine/engineScaleChanged"] + "actions": [ + "engine/engineScaleChanged" + ] }, { "label": "follow settle 11", "winner": "followApproach", "displayed": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.61, 0.3, 8.53383734397e-16, - 4.5764248358e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.61, + 0.3, + 8.53383734397e-16, + 0 ], "register": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.61, 0.3, 8.53383734397e-16, - 4.5764248358e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.61, + 0.3, + 8.53383734397e-16, + 0 ], "follow": { "fromDistance": 1.23882029118e-15, "distanceTarget": 8.29734065771e-16, - "panOffset": [0, 0, 0] + "panOffset": [ + 0, + 0, + 0 + ] }, "epochs": { "tween": { @@ -463,23 +669,39 @@ "refNull": true } }, - "actions": ["engine/engineScaleChanged"] + "actions": [ + "engine/engineScaleChanged" + ] }, { "label": "follow settle 19", "winner": "followApproach", "displayed": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.61, 0.3, 8.31864465622e-16, - 4.8319307403e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.61, + 0.3, + 8.31864465622e-16, + 0 ], "register": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.61, 0.3, 8.31864465622e-16, - 4.8319307403e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.61, + 0.3, + 8.31864465622e-16, + 0 ], "follow": { "fromDistance": 1.23882029118e-15, "distanceTarget": 8.29734065771e-16, - "panOffset": [0, 0, 0] + "panOffset": [ + 0, + 0, + 0 + ] }, "epochs": { "tween": { @@ -503,23 +725,39 @@ "refNull": true } }, - "actions": ["engine/engineScaleChanged"] + "actions": [ + "engine/engineScaleChanged" + ] }, { "label": "follow settle 23", "winner": "followApproach", "displayed": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.61, 0.3, 8.29855276505e-16, - 4.85578655474e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.61, + 0.3, + 8.29855276505e-16, + 0 ], "register": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.61, 0.3, 8.29855276505e-16, - 4.85578655474e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.61, + 0.3, + 8.29855276505e-16, + 0 ], "follow": { "fromDistance": 1.23882029118e-15, "distanceTarget": 8.29734065771e-16, - "panOffset": [0, 0, 0] + "panOffset": [ + 0, + 0, + 0 + ] }, "epochs": { "tween": { @@ -543,23 +781,39 @@ "refNull": true } }, - "actions": ["engine/engineScaleChanged"] + "actions": [ + "engine/engineScaleChanged" + ] }, { "label": "autoRotate 0", "winner": "followApproach", "displayed": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.61, 0.3, 8.2976024729e-16, - 4.85691487029e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.61, + 0.3, + 8.2976024729e-16, + 0 ], "register": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.61, 0.3, 8.2976024729e-16, - 4.85691487029e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.61, + 0.3, + 8.2976024729e-16, + 0 ], "follow": { "fromDistance": 1.23882029118e-15, "distanceTarget": 8.29734065771e-16, - "panOffset": [0, 0, 0] + "panOffset": [ + 0, + 0, + 0 + ] }, "epochs": { "tween": { @@ -583,23 +837,39 @@ "refNull": true } }, - "actions": ["engine/engineScaleChanged"] + "actions": [ + "engine/engineScaleChanged" + ] }, { "label": "autoRotate 2", "winner": "followApproach", "displayed": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.61, 0.3, 8.29734065771e-16, - 4.85722573274e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.61, + 0.3, + 8.29734065771e-16, + 0 ], "register": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.61, 0.3, 8.29734065771e-16, - 4.85722573274e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.61, + 0.3, + 8.29734065771e-16, + 0 ], "follow": { "fromDistance": 1.23882029118e-15, "distanceTarget": 8.29734065771e-16, - "panOffset": [0, 0, 0] + "panOffset": [ + 0, + 0, + 0 + ] }, "epochs": { "tween": { @@ -623,23 +893,39 @@ "refNull": true } }, - "actions": ["engine/engineScaleChanged"] + "actions": [ + "engine/engineScaleChanged" + ] }, { "label": "notch under autoRotate a", "winner": "autoRotate", "displayed": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.61, 0.3, 8.29734065771e-16, - 4.85722573274e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.61, + 0.3, + 8.29734065771e-16, + 0 ], "register": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.61, 0.3, 8.29734065771e-16, - 4.85722573274e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.61, + 0.3, + 8.29734065771e-16, + 0 ], "follow": { "fromDistance": 1.23882029118e-15, "distanceTarget": 8.29734065771e-16, - "panOffset": [0, 0, 0] + "panOffset": [ + 0, + 0, + 0 + ] }, "epochs": { "tween": { @@ -663,23 +949,40 @@ "refNull": true } }, - "actions": ["camera/commitCameraPose", "camera/commitCameraPose", "engine/engineScaleChanged"] + "actions": [ + "camera/commitCameraPose", + "engine/engineScaleChanged" + ] }, { "label": "notch under autoRotate b", "winner": "autoRotate", "displayed": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.61, 0.3, 8.29734065771e-16, - 4.85722573274e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.61, + 0.3, + 8.29734065771e-16, + 0 ], "register": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.61, 0.3, 8.29734065771e-16, - 4.85722573274e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.61, + 0.3, + 8.29734065771e-16, + 0 ], "follow": { "fromDistance": 1.23882029118e-15, "distanceTarget": 8.29734065771e-16, - "panOffset": [0, 0, 0] + "panOffset": [ + 0, + 0, + 0 + ] }, "epochs": { "tween": { @@ -703,23 +1006,39 @@ "refNull": true } }, - "actions": ["engine/engineScaleChanged"] + "actions": [ + "engine/engineScaleChanged" + ] }, { "label": "autoRotate settle 0", "winner": "autoRotate", "displayed": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.61083808, 0.3, 8.29734065771e-16, - 4.85722573274e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.61083808, + 0.3, + 8.29734065771e-16, + 0 ], "register": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.61083808, 0.3, 8.29734065771e-16, - 4.85722573274e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.61083808, + 0.3, + 8.29734065771e-16, + 0 ], "follow": { "fromDistance": 1.23882029118e-15, "distanceTarget": 8.29734065771e-16, - "panOffset": [0, 0, 0] + "panOffset": [ + 0, + 0, + 0 + ] }, "epochs": { "tween": { @@ -743,23 +1062,39 @@ "refNull": true } }, - "actions": ["engine/engineScaleChanged"] + "actions": [ + "engine/engineScaleChanged" + ] }, { "label": "autoRotate settle 2", "winner": "autoRotate", "displayed": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.61251424, 0.3, 8.29734065771e-16, - 4.85722573274e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.61251424, + 0.3, + 8.29734065771e-16, + 0 ], "register": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.61251424, 0.3, 8.29734065771e-16, - 4.85722573274e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.61251424, + 0.3, + 8.29734065771e-16, + 0 ], "follow": { "fromDistance": 1.23882029118e-15, "distanceTarget": 8.29734065771e-16, - "panOffset": [0, 0, 0] + "panOffset": [ + 0, + 0, + 0 + ] }, "epochs": { "tween": { @@ -783,23 +1118,39 @@ "refNull": true } }, - "actions": ["engine/engineScaleChanged"] + "actions": [ + "engine/engineScaleChanged" + ] }, { "label": "tween 0", "winner": "tween", "displayed": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.61251424, 0.3, 8.29734065771e-16, - 4.85722573274e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.61251424, + 0.3, + 8.29734065771e-16, + 0 ], "register": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.61251424, 0.3, 8.29734065771e-16, - 4.85722573274e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.61251424, + 0.3, + 8.29734065771e-16, + 0 ], "follow": { "fromDistance": 1.23882029118e-15, "distanceTarget": 8.29734065771e-16, - "panOffset": [0, 0, 0] + "panOffset": [ + 0, + 0, + 0 + ] }, "epochs": { "tween": { @@ -823,23 +1174,40 @@ "refNull": true } }, - "actions": ["camera/commitCameraPose", "engine/engineScaleChanged"] + "actions": [ + "camera/commitCameraPose", + "engine/engineScaleChanged" + ] }, { "label": "tween 1", "winner": "tween", "displayed": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.66956424, 0.3, 8.88904476337e-16, - 4.85722573274e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.66956424, + 0.3, + 8.88904476337e-16, + 0 ], "register": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.66956424, 0.3, 8.88904476337e-16, - 4.85722573274e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.66956424, + 0.3, + 8.88904476337e-16, + 0 ], "follow": { "fromDistance": 1.23882029118e-15, "distanceTarget": 8.29734065771e-16, - "panOffset": [0, 0, 0] + "panOffset": [ + 0, + 0, + 0 + ] }, "epochs": { "tween": { @@ -863,23 +1231,39 @@ "refNull": true } }, - "actions": ["engine/engineScaleChanged"] + "actions": [ + "engine/engineScaleChanged" + ] }, { "label": "tween 3", "winner": "tween", "displayed": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.76686424, 0.3, 9.89820882086e-16, - 4.85722573274e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.76686424, + 0.3, + 9.89820882086e-16, + 0 ], "register": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.76686424, 0.3, 9.89820882086e-16, - 4.85722573274e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.76686424, + 0.3, + 9.89820882086e-16, + 0 ], "follow": { "fromDistance": 1.23882029118e-15, "distanceTarget": 8.29734065771e-16, - "panOffset": [0, 0, 0] + "panOffset": [ + 0, + 0, + 0 + ] }, "epochs": { "tween": { @@ -903,23 +1287,39 @@ "refNull": true } }, - "actions": ["engine/engineScaleChanged"] + "actions": [ + "engine/engineScaleChanged" + ] }, { "label": "tween 11", "winner": "tween", "displayed": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.97606424, 0.3, 1.20679634029e-15, - 4.85722573274e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.97606424, + 0.3, + 1.20679634029e-15, + 0 ], "register": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.97606424, 0.3, 1.20679634029e-15, - 4.85722573274e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.97606424, + 0.3, + 1.20679634029e-15, + 0 ], "follow": { "fromDistance": 1.23882029118e-15, "distanceTarget": 8.29734065771e-16, - "panOffset": [0, 0, 0] + "panOffset": [ + 0, + 0, + 0 + ] }, "epochs": { "tween": { @@ -943,23 +1343,39 @@ "refNull": true } }, - "actions": ["engine/engineScaleChanged"] + "actions": [ + "engine/engineScaleChanged" + ] }, { "label": "tween 19", "winner": "tween", "displayed": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 1.01246424, 0.3, 1.24454924028e-15, - 4.85722573274e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 1.01246424, + 0.3, + 1.24454924028e-15, + 0 ], "register": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 1.01246424, 0.3, 1.24454924028e-15, - 4.85722573274e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 1.01246424, + 0.3, + 1.24454924028e-15, + 0 ], "follow": { "fromDistance": 1.23882029118e-15, "distanceTarget": 8.29734065771e-16, - "panOffset": [0, 0, 0] + "panOffset": [ + 0, + 0, + 0 + ] }, "epochs": { "tween": { @@ -983,23 +1399,39 @@ "refNull": true } }, - "actions": ["engine/engineScaleChanged"] + "actions": [ + "engine/engineScaleChanged" + ] }, { "label": "tween 20", "winner": "tween", "displayed": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 1.01251424, 0.3, 1.24460109866e-15, - 4.85722573274e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 1.01251424, + 0.3, + 1.24460109866e-15, + 0 ], "register": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 1.01251424, 0.3, 1.24460109866e-15, - 4.85722573274e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 1.01251424, + 0.3, + 1.24460109866e-15, + 0 ], "follow": { "fromDistance": 1.23882029118e-15, "distanceTarget": 8.29734065771e-16, - "panOffset": [0, 0, 0] + "panOffset": [ + 0, + 0, + 0 + ] }, "epochs": { "tween": { @@ -1023,23 +1455,40 @@ "refNull": true } }, - "actions": ["camera/cancelCameraTween", "engine/engineScaleChanged"] + "actions": [ + "camera/cancelCameraTween", + "engine/engineScaleChanged" + ] }, { "label": "tween 21", "winner": "autoRotate", "displayed": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 1.01251424, 0.3, 1.24460109866e-15, - 4.85722573274e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 1.01251424, + 0.3, + 1.24460109866e-15, + 0 ], "register": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 1.01251424, 0.3, 1.24460109866e-15, - 4.85722573274e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 1.01251424, + 0.3, + 1.24460109866e-15, + 0 ], "follow": { "fromDistance": 1.23882029118e-15, "distanceTarget": 8.29734065771e-16, - "panOffset": [0, 0, 0] + "panOffset": [ + 0, + 0, + 0 + ] }, "epochs": { "tween": { @@ -1063,23 +1512,40 @@ "refNull": true } }, - "actions": ["camera/commitCameraPose", "engine/engineScaleChanged"] + "actions": [ + "camera/commitCameraPose", + "engine/engineScaleChanged" + ] }, { "label": "tween 22", "winner": "autoRotate", "displayed": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 1.01251424, 0.3, 1.24460109866e-15, - 4.85722573274e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 1.01251424, + 0.3, + 1.24460109866e-15, + 0 ], "register": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 1.01251424, 0.3, 1.24460109866e-15, - 4.85722573274e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 1.01251424, + 0.3, + 1.24460109866e-15, + 0 ], "follow": { "fromDistance": 1.23882029118e-15, "distanceTarget": 8.29734065771e-16, - "panOffset": [0, 0, 0] + "panOffset": [ + 0, + 0, + 0 + ] }, "epochs": { "tween": { @@ -1103,23 +1569,39 @@ "refNull": true } }, - "actions": ["engine/engineScaleChanged"] + "actions": [ + "engine/engineScaleChanged" + ] }, { "label": "tween 23", "winner": "autoRotate", "displayed": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 1.01335232, 0.3, 1.24460109866e-15, - 4.85722573274e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 1.01335232, + 0.3, + 1.24460109866e-15, + 0 ], "register": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 1.01335232, 0.3, 1.24460109866e-15, - 4.85722573274e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 1.01335232, + 0.3, + 1.24460109866e-15, + 0 ], "follow": { "fromDistance": 1.23882029118e-15, "distanceTarget": 8.29734065771e-16, - "panOffset": [0, 0, 0] + "panOffset": [ + 0, + 0, + 0 + ] }, "epochs": { "tween": { @@ -1143,23 +1625,39 @@ "refNull": true } }, - "actions": ["engine/engineScaleChanged"] + "actions": [ + "engine/engineScaleChanged" + ] }, { "label": "clip 0", "winner": "clip", "displayed": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 1.01335232, 0.3, 1.24460109866e-15, - 4.85722573274e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 1.01335232, + 0.3, + 1.24460109866e-15, + 0 ], "register": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 1.01335232, 0.3, 1.24460109866e-15, - 4.85722573274e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 1.01335232, + 0.3, + 1.24460109866e-15, + 0 ], "follow": { "fromDistance": 1.23882029118e-15, "distanceTarget": 8.29734065771e-16, - "panOffset": [0, 0, 0] + "panOffset": [ + 0, + 0, + 0 + ] }, "epochs": { "tween": { @@ -1183,23 +1681,40 @@ "refNull": false } }, - "actions": ["camera/commitCameraPose", "engine/engineScaleChanged"] + "actions": [ + "camera/commitCameraPose", + "engine/engineScaleChanged" + ] }, { "label": "clip 1", "winner": "clip", "displayed": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 1.01375444386, 0.3, - 1.24460109866e-15, 4.85722573274e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 1.01375444386, + 0.3, + 1.24460109866e-15, + 0 ], "register": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 1.01375444386, 0.3, - 1.24460109866e-15, 4.85722573274e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 1.01375444386, + 0.3, + 1.24460109866e-15, + 0 ], "follow": { "fromDistance": 1.23882029118e-15, "distanceTarget": 8.29734065771e-16, - "panOffset": [0, 0, 0] + "panOffset": [ + 0, + 0, + 0 + ] }, "epochs": { "tween": { @@ -1223,23 +1738,39 @@ "refNull": false } }, - "actions": ["engine/engineScaleChanged"] + "actions": [ + "engine/engineScaleChanged" + ] }, { "label": "clip 3", "winner": "clip", "displayed": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 1.02420966421, 0.3, - 1.24460109866e-15, 4.85722573274e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 1.02420966421, + 0.3, + 1.24460109866e-15, + 0 ], "register": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 1.02420966421, 0.3, - 1.24460109866e-15, 4.85722573274e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 1.02420966421, + 0.3, + 1.24460109866e-15, + 0 ], "follow": { "fromDistance": 1.23882029118e-15, "distanceTarget": 8.29734065771e-16, - "panOffset": [0, 0, 0] + "panOffset": [ + 0, + 0, + 0 + ] }, "epochs": { "tween": { @@ -1263,23 +1794,39 @@ "refNull": false } }, - "actions": ["engine/engineScaleChanged"] + "actions": [ + "engine/engineScaleChanged" + ] }, { "label": "clip 11", "winner": "clip", "displayed": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 1.54857917721, 0.3, - 1.24460109866e-15, 4.85722573274e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 1.54857917721, + 0.3, + 1.24460109866e-15, + 0 ], "register": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 1.54857917721, 0.3, - 1.24460109866e-15, 4.85722573274e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 1.54857917721, + 0.3, + 1.24460109866e-15, + 0 ], "follow": { "fromDistance": 1.23882029118e-15, "distanceTarget": 8.29734065771e-16, - "panOffset": [0, 0, 0] + "panOffset": [ + 0, + 0, + 0 + ] }, "epochs": { "tween": { @@ -1303,23 +1850,39 @@ "refNull": false } }, - "actions": ["engine/engineScaleChanged"] + "actions": [ + "engine/engineScaleChanged" + ] }, { "label": "clip 19", "winner": "clip", "displayed": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 2.49728989311, 0.3, - 1.24460109866e-15, 4.85722573274e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 2.49728989311, + 0.3, + 1.24460109866e-15, + 0 ], "register": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 2.49728989311, 0.3, - 1.24460109866e-15, 4.85722573274e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 2.49728989311, + 0.3, + 1.24460109866e-15, + 0 ], "follow": { "fromDistance": 1.23882029118e-15, "distanceTarget": 8.29734065771e-16, - "panOffset": [0, 0, 0] + "panOffset": [ + 0, + 0, + 0 + ] }, "epochs": { "tween": { @@ -1343,23 +1906,39 @@ "refNull": false } }, - "actions": ["engine/engineScaleChanged"] + "actions": [ + "engine/engineScaleChanged" + ] }, { "label": "clip 27", "winner": "clip", "displayed": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 1.01656931088, 0.3, - 1.24460109866e-15, 4.85722573274e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 1.01656931088, + 0.3, + 1.24460109866e-15, + 0 ], "register": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 1.01656931088, 0.3, - 1.24460109866e-15, 4.85722573274e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 1.01656931088, + 0.3, + 1.24460109866e-15, + 0 ], "follow": { "fromDistance": 1.23882029118e-15, "distanceTarget": 8.29734065771e-16, - "panOffset": [0, 0, 0] + "panOffset": [ + 0, + 0, + 0 + ] }, "epochs": { "tween": { @@ -1383,23 +1962,39 @@ "refNull": false } }, - "actions": ["engine/engineScaleChanged"] + "actions": [ + "engine/engineScaleChanged" + ] }, { "label": "clip 35", "winner": "clip", "displayed": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 1.41547617966, 0.3, - 1.24460109866e-15, 4.85722573274e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 1.41547617966, + 0.3, + 1.24460109866e-15, + 0 ], "register": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 1.41547617966, 0.3, - 1.24460109866e-15, 4.85722573274e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 1.41547617966, + 0.3, + 1.24460109866e-15, + 0 ], "follow": { "fromDistance": 1.23882029118e-15, "distanceTarget": 8.29734065771e-16, - "panOffset": [0, 0, 0] + "panOffset": [ + 0, + 0, + 0 + ] }, "epochs": { "tween": { @@ -1423,23 +2018,39 @@ "refNull": false } }, - "actions": ["engine/engineScaleChanged"] + "actions": [ + "engine/engineScaleChanged" + ] }, { "label": "clip 37", "winner": "clip", "displayed": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 1.70822234949, 0.3, - 1.24460109866e-15, 4.85722573274e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 1.70822234949, + 0.3, + 1.24460109866e-15, + 0 ], "register": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 1.70822234949, 0.3, - 1.24460109866e-15, 4.85722573274e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 1.70822234949, + 0.3, + 1.24460109866e-15, + 0 ], "follow": { "fromDistance": 1.23882029118e-15, "distanceTarget": 8.29734065771e-16, - "panOffset": [0, 0, 0] + "panOffset": [ + 0, + 0, + 0 + ] }, "epochs": { "tween": { @@ -1463,23 +2074,39 @@ "refNull": false } }, - "actions": ["engine/engineScaleChanged"] + "actions": [ + "engine/engineScaleChanged" + ] }, { "label": "teardown 0", "winner": "resting", "displayed": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 1.70822234949, 0.3, - 1.24460109866e-15, 4.85722573274e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 1.70822234949, + 0.3, + 1.24460109866e-15, + 0 ], "register": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 1.70822234949, 0.3, - 1.24460109866e-15, 4.85722573274e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 1.70822234949, + 0.3, + 1.24460109866e-15, + 0 ], "follow": { "fromDistance": 1.23882029118e-15, "distanceTarget": 8.29734065771e-16, - "panOffset": [0, 0, 0] + "panOffset": [ + 0, + 0, + 0 + ] }, "epochs": { "tween": { @@ -1503,23 +2130,40 @@ "refNull": true } }, - "actions": ["camera/commitCameraPose", "engine/engineScaleChanged"] + "actions": [ + "camera/commitCameraPose", + "engine/engineScaleChanged" + ] }, { "label": "teardown 1", "winner": "resting", "displayed": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 1.70822234949, 0.3, - 1.24460109866e-15, 4.85722573274e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 1.70822234949, + 0.3, + 1.24460109866e-15, + 0 ], "register": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 1.70822234949, 0.3, - 1.24460109866e-15, 4.85722573274e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 1.70822234949, + 0.3, + 1.24460109866e-15, + 0 ], "follow": { "fromDistance": 1.23882029118e-15, "distanceTarget": 8.29734065771e-16, - "panOffset": [0, 0, 0] + "panOffset": [ + 0, + 0, + 0 + ] }, "epochs": { "tween": { @@ -1543,23 +2187,39 @@ "refNull": true } }, - "actions": ["engine/engineScaleChanged"] + "actions": [ + "engine/engineScaleChanged" + ] }, { "label": "teardown 5", "winner": "resting", "displayed": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 1.70822234949, 0.3, - 1.24460109866e-15, 4.85722573274e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 1.70822234949, + 0.3, + 1.24460109866e-15, + 0 ], "register": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 1.70822234949, 0.3, - 1.24460109866e-15, 4.85722573274e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 1.70822234949, + 0.3, + 1.24460109866e-15, + 0 ], "follow": { "fromDistance": 1.23882029118e-15, "distanceTarget": 8.29734065771e-16, - "panOffset": [0, 0, 0] + "panOffset": [ + 0, + 0, + 0 + ] }, "epochs": { "tween": { @@ -1583,23 +2243,39 @@ "refNull": true } }, - "actions": ["engine/engineScaleChanged"] + "actions": [ + "engine/engineScaleChanged" + ] }, { "label": "refocus 0", "winner": "followApproach", "displayed": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 1.70822234949, 0.3, - 1.24460109866e-15, 4.85722573274e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 1.70822234949, + 0.3, + 1.24460109866e-15, + 0 ], "register": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 1.70822234949, 0.3, - 1.24460109866e-15, 4.85722573274e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 1.70822234949, + 0.3, + 1.24460109866e-15, + 0 ], "follow": { "fromDistance": 1.24460109866e-15, "distanceTarget": 8.95283314668e-16, - "panOffset": [0, 0, 0] + "panOffset": [ + 0, + 0, + 0 + ] }, "epochs": { "tween": { @@ -1623,23 +2299,39 @@ "refNull": true } }, - "actions": ["engine/engineScaleChanged"] + "actions": [ + "engine/engineScaleChanged" + ] }, { "label": "refocus 3", "winner": "followApproach", "displayed": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 1.70822234949, 0.3, - 1.16729288125e-15, 4.85722573274e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 1.70822234949, + 0.3, + 1.16729288125e-15, + 0 ], "register": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 1.70822234949, 0.3, - 1.16729288125e-15, 4.85722573274e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 1.70822234949, + 0.3, + 1.16729288125e-15, + 0 ], "follow": { "fromDistance": 1.24460109866e-15, "distanceTarget": 8.95283314668e-16, - "panOffset": [0, 0, 0] + "panOffset": [ + 0, + 0, + 0 + ] }, "epochs": { "tween": { @@ -1663,23 +2355,39 @@ "refNull": true } }, - "actions": ["engine/engineScaleChanged"] + "actions": [ + "engine/engineScaleChanged" + ] }, { "label": "pan 0", "winner": "orbitDrag", "displayed": [ - -8.58953059185e-13, 4.30214531476e-12, 1.86531224046e-12, 1.70822234949, 0.3, - 1.16729288125e-15, 4.85722573274e-17 + -8.58953059185e-13, + 4.30216839327e-12, + 1.86525901142e-12, + 1.70822234949, + 0.3, + 1.16729288125e-15, + 0 ], "register": [ - -8.58953059185e-13, 4.30214531476e-12, 1.86531224046e-12, 1.70822234949, 0.3, - 1.16729288125e-15, 4.85722573274e-17 + -8.58953059185e-13, + 4.30216839327e-12, + 1.86525901142e-12, + 1.70822234949, + 0.3, + 1.16729288125e-15, + 0 ], "follow": { "fromDistance": 1.24460109866e-15, "distanceTarget": 8.95283314668e-16, - "panOffset": [-2.60453313039e-18, -7.81177960581e-17, 8.23543884596e-18] + "panOffset": [ + -2.60453313039e-18, + -7.81176941581e-17, + 8.23640536814e-18 + ] }, "epochs": { "tween": { @@ -1703,23 +2411,40 @@ "refNull": true } }, - "actions": ["camera/commitCameraPose", "engine/engineScaleChanged"] + "actions": [ + "camera/commitCameraPose", + "engine/engineScaleChanged" + ] }, { "label": "pan 1", "winner": "orbitDrag", "displayed": [ - -8.58955663718e-13, 4.30206719696e-12, 1.8653204759e-12, 1.70822234949, 0.3, - 1.16729288125e-15, 4.85722573274e-17 + -8.58955663718e-13, + 4.30209027557e-12, + 1.86526724783e-12, + 1.70822234949, + 0.3, + 1.16729288125e-15, + 0 ], "register": [ - -8.58955663718e-13, 4.30206719696e-12, 1.8653204759e-12, 1.70822234949, 0.3, - 1.16729288125e-15, 4.85722573274e-17 + -8.58955663718e-13, + 4.30209027557e-12, + 1.86526724783e-12, + 1.70822234949, + 0.3, + 1.16729288125e-15, + 0 ], "follow": { "fromDistance": 1.24460109866e-15, "distanceTarget": 8.95283314668e-16, - "panOffset": [-5.20906626077e-18, -1.56235592116e-16, 1.64708776919e-17] + "panOffset": [ + -5.20906626077e-18, + -1.56235388316e-16, + 1.64728107363e-17 + ] }, "epochs": { "tween": { @@ -1743,23 +2468,39 @@ "refNull": true } }, - "actions": ["engine/engineScaleChanged"] + "actions": [ + "engine/engineScaleChanged" + ] }, { "label": "pan end", "winner": "followApproach", "displayed": [ - -8.58958268251e-13, 4.30198907917e-12, 1.86532871134e-12, 1.70822234949, 0.3, - 1.20888694702e-15, 4.85722573274e-17 + -8.58958268251e-13, + 4.30201215788e-12, + 1.86527548424e-12, + 1.70822234949, + 0.3, + 1.20888694702e-15, + 0 ], "register": [ - -8.58958268251e-13, 4.30198907917e-12, 1.86532871134e-12, 1.70822234949, 0.3, - 1.20888694702e-15, 4.85722573274e-17 + -8.58958268251e-13, + 4.30201215788e-12, + 1.86527548424e-12, + 1.70822234949, + 0.3, + 1.20888694702e-15, + 0 ], "follow": { "fromDistance": 1.24460109866e-15, "distanceTarget": 1.16729288125e-15, - "panOffset": [-7.81359939116e-18, -2.34353388174e-16, 2.47063165379e-17] + "panOffset": [ + -7.81359939116e-18, + -2.34353082474e-16, + 2.47092161044e-17 + ] }, "epochs": { "tween": { @@ -1783,23 +2524,41 @@ "refNull": true } }, - "actions": ["camera/commitCameraPose", "camera/endDrag", "engine/engineScaleChanged"] + "actions": [ + "camera/commitCameraPose", + "camera/endDrag", + "engine/engineScaleChanged" + ] }, { "label": "pan settle 0", "winner": "followApproach", "displayed": [ - -8.58958268251e-13, 4.30198907917e-12, 1.86532871134e-12, 1.70822234949, 0.3, - 1.20492839979e-15, 4.85722573274e-17 + -8.58958268251e-13, + 4.30201215788e-12, + 1.86527548424e-12, + 1.70822234949, + 0.3, + 1.20492839979e-15, + 0 ], "register": [ - -8.58958268251e-13, 4.30198907917e-12, 1.86532871134e-12, 1.70822234949, 0.3, - 1.20492839979e-15, 4.85722573274e-17 + -8.58958268251e-13, + 4.30201215788e-12, + 1.86527548424e-12, + 1.70822234949, + 0.3, + 1.20492839979e-15, + 0 ], "follow": { "fromDistance": 1.24460109866e-15, "distanceTarget": 1.16729288125e-15, - "panOffset": [-7.81359939116e-18, -2.34353388174e-16, 2.47063165379e-17] + "panOffset": [ + -7.81359939116e-18, + -2.34353082474e-16, + 2.47092161044e-17 + ] }, "epochs": { "tween": { @@ -1823,23 +2582,39 @@ "refNull": true } }, - "actions": ["engine/engineScaleChanged"] + "actions": [ + "engine/engineScaleChanged" + ] }, { "label": "pan settle 3", "winner": "followApproach", "displayed": [ - -8.58958268251e-13, 4.30198907917e-12, 1.86532871134e-12, 1.70822234949, 0.3, - 1.19457445869e-15, 4.85722573274e-17 + -8.58958268251e-13, + 4.30201215788e-12, + 1.86527548424e-12, + 1.70822234949, + 0.3, + 1.19457445869e-15, + 0 ], "register": [ - -8.58958268251e-13, 4.30198907917e-12, 1.86532871134e-12, 1.70822234949, 0.3, - 1.19457445869e-15, 4.85722573274e-17 + -8.58958268251e-13, + 4.30201215788e-12, + 1.86527548424e-12, + 1.70822234949, + 0.3, + 1.19457445869e-15, + 0 ], "follow": { "fromDistance": 1.24460109866e-15, "distanceTarget": 1.16729288125e-15, - "panOffset": [-7.81359939116e-18, -2.34353388174e-16, 2.47063165379e-17] + "panOffset": [ + -7.81359939116e-18, + -2.34353082474e-16, + 2.47092161044e-17 + ] }, "epochs": { "tween": { @@ -1863,6 +2638,8 @@ "refNull": true } }, - "actions": ["engine/engineScaleChanged"] + "actions": [ + "engine/engineScaleChanged" + ] } ] diff --git a/tests/fixtures/camera/settleGoldenTrace.json b/tests/fixtures/camera/settleGoldenTrace.json index 7f4c6293ef..a92851fe34 100644 --- a/tests/fixtures/camera/settleGoldenTrace.json +++ b/tests/fixtures/camera/settleGoldenTrace.json @@ -5,10 +5,22 @@ "arm": "absolute", "hr": 5, "displayed": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.7, 0.3, 1.23882029118e-15, 0 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.7, + 0.3, + 1.23882029118e-15, + 0 ], "register": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.7, 0.3, 1.23882029118e-15, 0 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.7, + 0.3, + 1.23882029118e-15, + 0 ], "memory": 0 }, @@ -17,12 +29,22 @@ "arm": "absolute", "hr": 4.69959329559, "displayed": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.7, 0.3, 1.17679530434e-15, - 1.57809567882e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.7, + 0.3, + 1.17679530435e-15, + 7.36444650118e-18 ], "register": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.7, 0.3, 1.17679530434e-15, - 1.57809567882e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.7, + 0.3, + 1.17679530435e-15, + 7.36444650118e-18 ], "memory": 0 }, @@ -31,354 +53,734 @@ "arm": "earth", "hr": 0.408531953689, "displayed": [ - -8.58823383762e-13, 4.30206074691e-12, 1.86529997395e-12, 0.7, 0.300000000001, - 8.43496123045e-17, -0.0199078845974 + -8.58823383762e-13, + 4.30208382526e-12, + 1.86524674597e-12, + 0.7, + 0.299999999999, + 8.43496123044e-17, + -0.0199073133356 ], "register": [ - 0, 0, 0, 7933156.7443, 4190780.91606, -175201.198913, -0.449691619429, 0.861174146953, - 0.236973703258, 0.127481010064, -0.200714484013, 0.971319869034, -0.884039614208, - -0.467004051939, 0.0195237287359 + 0, + 0, + 0, + 7933158.87757, + 4190780.53426, + -175113.714869, + -0.449694432696, + 0.861174548827, + 0.236966904135, + 0.127469437126, + -0.200712858741, + 0.971321723702, + -0.88403985193, + -0.467004009393, + 0.01951397986 ], "memory": 0 }, { "label": "dive 39", "arm": "earth", - "hr": 0.0615681608777, + "hr": 0.0615681608771, "displayed": [ - -8.58815842396e-13, 4.30206705766e-12, 1.86531150914e-12, 0.763865797113, 0.340617140441, - 1.27119833966e-17, -0.255763657587 + -8.58815842393e-13, + 4.30209013615e-12, + 1.86525828107e-12, + 0.763865807331, + 0.340617091539, + 1.27119833965e-17, + -0.255756288997 ], "register": [ - 0, 0, 0, 5819025.68697, 3438051.22141, 245569.950366, -0.509248289938, 0.860308071321, - 0.023156027636, -0.0189715330061, -0.038121513736, 0.999093004242, -0.860410518375, - -0.508347098557, -0.0357346786504 + 0, + 0, + 0, + 5819022.64155, + 3438051.86992, + 245633.027437, + -0.509248730504, + 0.860307829721, + 0.0231553147304, + -0.0189799082836, + -0.0381256553536, + 0.999092687134, + -0.860410072908, + -0.508347196829, + -0.0357440052922 ], "memory": 0 }, { "label": "dive brisk 0", "arm": "earth", - "hr": 0.0456277801718, + "hr": 0.0456277801724, "displayed": [ - -8.5881543796e-13, 4.30206742725e-12, 1.86531192452e-12, 0.767221244995, 0.342024345681, - 9.42077070426e-18, -0.270229276841 + -8.58815437959e-13, + 4.30209050575e-12, + 1.86525869645e-12, + 0.767221245664, + 0.342024316219, + 9.42077070425e-18, + -0.270221482753 ], "register": [ - 0, 0, 0, 5722204.69758, 3401369.82706, 255404.532694, -0.511247578567, 0.859378454033, - 0.00972554130965, -0.0276544886274, -0.0277600193841, 0.999232010387, -0.858988441522, - -0.510585990865, -0.0379579143748 + 0, + 0, + 0, + 5722201.57312, + 3401370.42056, + 255466.623119, + -0.51124791987, + 0.859378254518, + 0.0097252295442, + -0.0276626493212, + -0.0277645251701, + 0.999231659314, + -0.858987975621, + -0.510586081678, + -0.0379672350284 ], "memory": 0 }, { "label": "dive brisk 35", "arm": "earth", - "hr": 0.00000239999873797, + "hr": 0.00000240000070995, "displayed": [ - -8.58814244798e-13, 4.30206852826e-12, 1.86531302813e-12, 0.776946766818, 0.345361094401, - 4.95528126563e-22, -0.282917596025 + -8.58814244804e-13, + 4.30209160677e-12, + 1.86525980005e-12, + 0.77694673987, + 0.34536113635, + 4.95528126503e-22, + -0.282909410527 ], "register": [ - 0, 0, 0, 5445558.39002, 3295179.717, 278424.647066, -0.517708829899, 0.855556875634, - -3.88623138878e-9, -0.0373893521034, -0.0226247890665, 0.99904462126, -0.854739494696, - -0.517214222035, -0.0437017703418 + 0, + 0, + 0, + 5445555.10972, + 3295180.12262, + 278483.997844, + -0.517709104819, + 0.855556709276, + -3.87938092761e-9, + -0.0373973149811, + -0.0226296239348, + 0.999044213713, + -0.854738979817, + -0.517214285701, + -0.0437110860907 ], "memory": 0 }, { "label": "tilt 1 move 0", "arm": "earth", - "hr": 0.00000248496732813, + "hr": 0.00000248496508704, "displayed": [ - -8.58814244798e-13, 4.30206852826e-12, 1.86531302813e-12, 0.752741251018, 0.26482712059, - 5.1487696487e-22, -0.275640450238 + -8.58814244804e-13, + 4.30209160677e-12, + 1.86525980005e-12, + 0.752741906691, + 0.264826976113, + 5.1487696481e-22, + -0.275632471139 ], "register": [ - 0, 0, 0, 5445558.90184, 3295180.0267, 278423.358061, -0.517708829899, 0.855556875634, - -3.8862327037e-9, 0.0342645351442, 0.0207339298939, 0.999197701049, -0.854870463331, - -0.517293472515, 0.0400493972176 - ], - "memory": 0.0837755978624 + 0, + 0, + 0, + 5445555.62154, + 3295180.43233, + 278482.708845, + -0.517709104819, + 0.855556709276, + -3.87938117741e-9, + 0.0342565571094, + 0.0207291173096, + 0.999198074453, + -0.854870616574, + -0.517293940529, + 0.0400400800377 + ], + "memory": 0.0837755978623 }, { "label": "tilt 1 move 3", "arm": "earth", - "hr": 0.00000263277105872, + "hr": 0.00000263277160673, "displayed": [ - -8.58814244798e-13, 4.30206852826e-12, 1.86531302814e-12, 0.684987943457, 0.0225617062629, - 5.75605631392e-22, -0.265862865903 + -8.58814244804e-13, + 4.30209160677e-12, + 1.86525980006e-12, + 0.684990514444, + 0.02256104076, + 5.7560563135e-22, + -0.265855190469 ], "register": [ - 0, 0, 0, 5445559.86179, 3295180.60758, 278419.255521, -0.517708829899, 0.855556875634, - -3.88623658254e-9, 0.245785690831, 0.14872819067, 0.9578461878, -0.81949189235, - -0.495885428154, 0.287281535288 + 0, + 0, + 0, + 5445556.58153, + 3295181.01323, + 278478.606315, + -0.517709104819, + 0.855556709276, + -3.87938191293e-9, + 0.245778001551, + 0.148723645672, + 0.957848866561, + -0.819494024835, + -0.495887078306, + 0.287272603686 ], "memory": 0.33510235913 }, { "label": "tilt 1 end", "arm": "earth", - "hr": 0.00000240000085916, + "hr": 0.0000023999998191, "displayed": [ - -8.58814244839e-13, 4.30206852831e-12, 1.86531302955e-12, 0.304150654493, -0.931252262711, - 2.17004580495e-21, -0.455729267585 + -8.58814244845e-13, + 4.30209160682e-12, + 1.86525980147e-12, + 0.304162643125, + -0.931255732717, + 2.17004580513e-21, + -0.455717746089 ], "register": [ - 0, 0, 0, 5445559.18802, 3295180.19988, 278403.323597, -0.517708829899, 0.855556875634, - -3.88625155667e-9, 0.823618448403, 0.49838246457, 0.270679830167, -0.231581991732, - -0.140133334952, 0.962669429005 + 0, + 0, + 0, + 5445555.90789, + 3295180.6056, + 278462.674384, + -0.517709104819, + 0.855556709276, + -3.87938481339e-9, + 0.823616128798, + 0.498381422508, + 0.27068880672, + -0.231589626648, + -0.140138056616, + 0.962666904966 ], "memory": 1.34040951538 }, { "label": "pan move 0", "arm": "earth", - "hr": 0.00000239999799412, + "hr": 0.00000239999969298, "displayed": [ - -8.58814244934e-13, 4.30206852823e-12, 1.86531302955e-12, 0.304150405293, -0.931252189813, - 2.17004580504e-21, -0.455728878458 + -8.5881424494e-13, + 4.30209160674e-12, + 1.86525980147e-12, + 0.304162393914, + -0.931255659819, + 2.17004580504e-21, + -0.455717356973 ], "register": [ - 0, 0, 0, 5445561.20441, 3295176.86763, 278403.323592, -0.517708306366, 0.85555719243, - -3.8862556645e-9, 0.823618753374, 0.498381960581, 0.270679830166, -0.231582077482, - -0.140133193242, 0.962669429005 + 0, + 0, + 0, + 5445557.92428, + 3295177.27335, + 278462.674378, + -0.517708581286, + 0.855557026073, + -3.8793856183e-9, + 0.823616433768, + 0.49838091852, + 0.270688806719, + -0.231589712401, + -0.140137914902, + 0.962666904966 ], "memory": 1.34040951538 }, { "label": "pan end", "arm": "earth", - "hr": 0.00000239999932394, + "hr": 0.00000240000053964, "displayed": [ - -8.58814245295e-13, 4.30206852789e-12, 1.8653130293e-12, 0.304148562276, -0.93125297358, - 2.17004580513e-21, -0.455728071278 + -8.588142453e-13, + 4.30209160641e-12, + 1.86525980122e-12, + 0.304160550871, + -0.931256443589, + 2.17004580513e-21, + -0.455716549823 ], "register": [ - 0, 0, 0, 5445569.31207, 3295164.10778, 278395.762756, -0.517706274756, 0.85555842178, - -3.8862557894e-9, 0.823620211924, 0.498380171274, 0.270678686621, -0.231581431872, - -0.140132051306, 0.962669750542 + 0, + 0, + 0, + 5445566.032, + 3295164.51355, + 278455.113546, + -0.517706549676, + 0.855558255423, + -3.87938579871e-9, + 0.823617892326, + 0.498379129223, + 0.270687663177, + -0.231589066805, + -0.140136772948, + 0.962667226514 ], "memory": 1.34040951538 }, { "label": "tilt 2 move 0", "arm": "earth", - "hr": 0.00000239999899798, + "hr": 0.00000240000208973, "displayed": [ - -8.58814245329e-13, 4.30206852793e-12, 1.8653130305e-12, 0.235348859851, -1.00544185973, - 3.39220446184e-21, -0.512461799769 + -8.58814245335e-13, + 4.30209160644e-12, + 1.86525980243e-12, + 0.23536204091, + -1.00544579425, + 3.39220446157e-21, + -0.512449439596 ], "register": [ - 0, 0, 0, 5445569.35779, 3295164.13545, 278394.540928, -0.517706274756, 0.85555842178, - -3.88625580328e-9, 0.840109894691, 0.508358229701, 0.189175249802, -0.161850480136, - -0.0979372105863, 0.981943340963 + 0, + 0, + 0, + 5445566.07774, + 3295164.54122, + 278453.891718, + -0.517706549676, + 0.855558255423, + -3.87938578483e-9, + 0.840108222102, + 0.508357586402, + 0.189184406081, + -0.161858282392, + -0.0979420028656, + 0.981941576926 ], "memory": 1.42418512751 }, { "label": "tilt 2 end", "arm": "earth", - "hr": 0.00000239999918339, + "hr": 0.0000023999991996, "displayed": [ - -8.58814244602e-13, 4.30206852711e-12, 1.86531302683e-12, -2.18873158028, -0.782393844366, - 4.95528116513e-22, -2.76218929169 + -8.58814244608e-13, + 4.30209160562e-12, + 1.86525979876e-12, + -2.18873636672, + -0.782395233589, + 4.95528116513e-22, + -2.76219997364 ], "register": [ - 0, 0, 0, 5445570.02468, 3295164.53899, 278376.719336, -0.517706274756, 0.85555842178, - -3.88625581715e-9, 0.413537188401, 0.250235154524, -0.875425245952, 0.74897744084, - 0.453213144516, 0.483353533917 + 0, + 0, + 0, + 5445566.74476, + 3295164.94484, + 278436.070134, + -0.517706549676, + 0.855558255423, + -3.87938620117e-9, + 0.413544091929, + 0.250239513462, + -0.875420738807, + 0.748973439084, + 0.453211051807, + 0.483361696938 ], "memory": 2.68081938898 }, { "label": "look move 0", "arm": "earth", - "hr": 0.00000240000252694, + "hr": 0.00000239999928509, "displayed": [ - -8.58814244611e-13, 4.3020685271e-12, 1.86531302683e-12, -2.21974316641, -0.79026709551, - 4.95528116513e-22, -2.83104060575 + -8.58814244617e-13, + 4.30209160561e-12, + 1.86525979876e-12, + -2.21974811218, + -0.790268249161, + 4.95528116513e-22, + -2.83105142834 ], "register": [ - 0, 0, 0, 5445570.02468, 3295164.53899, 278376.719336, -0.518953250488, 0.853202028398, - 0.052285968923, 0.389222376494, 0.290314069469, -0.874198880521, 0.761047610498, - 0.433317481538, 0.482744751136 + 0, + 0, + 0, + 5445566.74476, + 3295164.94484, + 278436.070134, + -0.518953941777, + 0.853201609233, + 0.0522859476041, + 0.38922925736, + 0.290318414674, + -0.874194373876, + 0.761043619991, + 0.433315395645, + 0.482752914405 ], "memory": 2.68081938898 }, { "label": "look end", "arm": "earth", - "hr": 0.00000240000220453, + "hr": 0.00000240000213503, "displayed": [ - -8.5881424461e-13, 4.30206852708e-12, 1.86531302681e-12, -2.26867632381, -0.745682551694, - 4.95528116513e-22, -2.91255621627 + -8.58814244616e-13, + 4.3020916056e-12, + 1.86525979873e-12, + -2.26868065666, + -0.74568333147, + 4.95528116513e-22, + -2.91256664702 ], "register": [ - 0, 0, 0, 5445570.02468, 3295164.53899, 278376.719336, -0.518777811432, 0.848507067561, - 0.104428629526, 0.323919861772, 0.30813390666, -0.894499535336, 0.791167179246, - 0.430220004027, 0.434701325762 + 0, + 0, + 0, + 5445566.74476, + 3295164.94484, + 278436.070134, + -0.518778917195, + 0.848506396737, + 0.10442858694, + 0.323926898868, + 0.308138328882, + -0.894495463635, + 0.791163573014, + 0.43021815974, + 0.434709714368 ], "memory": 2.73317926654 }, { "label": "recede brisk 0", "arm": "earth", - "hr": 0.00000323966090598, + "hr": 0.00000323966126414, "displayed": [ - -8.58814244386e-13, 4.30206852684e-12, 1.86531302689e-12, -2.23720591448, -0.739328320116, - 6.68892992463e-22, -2.83571247526 + -8.58814244392e-13, + 4.30209160535e-12, + 1.86525979882e-12, + -2.23721013181, + -0.739329340615, + 6.68892992494e-22, + -2.83572280702 ], "register": [ - 0, 0, 0, 5445574.5971, 3295167.3058, 278376.953078, -0.518852132056, 0.853724607628, - 0.0441220964097, 0.352754925775, 0.26082999103, -0.898627663786, 0.77868891568, - 0.450690592436, 0.436487757546 + 0, + 0, + 0, + 5445571.31718, + 3295167.71166, + 278436.303925, + -0.518852758383, + 0.853724227906, + 0.0441220784167, + 0.352762011006, + 0.260834442443, + -0.898623590402, + 0.778685288617, + 0.450688735516, + 0.436496145424 ], "memory": 2.73317926654 }, { "label": "recede brisk 35", "arm": "earth", - "hr": 0.117649922739, + "hr": 0.11764992274, "displayed": [ - -8.58790612528e-13, 4.30203996958e-12, 1.86533471318e-12, -1.73703326324, -1.24763716596, - 2.42911852572e-17, -2.40939779165 + -8.58790612634e-13, + 4.30206304827e-12, + 1.86528148545e-12, + -1.73704603665, + -1.24764085932, + 2.42911852576e-17, + -2.40941359841 ], "register": [ - 0, 0, 0, 6086226.3104, 3682831.55361, 311126.972153, -0.518981479156, 0.85299727638, - 0.0552618383795, 0.711370360268, 0.466848482509, -0.525361499266, 0.473930833377, - 0.233341254104, 0.8490826958 + 0, + 0, + 0, + 6086222.64462, + 3682832.00722, + 311193.305409, + -0.51898218053, + 0.852996952088, + 0.0552602571646, + 0.711374857916, + 0.466850497001, + -0.525353618979, + 0.473923314279, + 0.233338409138, + 0.849087674509 ], "memory": 2.73317926654 }, { "label": "recede 0", "arm": "earth", - "hr": 0.130023273124, + "hr": 0.130023273126, "displayed": [ - -8.58790902539e-13, 4.30203938782e-12, 1.86533885729e-12, -1.30184995608, -1.35141730292, - 2.68459115118e-17, -1.99678524698 + -8.58790902658e-13, + 4.30206246655e-12, + 1.86528562957e-12, + -1.30186041478, + -1.35142240492, + 2.68459115123e-17, + -1.99679807879 ], "register": [ - 0, 0, 0, 6153606.09465, 3723603.68118, 314571.416574, -0.519053726585, 0.851821695684, - 0.0705905636771, 0.771980311407, 0.502646834336, -0.389091966932, 0.366919102415, - 0.147465110091, 0.918490290416 + 0, + 0, + 0, + 6153602.38829, + 3723604.13981, + 314638.484196, + -0.519054562022, + 0.851821354531, + 0.0705885373798, + 0.77198370136, + 0.502648226471, + -0.389083442541, + 0.366910788174, + 0.147462335498, + 0.918494057211 ], "memory": 2.73317926654 }, { "label": "recede 3", "arm": "earth", - "hr": 0.175513060413, + "hr": 0.175513060418, "displayed": [ - -8.58796269796e-13, 4.30204137664e-12, 1.86535035948e-12, 0.394300847072, -1.13068063703, - 3.62381901016e-17, -0.359797730373 + -8.58796269929e-13, + 4.3020644555e-12, + 1.86529713172e-12, + 0.394311083513, + -1.13068223763, + 3.62381901023e-17, + -0.359788132177 ], "register": [ - 0, 0, 0, 6401323.32224, 3873499.6554, 327234.683932, -0.518386381167, 0.846342728004, - 0.122390957895, 0.854626085316, 0.507744829759, 0.108671257242, -0.0298297522298, - -0.160932205002, 0.986514577325 + 0, + 0, + 0, + 6401319.46668, + 3873500.13249, + 327304.451403, + -0.518387722124, + 0.846342418415, + 0.122387419055, + 0.854624935456, + 0.507744775192, + 0.108680554666, + -0.0298393908959, + -0.160934005283, + 0.986513992143 ], "memory": 2.73317926654 }, { "label": "recede 19", "arm": "absolute", - "hr": 0.904220833927, + "hr": 0.904220833938, "displayed": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.77203029021, 0.26566625834, - 3.93164567994e-16, 0 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.772030404994, + 0.265666289276, + 3.93164567996e-16, + -5.55111512313e-17 ], "register": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.77203029021, 0.26566625834, - 3.93164567994e-16, 0 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.772030404994, + 0.265666289276, + 3.93164567996e-16, + -5.55111512313e-17 ], "memory": 2.73317926654 }, { "label": "recede world 0", "arm": "absolute", - "hr": 0.999318569173, + "hr": 0.999318569187, "displayed": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.77203029021, 0.26566625834, - 4.12799402005e-16, 1.38777878078e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.772030404994, + 0.265666289276, + 4.12799402008e-16, + 1.38777878078e-17 ], "register": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.77203029021, 0.26566625834, - 4.12799402005e-16, 1.38777878078e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.772030404994, + 0.265666289276, + 4.12799402008e-16, + 1.38777878078e-17 ], "memory": 2.73317926654 }, { "label": "recede world 7", "arm": "absolute", - "hr": 2.0123804743, + "hr": 2.01238047432, "displayed": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.77203029021, 0.26566625834, - 6.21966342721e-16, 4.99537680643e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.772030404994, + 0.265666289276, + 6.21966342726e-16, + -5.55738316694e-18 ], "register": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.77203029021, 0.26566625834, - 6.21966342721e-16, 4.99537680643e-17 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.772030404994, + 0.265666289276, + 6.21966342726e-16, + -5.55738316694e-18 ], "memory": 2.73317926654 }, { "label": "re-dive 0", "arm": "absolute", - "hr": 1.82087715247, + "hr": 1.82087715249, "displayed": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.77203029021, 0.26566625834, - 5.82426642569e-16, -4.1680373752e-18 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.772030404994, + 0.265666289276, + 5.82426642574e-16, + -5.96791886065e-17 ], "register": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.77203029021, 0.26566625834, - 5.82426642569e-16, -4.1680373752e-18 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.772030404994, + 0.265666289276, + 5.82426642574e-16, + -5.96791886065e-17 ], "memory": 2.73317926654 }, { "label": "re-dive 14", "arm": "earth", - "hr": 0.44902277751, + "hr": 0.449022777516, "displayed": [ - -8.58813615039e-13, 4.30206886461e-12, 1.8653076863e-12, 0.770526712133, 0.146645684916, - 9.36724038836e-17, -0.0125262597088 + -8.58813615026e-13, + 4.30209194307e-12, + 1.86525445823e-12, + 0.770526869984, + 0.146645730242, + 9.36724036408e-17, + -0.0125259023887 ], "register": [ - 0, 0, 0, 7807991.34246, 4915356.66425, -315071.744698, -0.506029067466, 0.820749077459, - 0.265151908782, 0.268425335891, -0.142294341754, 0.952732994787, -0.819684342861, - -0.553284079073, 0.148304773735 + 0, + 0, + 0, + 7807994.71433, + 4915356.7519, + -314986.806499, + -0.506032322158, + 0.820749515208, + 0.265144342232, + 0.268413886155, + -0.142292603399, + 0.952736480217, + -0.819686082992, + -0.553283876779, + 0.148295910413 ], "memory": 2.73317926654 }, { "label": "re-dive engaged 0", "arm": "earth", - "hr": 0.404990357301, + "hr": 0.404990357704, "displayed": [ - -8.5881413465e-13, 4.30206838331e-12, 1.8653065484e-12, 0.766060103541, 0.0569265529058, - 8.56332553321e-17, -0.014682372201 + -8.58814134638e-13, + 4.30209146175e-12, + 1.86525332033e-12, + 0.766060308078, + 0.0569265954535, + 8.56332551382e-17, + -0.0146819552961 ], "register": [ - 0, 0, 0, 7548597.89319, 4780284.00485, -539834.180337, -0.504219599434, 0.822849971614, - 0.262069684934, 0.339586908599, -0.090096931112, 0.936249579179, -0.794004614001, - -0.561070821928, 0.234000439585 + 0, + 0, + 0, + 7548603.9725, + 4780283.67862, + -539752.097825, + -0.504222807269, + 0.822850390028, + 0.26206219922, + 0.339575685799, + -0.0900952685041, + 0.936253809716, + -0.794007376694, + -0.561070475273, + 0.233991896297 ], "memory": 2.73317926654 }, { "label": "re-dive engaged 3", "arm": "earth", - "hr": 0.268610129073, + "hr": 0.268610130415, "displayed": [ - -8.58815551839e-13, 4.30206713078e-12, 1.86530493509e-12, 0.730400579092, -0.381240123956, - 6.74071830062e-17, -0.0418810656223 + -8.58815551831e-13, + 4.3020902092e-12, + 1.86525170703e-12, + 0.730401394984, + -0.381240094609, + 6.74071828526e-17, + -0.0418799467016 ], "register": [ - 0, 0, 0, 6703603.91623, 4337565.20366, -1253411.55901, -0.498419255637, 0.834725313401, - 0.234119407094, 0.637186519562, 0.169602057168, 0.751816787184, -0.587853370236, - -0.523897693612, 0.616408648325 + 0, + 0, + 0, + 6703618.31588, + 4337564.0694, + -1253338.52376, + -0.498422031517, + 0.834725566235, + 0.234112595928, + 0.637177733564, + 0.169602983375, + 0.751824024543, + -0.587860539881, + -0.523896990928, + 0.616402407967 ], "memory": 2.73317926654 } @@ -389,10 +791,22 @@ "arm": "absolute", "hr": 5, "displayed": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.7, 0.3, 1.23882029118e-15, 0 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.7, + 0.3, + 1.23882029118e-15, + 0 ], "register": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.7, 0.3, 1.23882029118e-15, 0 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.7, + 0.3, + 1.23882029118e-15, + 0 ], "memory": 0 }, @@ -401,10 +815,22 @@ "arm": "absolute", "hr": 4.69959329559, "displayed": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.7, 0.3, 1.17679530434e-15, 0 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.7, + 0.3, + 1.17679530435e-15, + 0 ], "register": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.7, 0.3, 1.17679530434e-15, 0 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.7, + 0.3, + 1.17679530435e-15, + 0 ], "memory": 0 }, @@ -413,356 +839,736 @@ "arm": "earth", "hr": 0.408531953689, "displayed": [ - -8.58823383762e-13, 4.30206074691e-12, 1.86529997395e-12, 0.7, 0.300000000001, - 8.43496123045e-17, 0 + -8.58823383762e-13, + 4.30208382526e-12, + 1.86524674597e-12, + 0.7, + 0.299999999999, + 8.43496123044e-17, + 0 ], "register": [ - 0, 0, 0, 7933156.7443, 4190780.91606, -175201.198913, -0.447064801007, 0.857007963802, - 0.256262392246, 0.136407566548, -0.217817734475, 0.966410063243, -0.884039614208, - -0.467004051939, 0.0195237287359 + 0, + 0, + 0, + 7933158.87757, + 4190780.53426, + -175113.714869, + -0.447067922013, + 0.85700852238, + 0.256255079316, + 0.136395796513, + -0.217815627948, + 0.966412199279, + -0.88403985193, + -0.467004009393, + 0.01951397986 ], "memory": 0 }, { "label": "dive 39", "arm": "earth", - "hr": 0.0615621239591, + "hr": 0.0615621239606, "displayed": [ - -8.58815721031e-13, 4.30206715141e-12, 1.86531128077e-12, 0.763746321349, 0.339489149202, - 1.27107388114e-17, -0.0200470287365 + -8.58815721031e-13, + 4.30209022991e-12, + 1.86525805271e-12, + 0.763746321348, + 0.339489149201, + 1.27107388113e-17, + -0.0200470287363 ], "register": [ - 0, 0, 0, 5816777.47103, 3442303.88859, 238084.637298, -0.499523362162, 0.827670508433, - 0.255808405111, 0.101435192445, -0.237376038054, 0.966107405153, -0.86034139293, - -0.508541194033, -0.0346199593216 + 0, + 0, + 0, + 5816774.57098, + 3442304.40762, + 238147.977164, + -0.499526477634, + 0.82767106602, + 0.25580051723, + 0.101423426099, + -0.237373932188, + 0.966109157888, + -0.860340971232, + -0.508541269506, + -0.0346293290295 ], "memory": 0 }, { "label": "dive brisk 0", "arm": "earth", - "hr": 0.045625139939, + "hr": 0.0456251399424, "displayed": [ - -8.58815389035e-13, 4.30206746308e-12, 1.865311795e-12, 0.767005933745, 0.341447327806, - 9.42022602833e-18, -0.0211355075588 + -8.58815389035e-13, + 4.30209054158e-12, + 1.86525856693e-12, + 0.767005933745, + 0.341447327804, + 9.42022602832e-18, + -0.0211355075587 ], "register": [ - 0, 0, 0, 5721378.84037, 3403036.63475, 251229.96033, -0.50212952764, 0.826125774875, - 0.255699318653, 0.0996977487931, -0.238405860426, 0.966034680847, -0.859026365345, - -0.510567184415, -0.0373477421075 + 0, + 0, + 0, + 5721375.78023, + 3403037.18244, + 251292.223917, + -0.502132641784, + 0.826126332225, + 0.255691402398, + 0.0996859833328, + -0.238403754719, + 0.966036414667, + -0.859025910425, + -0.510567265834, + -0.0373570913832 ], "memory": 0 }, { "label": "dive brisk 35", "arm": "earth", - "hr": 0.0000023999980725, + "hr": 0.0000023999987333, "displayed": [ - -8.58814448428e-13, 4.30206836336e-12, 1.86531326421e-12, 0.775991810209, 0.346814025077, - 4.95528126624e-22, -0.0241671776287 + -8.58814448428e-13, + 4.30209144188e-12, + 1.86526003613e-12, + 0.775991805555, + 0.346814022309, + 4.9552812602e-22, + -0.0241671760466 ], "register": [ - 0, 0, 0, 5449460.18477, 3288098.1732, 285709.5177, -0.509274526104, 0.821846932352, - 0.255356763852, 0.094934416484, -0.241258422108, 0.96580631098, -0.855351923847, - -0.516102696704, -0.0448452096255 + 0, + 0, + 0, + 5449456.70472, + 3288098.79604, + 285768.720091, + -0.50927763239, + 0.821847491179, + 0.255348770098, + 0.0949226562623, + -0.241256315416, + 0.965807993133, + -0.855351379537, + -0.516102791617, + -0.0448544982087 ], "memory": 0 }, { "label": "tilt 1 move 0", "arm": "earth", - "hr": 0.00000248496687472, + "hr": 0.0000024849657001, "displayed": [ - -8.58814448428e-13, 4.30206836336e-12, 1.86531326421e-12, 0.773897707549, 0.263062019846, - 5.14876964911e-22, -0.0235379046179 + -8.58814448428e-13, + 4.30209144188e-12, + 1.86526003613e-12, + 0.773897707698, + 0.263062016837, + 5.14876964263e-22, + -0.023537904874 ], "register": [ - 0, 0, 0, 5449460.52306, 3288098.76957, 285708.272988, -0.509274526107, 0.821846932291, - 0.255356764042, 0.16617547239, -0.197225934497, 0.96617164269, -0.84440817703, - -0.534480636361, 0.0361286578788 - ], - "memory": 0.0837755979029 + 0, + 0, + 0, + 5449457.04302, + 3288099.39241, + 285767.475381, + -0.509277636295, + 0.821847488822, + 0.255348769893, + 0.166163707683, + -0.197223826706, + 0.966174096335, + -0.844408616381, + -0.534480558389, + 0.0361195416064 + ], + "memory": 0.0837756009065 }, { "label": "tilt 1 move 3", "arm": "earth", - "hr": 0.00000263277163493, + "hr": 0.00000263277086576, "displayed": [ - -8.58814448431e-13, 4.30206836336e-12, 1.86531326422e-12, 0.76804416842, 0.0118011306383, - 5.75605631355e-22, -0.0227296004181 + -8.58814448431e-13, + 4.30209144188e-12, + 1.86526003614e-12, + 0.768044168272, + 0.0118011273059, + 5.75605630761e-22, + -0.0227296011328 ], "register": [ - 0, 0, 0, 5449460.93475, 3288100.25622, 285704.309385, -0.509274526113, 0.821846932138, - 0.255356764524, 0.37095053859, -0.0581097905024, 0.926832751993, -0.77655338192, - -0.566737039891, 0.275270726095 - ], - "memory": 0.335102358841 + 0, + 0, + 0, + 5449457.45477, + 3288100.87905, + 285763.51178, + -0.509277636295, + 0.821847488822, + 0.255348769893, + 0.370939252781, + -0.0581077677636, + 0.926837395702, + -0.776556733224, + -0.566736440016, + 0.275262506787 + ], + "memory": 0.335102362174 }, { "label": "tilt 1 end", "arm": "earth", - "hr": 0.00000239999983642, + "hr": 0.0000023999997163, "displayed": [ - -8.58814448742e-13, 4.30206836317e-12, 1.86531326558e-12, 0.732896838001, -0.993109045967, - 2.17004579673e-21, -0.0416281368215 + -8.58814448742e-13, + 4.30209144169e-12, + 1.8652600375e-12, + 0.732896834484, + -0.993109049844, + 2.17004583329e-21, + -0.0416281402392 ], "register": [ - 0, 0, 0, 5449458.15847, 3288103.32257, 285688.903665, -0.509274526102, 0.82184693181, - 0.255356765599, 0.854430944198, 0.447375126055, 0.264203062404, -0.102894211013, - -0.352736611739, 0.930048205245 - ], - "memory": 1.34040951447 + 0, + 0, + 0, + 5449454.67867, + 3288103.94536, + 285748.10602, + -0.509277636295, + 0.821847488822, + 0.255348769893, + 0.854427726547, + 0.447375703741, + 0.264212489882, + -0.102905535695, + -0.352734581263, + 0.93004772238 + ], + "memory": 1.34040951843 }, { "label": "pan move 0", "arm": "earth", - "hr": 0.00000240000079321, + "hr": 0.00000239999935414, "displayed": [ - -8.58814448833e-13, 4.30206836309e-12, 1.86531326555e-12, 0.732896535328, -0.993109039083, - 2.17004579682e-21, -0.0416278013131 + -8.58814448833e-13, + 4.3020914416e-12, + 1.86526003747e-12, + 0.7328965318, + -0.99310904296, + 2.17004583338e-21, + -0.0416278046814 ], "register": [ - 0, 0, 0, 5449460.14201, 3288100.12161, 285687.909089, -0.509274005764, 0.821847253697, - 0.255356767375, 0.854431244195, 0.447374641933, 0.264202911982, -0.102894295261, - -0.352736475781, 0.930048247488 - ], - "memory": 1.34040951447 + 0, + 0, + 0, + 5449456.66222, + 3288100.7444, + 285747.111475, + -0.509277115907, + 0.821847810737, + 0.255348771684, + 0.854428026575, + 0.447375219571, + 0.264212339449, + -0.102905619947, + -0.3527344453, + 0.930047764624 + ], + "memory": 1.34040951843 }, { "label": "pan end", "arm": "earth", - "hr": 0.00000239999977647, + "hr": 0.00000240000002849, "displayed": [ - -8.58814449131e-13, 4.3020683628e-12, 1.86531326519e-12, 0.732895294537, -0.993110199781, - 2.17004579699e-21, -0.0416265515011 + -8.58814449131e-13, + 4.30209144132e-12, + 1.86526003711e-12, + 0.732895290976, + -0.993110203657, + 2.17004583347e-21, + -0.0416265549024 ], "register": [ - 0, 0, 0, 5449467.12076, 3288089.5259, 285676.740295, -0.509271985061, 0.821848499612, - 0.255356787489, 0.854432532278, 0.447373179523, 0.264201222609, -0.102893600465, - -0.352735427662, 0.930048721872 - ], - "memory": 1.34040951447 + 0, + 0, + 0, + 5449463.64111, + 3288090.14867, + 285735.942789, + -0.509275095207, + 0.821849056657, + 0.255348791801, + 0.854429314677, + 0.447373757161, + 0.264210650097, + -0.102904925166, + -0.352733397165, + 0.930048239018 + ], + "memory": 1.34040951843 }, { "label": "tilt 2 move 0", "arm": "earth", - "hr": 0.00000239999905194, + "hr": 0.00000240000012441, "displayed": [ - -8.58814449397e-13, 4.30206836264e-12, 1.86531326635e-12, 0.725551047161, -1.07680251242, - 3.39220444085e-21, -0.0479469701107 + -8.58814449397e-13, + 4.30209144116e-12, + 1.86526003827e-12, + 0.725551042947, + -1.07680251628, + 3.39220453137e-21, + -0.0479469740881 ], "register": [ - 0, 0, 0, 5449467.00465, 3288089.82096, 285675.559116, -0.509271985061, 0.821848499612, - 0.255356787489, 0.860045831705, 0.475320318668, 0.185450160495, -0.0310356665523, - -0.314063112043, 0.948894698613 - ], - "memory": 1.42418512661 + 0, + 0, + 0, + 5449463.52501, + 3288090.44372, + 285734.761608, + -0.509275095207, + 0.821849056657, + 0.255348791801, + 0.860043573015, + 0.475320724373, + 0.185459595323, + -0.0310472207774, + -0.314061040331, + 0.948895006325 + ], + "memory": 1.42418513056 }, { "label": "tilt 2 end", "arm": "earth", - "hr": 0.00000239999997409, + "hr": 0.00000239999946028, "displayed": [ - -8.58814447958e-13, 4.30206836244e-12, 1.86531326281e-12, -2.35006327372, -0.807403215039, - 4.95528116483e-22, -3.10871731778 + -8.58814447958e-13, + 4.30209144096e-12, + 1.86526003473e-12, + -2.35006327273, + -0.807403211062, + 4.95528116483e-22, + -3.10871731543 ], "register": [ - 0, 0, 0, 5449465.31106, 3288094.12462, 285658.33045, -0.509271985061, 0.821848499612, - 0.255356787489, 0.29528545085, 0.445573825476, -0.845145235191, 0.808361644159, - 0.355005647469, 0.46959817133 - ], - "memory": 2.68081938808 + 0, + 0, + 0, + 5449461.83163, + 3288094.74734, + 285717.532912, + -0.509275095207, + 0.821849056657, + 0.255348791801, + 0.295295741598, + 0.445571980531, + -0.845142612321, + 0.808355925565, + 0.355006673512, + 0.469607239473 + ], + "memory": 2.68081939203 }, { "label": "look move 0", "arm": "earth", - "hr": 0.00000239999988616, + "hr": 0.00000240000239859, "displayed": [ - -8.58814447966e-13, 4.30206836243e-12, 1.86531326281e-12, -2.38373364598, -0.807339449685, - 4.95528116483e-22, 3.10323965376 + -8.58814447966e-13, + 4.30209144095e-12, + 1.86526003472e-12, + -2.38373364458, + -0.807339445766, + 4.95528116483e-22, + 3.10323965641 ], "register": [ - 0, 0, 0, 5449465.31106, 3288094.12462, 285658.33045, -0.503605228001, 0.808095902874, - 0.305553245912, 0.271528452232, 0.483804112839, -0.831989110523, 0.820154908513, - 0.336027665763, 0.463067310316 - ], - "memory": 2.68081938808 + 0, + 0, + 0, + 5449461.83163, + 3288094.74734, + 285717.532912, + -0.503608949544, + 0.808096569413, + 0.305545349241, + 0.271538582696, + 0.483802296668, + -0.831986860381, + 0.820149269369, + 0.336028677709, + 0.463076563551 + ], + "memory": 2.68081939203 }, { "label": "look end", "arm": "earth", - "hr": 0.00000239999997409, + "hr": 0.00000239999978224, "displayed": [ - -8.5881444796e-13, 4.30206836242e-12, 1.86531326278e-12, -2.40944022527, -0.753557836751, - 4.95528116483e-22, 3.03763473241 + -8.5881444796e-13, + 4.30209144094e-12, + 1.8652600347e-12, + -2.40944022372, + -0.753557832895, + 4.95528116483e-22, + 3.03763473516 ], "register": [ - 0, 0, 0, 5449465.31106, 3288094.12462, 285658.33045, -0.496558124016, 0.792128371437, - 0.354912204127, 0.204196630132, 0.504011632198, -0.839211541181, 0.843643150696, - 0.344245432466, 0.412021014646 - ], - "memory": 2.73317926564 + 0, + 0, + 0, + 5449461.83163, + 3288094.74734, + 285717.532912, + -0.496562446757, + 0.792129145641, + 0.354904428116, + 0.20420684848, + 0.504009800245, + -0.839210155021, + 0.843638133032, + 0.344246333143, + 0.412030536019 + ], + "memory": 2.73317926959 }, { "label": "recede brisk 0", "arm": "earth", - "hr": 0.00000323966149196, + "hr": 0.0000032396613292, "displayed": [ - -8.58814447761e-13, 4.30206836216e-12, 1.86531326286e-12, -2.40944022527, -0.753557836751, - 6.68892992433e-22, 3.03763473241 + -8.58814447761e-13, + 4.30209144068e-12, + 1.86526003478e-12, + -2.40944022372, + -0.753557832895, + 6.68892992433e-22, + 3.03763473516 ], "register": [ - 0, 0, 0, 5449469.88675, 3288096.88549, 285658.570306, -0.496558124016, 0.792128371437, - 0.354912204127, 0.204196630132, 0.504011632198, -0.839211541181, 0.843643150696, - 0.344245432466, 0.412021014646 - ], - "memory": 2.73317926564 + 0, + 0, + 0, + 5449466.40732, + 3288097.50822, + 285717.772817, + -0.496562446757, + 0.792129145641, + 0.354904428116, + 0.20420684848, + 0.504009800245, + -0.839210155021, + 0.843638133032, + 0.344246333143, + 0.412030536019 + ], + "memory": 2.73317926959 }, { "label": "recede brisk 35", "arm": "earth", - "hr": 0.117649922728, + "hr": 0.117649922735, "displayed": [ - -8.58795358288e-13, 4.3020357795e-12, 1.86533371378e-12, -2.62627933297, -1.30978913525, - 2.42911852551e-17, 2.84396199283 + -8.58795358288e-13, + 4.30205885827e-12, + 1.8652804861e-12, + -2.62627932389, + -1.30978913277, + 2.42911852565e-17, + 2.84396200263 ], "register": [ - 0, 0, 0, 6090579.86642, 3674929.32447, 319265.244717, -0.496558124016, 0.792128371437, - 0.354912204127, 0.62387405745, 0.60998688806, -0.488566430319, 0.603499121717, - 0.0211811132692, 0.79708228592 - ], - "memory": 2.73317926564 + 0, + 0, + 0, + 6090575.97768, + 3674930.02048, + 319331.412187, + -0.496562446757, + 0.792129145641, + 0.354904428116, + 0.623880006388, + 0.609985822238, + -0.48856016446, + 0.603489415069, + 0.0211828537717, + 0.797089588821 + ], + "memory": 2.73317926959 }, { "label": "recede 0", "arm": "earth", - "hr": 0.130023273112, + "hr": 0.130023273121, "displayed": [ - -8.58796303391e-13, 4.3020346161e-12, 1.86533761691e-12, -3.00081954901, -1.44805394845, - 2.68459115096e-17, 2.47527892143 + -8.58796303391e-13, + 4.30205769492e-12, + 1.86528438925e-12, + -3.00081952413, + -1.44805394725, + 2.6845911511e-17, + 2.47527894691 ], "register": [ - 0, 0, 0, 6158007.84829, 3715613.96753, 322799.786848, -0.496558124016, 0.792128371437, - 0.354912204127, 0.70873235831, 0.606064735209, -0.361087220794, 0.501127203171, - -0.0722369704604, 0.86235337672 - ], - "memory": 2.73317926564 + 0, + 0, + 0, + 6158003.91651, + 3715614.67124, + 322866.686849, + -0.496562446757, + 0.792129145641, + 0.354904428116, + 0.708736754964, + 0.606063947721, + -0.361079912812, + 0.501116701612, + -0.0722350877246, + 0.862359636965 + ], + "memory": 2.73317926959 }, { "label": "recede 3", "arm": "earth", - "hr": 0.1755130604, + "hr": 0.175513060412, "displayed": [ - -8.58802801727e-13, 4.30203560122e-12, 1.86534854787e-12, 0.974192521948, -1.15078859777, - 3.62381900986e-17, 0.186667782595 + -8.58802801726e-13, + 4.30205868017e-12, + 1.86529532019e-12, + 0.974192518494, + -1.15078860015, + 3.62381901006e-17, + 0.186667779321 ], "register": [ - 0, 0, 0, 6405902.27118, 3865188.31086, 335794.29235, -0.496558124016, 0.792128371437, - 0.354912204127, 0.863198945858, 0.493605329488, 0.106025273267, 0.0912009284136, - -0.359007551266, 0.928868111623 - ], - "memory": 2.73317926564 + 0, + 0, + 0, + 6405898.18113, + 3865189.04291, + 335863.885453, + -0.496562446757, + 0.792129145641, + 0.354904428116, + 0.863197654257, + 0.493605561447, + 0.10603470844, + 0.0911896164954, + -0.359005524099, + 0.928870005711 + ], + "memory": 2.73317926959 }, { "label": "recede 19", "arm": "absolute", - "hr": 0.904220856109, + "hr": 0.904220834056, "displayed": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.782643157474, 0.267207821923, - 3.93164572574e-16, 0.0785409051511 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.782643157335, + 0.267207821768, + 3.9316456802e-16, + 0.0785409033636 ], "register": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.782643157474, 0.267207821923, - 3.93164572574e-16, 0.0785409051511 - ], - "memory": 2.73317926564 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.782643157335, + 0.267207821768, + 3.9316456802e-16, + 0.0785409033636 + ], + "memory": 2.73317926959 }, { "label": "recede world 0", "arm": "absolute", - "hr": 0.999318593689, + "hr": 0.999318569316, "displayed": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.782643157474, 0.267207821923, - 4.12799407067e-16, 0.0785409051511 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.782643157335, + 0.267207821768, + 4.12799402035e-16, + 0.0785409033636 ], "register": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.782643157474, 0.267207821923, - 4.12799407067e-16, 0.0785409051511 - ], - "memory": 2.73317926564 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.782643157335, + 0.267207821768, + 4.12799402035e-16, + 0.0785409033636 + ], + "memory": 2.73317926959 }, { "label": "recede world 7", "arm": "absolute", - "hr": 2.01238052367, + "hr": 2.01238047459, "displayed": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.782643157474, 0.267207821923, - 6.21966352914e-16, 0.0785409051511 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.782643157335, + 0.267207821768, + 6.2196634278e-16, + 0.0785409033636 ], "register": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.782643157474, 0.267207821923, - 6.21966352914e-16, 0.0785409051511 - ], - "memory": 2.73317926564 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.782643157335, + 0.267207821768, + 6.2196634278e-16, + 0.0785409033636 + ], + "memory": 2.73317926959 }, { "label": "re-dive 0", "arm": "absolute", - "hr": 1.82087719714, + "hr": 1.82087715273, "displayed": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.782643157474, 0.267207821923, - 5.82426651792e-16, 0.0785409051511 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.782643157335, + 0.267207821768, + 5.82426642623e-16, + 0.0785409033636 ], "register": [ - -8.58950454652e-13, 4.30222343256e-12, 1.86530400502e-12, 0.782643157474, 0.267207821923, - 5.82426651792e-16, 0.0785409051511 - ], - "memory": 2.73317926564 + -8.58950454652e-13, + 4.30224651096e-12, + 1.86525077502e-12, + 0.782643157335, + 0.267207821768, + 5.82426642623e-16, + 0.0785409033636 + ], + "memory": 2.73317926959 }, { "label": "re-dive 14", "arm": "earth", - "hr": 0.449022788525, + "hr": 0.449022777574, "displayed": [ - -8.58812915346e-13, 4.30206950158e-12, 1.86530825661e-12, 0.792064079893, 0.148535184229, - 9.36724058737e-17, 0.0785409051511 + -8.58812915346e-13, + 4.30209258004e-12, + 1.86525502852e-12, + 0.79206408103, + 0.148535164831, + 9.36724038973e-17, + 0.0785409033636 ], "register": [ - 0, 0, 0, 7762490.13457, 4989271.48472, -275042.547948, -0.495946113036, 0.791703341311, - 0.356711749627, 0.314704012642, -0.218991606864, 0.923582189386, -0.809319984549, - -0.570305615859, 0.140544182121 - ], - "memory": 2.73317926564 + 0, + 0, + 0, + 7762493.42556, + 4989270.84689, + -274958.882602, + -0.495950457609, + 0.791704119425, + 0.356703982153, + 0.314692779118, + -0.218989581328, + 0.923586497325, + -0.809321690287, + -0.570305313456, + 0.14053558651 + ], + "memory": 2.73317926959 }, { "label": "re-dive engaged 0", "arm": "earth", - "hr": 0.404742861533, + "hr": 0.404742850815, "displayed": [ - -8.58813375988e-13, 4.30206906302e-12, 1.86530706557e-12, 0.801544273355, 0.0594168216069, - 8.55816312919e-17, 0.0775559827398 + -8.58813375989e-13, + 4.30209214146e-12, + 1.86525383748e-12, + 0.801544274338, + 0.0594167972848, + 8.55816295471e-17, + 0.0775559811744 ], "register": [ - 0, 0, 0, 7485120.5034, 4881334.78478, -491102.955744, -0.497894230725, 0.790278686588, - 0.357156733852, 0.38579097349, -0.167005848978, 0.907344681574, -0.776702426792, - -0.589549526276, 0.221731135123 - ], - "memory": 2.73317926564 + 0, + 0, + 0, + 7485126.427, + 4881333.67662, + -491022.434865, + -0.49789858041, + 0.790279465874, + 0.357148945741, + 0.385779940944, + -0.167003855664, + 0.907349739273, + -0.776705118299, + -0.589549046315, + 0.221722983015 + ], + "memory": 2.73317926959 }, { "label": "re-dive engaged 3", "arm": "earth", - "hr": 0.266757755343, + "hr": 0.266757742279, "displayed": [ - -8.58814922354e-13, 4.30206767835e-12, 1.86530523177e-12, 0.863342306848, -0.376693539653, - 6.70660395683e-17, 0.0879707615574 + -8.58814922355e-13, + 4.30209075677e-12, + 1.8652520037e-12, + 0.863342306569, + -0.376693585659, + 6.70660385912e-17, + 0.0879707620004 ], "register": [ - 0, 0, 0, 6556743.55339, 4560834.9573, -1158054.05414, -0.514400153683, 0.774691173384, - 0.367758164793, 0.677083432359, 0.103729462365, 0.728559005341, -0.526260874013, - -0.62377382481, 0.577889010075 - ], - "memory": 2.73317926564 + 0, + 0, + 0, + 6556757.59107, + 4560832.38104, + -1157984.13863, + -0.514404629972, + 0.774691977732, + 0.367750209111, + 0.67707458349, + 0.103731078593, + 0.72856699879, + -0.526267883359, + -0.623772557084, + 0.577883995256 + ], + "memory": 2.73317926959 } ] } diff --git a/tests/services/engine/camera/cameraFraming.test.ts b/tests/services/engine/camera/cameraFraming.test.ts index 18f8c43be9..3b7b7679a5 100644 --- a/tests/services/engine/camera/cameraFraming.test.ts +++ b/tests/services/engine/camera/cameraFraming.test.ts @@ -22,7 +22,9 @@ describe('GALACTIC_DISC_FORWARD', () => { GALACTIC_DISC_FORWARD, ORIENTATION_FRAMES.ecliptic, ); - expect(yaw).toBeCloseTo(-1.4208, 6); - expect(pitch).toBeCloseTo(-0.1783, 6); + // 4 places, not 6: the exact J2000 obliquity re-tilts the ecliptic frame by + // ~2e-6 rad, still well inside a mistyped fourth decimal. + expect(yaw).toBeCloseTo(-1.4208, 4); + expect(pitch).toBeCloseTo(-0.1783, 4); }); }); diff --git a/tests/services/engine/frame/earthTerminator.test.ts b/tests/services/engine/frame/earthTerminator.test.ts index a87a0cec9d..9c46cb06fd 100644 --- a/tests/services/engine/frame/earthTerminator.test.ts +++ b/tests/services/engine/frame/earthTerminator.test.ts @@ -14,7 +14,7 @@ import { cubeSphereMesh } from '../../../../src/utils/math/cubeSphereMesh'; * Sub-solar longitude at 14:00 UTC: the Sun crosses the Greenwich meridian near * 12:00 UTC and the sub-solar point moves 15°/hour westward, so at 14:00 it sits * near -30°. Cross-checked via sidereal time: GMST ≈ 149.3°, the Sun's apparent - * right ascension ≈ 120.6° (ecliptic longitude ~118.5°, obliquity 23.44°), so the + * right ascension ≈ 120.6° (ecliptic longitude ~118.5°, obliquity 23.439°), so the * sub-solar geographic longitude = RA - GMST ≈ -28.7°. Sub-solar latitude ≈ +20.5° * (late-July solar declination). Denmark at (10°E, 56°N) is ~39° of longitude east * of that meridian — well inside the 90° day hemisphere — so it MUST be lit. diff --git a/tests/services/engine/frame/passes/orbitTrailsPass.test.ts b/tests/services/engine/frame/passes/orbitTrailsPass.test.ts index 683b3b32eb..0ad439b246 100644 --- a/tests/services/engine/frame/passes/orbitTrailsPass.test.ts +++ b/tests/services/engine/frame/passes/orbitTrailsPass.test.ts @@ -33,6 +33,7 @@ import { ORBITAL_ELEMENTS } from '../../../../../src/data/bodies/orbitalElements import { CORE_TRAIL_ELEMENTS } from '../../../../../src/data/bodies/coreTrailElements'; import { SCENE_ANCHORS } from '../../../../../src/data/bodies/sceneAnchors'; import { deriveBodyStates } from '../../../../../src/services/engine/frame/deriveBodyStates'; +import { eccentricAnomalyFromMean } from '../../../../../src/utils/orbit/eccentricAnomalyFromMean'; import { propagateElements } from '../../../../../src/utils/orbit/propagateElements'; import { keplerianEllipse } from '../../../../../src/utils/orbit/keplerianEllipse'; import { keplerianPositionMpc } from '../../../../../src/utils/orbit/keplerianPositionMpc'; @@ -76,6 +77,21 @@ vi.mock('../../../../../src/utils/camera/composeOrbitConic', () => ({ })); import { composeOrbitConic } from '../../../../../src/utils/camera/composeOrbitConic'; +// Lets one test hand the pass a snapshot that differs from raw Kepler; unset, the +// real map passes through untouched. +const snapshotOverride = vi.hoisted(() => ({ states: undefined as unknown })); +vi.mock('../../../../../src/services/engine/frame/sceneBodyStates', async (importOriginal) => { + const actual = + await importOriginal< + typeof import('../../../../../src/services/engine/frame/sceneBodyStates') + >(); + return { + sceneBodyStates: ((...args: Parameters) => + (snapshotOverride.states as ReturnType | undefined) ?? + actual.sceneBodyStates(...args)) as typeof actual.sceneBodyStates, + }; +}); + const composeMock = composeOrbitConic as unknown as ReturnType; // The J2000 oracle `SCENE_ORBIT_CONICS` used to provide, hand-derived here with @@ -585,6 +601,58 @@ describe('orbitTrailsPass.draw', () => { expect(drift).toBeGreaterThan(1e-13); }); + it('trail follows a snapshot position that differs from raw Kepler', () => { + const simDays = CONST_J2000 + 100; + const real = deriveBodyStates(simDays); + const moonEl = CORE_TRAIL_ELEMENTS.find((e) => e.id === 'moon')!; + const moonState = real.get('moon')!; + // 1e6 km off raw Kepler, asymmetric so a dropped axis shows. + const shiftMpc = [1e6, -4e5, 2.5e5].map((km) => km * SCALE_UNITS.KM_TO_MPC); + const stubbed: Vec3 = [ + moonState.positionMpc[0] + shiftMpc[0]!, + moonState.positionMpc[1] + shiftMpc[1]!, + moonState.positionMpc[2] + shiftMpc[2]!, + ]; + snapshotOverride.states = new Map(real).set('moon', { ...moonState, positionMpc: stubbed }); + try { + // Eye 100 km off the body. The basis is packed in f32, whose ulp at the Moon's + // ~4e5 km semi-major axis is 30 m, so 0.1 km is the tightest honest bound; the + // injected 1e6 km offset is four orders above it. + const eye: Vec3 = [stubbed[0] + 100 * SCALE_UNITS.KM_TO_MPC, stubbed[1], stubbed[2]]; + const ctx = { + snapshot: { + simDays, + focusBlend: 0, + nowMs: 0, + renderTargets: { farDepthView: () => FAR_DEPTH_VIEW_STUB }, + }, + bodyPose: () => null, + drawCamPos: eye, + drawPxPerRad: FIXTURE_PX_PER_RAD, + cam: { distance: 1e-13 }, + } as unknown as FrameView; + const renderer = makeRendererSpy(); + orbitTrailsPass.draw(PASS_STUB, makeNear0View(), ctx, { + ...makeState(renderer), + orbitTrailRows: [moonEl], + } as unknown as EngineState); + + const [, { instances: staging, count }] = renderer.draw.mock.calls[0]!; + expect(count).toBe(1); + const { eccentricity, meanAnomalyRad } = propagateElements(moonEl, simDays); + const eAnom = eccentricAnomalyFromMean(meanAnomalyRad, eccentricity); + const [cosE, sinE] = [Math.cos(eAnom), Math.sin(eAnom)]; + const kmPerMpc = 1 / SCALE_UNITS.KM_TO_MPC; + for (let axis = 0; axis < 3; axis++) { + const bodyKm = + staging[34 + axis]! + staging[38 + axis]! * cosE + staging[42 + axis]! * sinE; + expect(Math.abs(bodyKm - (stubbed[axis]! - eye[axis]!) * kmPerMpc)).toBeLessThan(0.1); + } + } finally { + snapshotOverride.states = undefined; + } + }); + it('stages no conic for the mesh bodies (whale, petunias) even when the Moon trail is emitted', () => { // Same pose as "rides a moon trail on its propagated parent" above — parking // the camera at Earth is what makes the Moon's tiny geocentric orbit survive diff --git a/tests/services/engine/frame/settleGoldenTrace.test.ts b/tests/services/engine/frame/settleGoldenTrace.test.ts index 9cd61162ca..ce8c85e4b4 100644 --- a/tests/services/engine/frame/settleGoldenTrace.test.ts +++ b/tests/services/engine/frame/settleGoldenTrace.test.ts @@ -231,7 +231,7 @@ describe('settle golden trace (byte bar for the orientation settles)', () => { const trace = thin(runScript(northUp)); if (process.env['SETTLE_GOLDEN_RECORD']) { recorded[key] = trace; - writeFileSync(FIXTURE_PATH, `${JSON.stringify(recorded)}\n`); + writeFileSync(FIXTURE_PATH, `${JSON.stringify(recorded, null, 2)}\n`); return; } expectTraceMatches(trace, (GOLDEN as Record)[key]!); diff --git a/tests/utils/orbit/propagateElements.test.ts b/tests/utils/orbit/propagateElements.test.ts index 123152deb9..b4cbade8e5 100644 --- a/tests/utils/orbit/propagateElements.test.ts +++ b/tests/utils/orbit/propagateElements.test.ts @@ -90,9 +90,9 @@ describe('propagateElements', () => { // The scene frame is equatorial J2000 (keplerianEllipse rotates the ecliptic // elements through ECLIPTIC_FRAME), matching Horizons' ICRF frame to sub- // arcsecond bias. Tolerance is arcminute-class: the mean-element model differs - // from the true DE ephemeris by ~1 arcmin (~2e-4 au at 1 au), and the scene's - // rounded 23.44° obliquity adds ~2 arcsec. A frame swap, unit slip, or sign - // error in a rate would miss by ≥0.05 au and fail loudly. + // from the true DE ephemeris by ~1 arcmin (~2e-4 au at 1 au); the scene's J2000 + // obliquity is exact, so it adds none. A frame swap, unit slip, or sign error in a + // rate would miss by ≥0.05 au and fail loudly. const simDays = 2_460_676.5; const horizonsAu: Vec3 = [-1.786710910310161e-1, 8.871846912692936e-1, 3.845832338744293e-1]; const expectedMpc = horizonsAu.map((au) => au * SCALE_UNITS.AU_TO_MPC) as Vec3; diff --git a/tools/perf/perfScenarios.ts b/tools/perf/perfScenarios.ts index 1e201da978..0e652fb789 100644 --- a/tools/perf/perfScenarios.ts +++ b/tools/perf/perfScenarios.ts @@ -49,7 +49,7 @@ export type PerfScenario = { readonly name: string; readonly pose: PerfPose }; // time). // Factored out so those poses differ only in the axes that actually vary // (distance/yaw/pitch) and the target can never drift between them. -const EARTH_TARGET: Vec3 = [-8.5895045e-13, 4.3022234e-12, 1.865304e-12]; +const EARTH_TARGET: Vec3 = [-8.5895045e-13, 4.3022465e-12, 1.8652508e-12]; // The shared look-at point for `milky-way-outside` and `milky-way-close`: the // galactic centre (~8 kpc off the origin — contrast `EARTH_TARGET`'s ~1 AU).