@photivra/engine 1.4.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +401 -6
- package/CITATION.cff +1 -1
- package/NODE_SUPPORT.md +64 -12
- package/README.md +301 -182
- package/SECURITY.md +37 -28
- package/THIRD_PARTY.md +148 -4
- package/dist/camera/equivalent-focal-length.d.ts +13 -14
- package/dist/camera/equivalent-focal-length.js +15 -13
- package/dist/camera/equivalent-focal-length.js.map +1 -1
- package/dist/camera/field-of-view.d.ts +30 -19
- package/dist/camera/field-of-view.js +67 -18
- package/dist/camera/field-of-view.js.map +1 -1
- package/dist/camera/lens-projection.d.ts +170 -0
- package/dist/camera/lens-projection.js +444 -0
- package/dist/camera/lens-projection.js.map +1 -0
- package/dist/camera/projected-object-size.d.ts +10 -11
- package/dist/camera/projected-object-size.js +12 -10
- package/dist/camera/projected-object-size.js.map +1 -1
- package/dist/capture/capture-export-metadata.d.ts +9 -10
- package/dist/capture/capture-export-metadata.js +8 -5
- package/dist/capture/capture-export-metadata.js.map +1 -1
- package/dist/capture/dng-import.d.ts +91 -0
- package/dist/capture/dng-import.js +343 -0
- package/dist/capture/dng-import.js.map +1 -0
- package/dist/capture/environment-raw-producer.d.ts +37 -17
- package/dist/capture/environment-raw-producer.js +43 -19
- package/dist/capture/environment-raw-producer.js.map +1 -1
- package/dist/capture/export-jpeg.d.ts +35 -4
- package/dist/capture/export-jpeg.js +133 -47
- package/dist/capture/export-jpeg.js.map +1 -1
- package/dist/capture/export-tiff.d.ts +48 -24
- package/dist/capture/export-tiff.js +91 -31
- package/dist/capture/export-tiff.js.map +1 -1
- package/dist/capture/focus-control.d.ts +42 -65
- package/dist/capture/focus-control.js +56 -75
- package/dist/capture/focus-control.js.map +1 -1
- package/dist/capture/host-yield-cadence.d.ts +25 -0
- package/dist/capture/host-yield-cadence.js +25 -0
- package/dist/capture/host-yield-cadence.js.map +1 -0
- package/dist/capture/linear-encoding.d.ts +14 -12
- package/dist/capture/linear-encoding.js +14 -13
- package/dist/capture/linear-encoding.js.map +1 -1
- package/dist/capture/lossless-jpeg.d.ts +27 -0
- package/dist/capture/lossless-jpeg.js +237 -0
- package/dist/capture/lossless-jpeg.js.map +1 -0
- package/dist/capture/native-environment-lean.d.ts +227 -0
- package/dist/capture/native-environment-lean.js +974 -0
- package/dist/capture/native-environment-lean.js.map +1 -0
- package/dist/capture/native-environment-optical-stage.d.ts +97 -0
- package/dist/capture/native-environment-optical-stage.js +340 -0
- package/dist/capture/native-environment-optical-stage.js.map +1 -0
- package/dist/capture/native-environment-raw.d.ts +140 -6
- package/dist/capture/native-environment-raw.js +435 -34
- package/dist/capture/native-environment-raw.js.map +1 -1
- package/dist/capture/native-raw-development.d.ts +118 -5
- package/dist/capture/native-raw-development.js +224 -59
- package/dist/capture/native-raw-development.js.map +1 -1
- package/dist/capture/native-raw-dng.d.ts +60 -0
- package/dist/capture/native-raw-dng.js +167 -0
- package/dist/capture/native-raw-dng.js.map +1 -0
- package/dist/capture/native-raw.d.ts +67 -10
- package/dist/capture/native-raw.js +90 -24
- package/dist/capture/native-raw.js.map +1 -1
- package/dist/capture/packed-sensor-raw.d.ts +160 -0
- package/dist/capture/packed-sensor-raw.js +221 -0
- package/dist/capture/packed-sensor-raw.js.map +1 -0
- package/dist/capture/photographic-export.d.ts +58 -35
- package/dist/capture/photographic-export.js +177 -70
- package/dist/capture/photographic-export.js.map +1 -1
- package/dist/capture/raw-development-kernel.d.ts +52 -0
- package/dist/capture/raw-development-kernel.js +88 -0
- package/dist/capture/raw-development-kernel.js.map +1 -0
- package/dist/capture/raw-frame-limits.d.ts +7 -7
- package/dist/capture/raw-frame-limits.js +7 -6
- package/dist/capture/raw-frame-limits.js.map +1 -1
- package/dist/capture/raw-frame-reconstruction.d.ts +8 -9
- package/dist/capture/raw-frame-reconstruction.js +9 -8
- package/dist/capture/raw-frame-reconstruction.js.map +1 -1
- package/dist/capture/raw-white-level.d.ts +55 -0
- package/dist/capture/raw-white-level.js +165 -0
- package/dist/capture/raw-white-level.js.map +1 -0
- package/dist/capture/release-sequence.d.ts +5 -7
- package/dist/capture/release-sequence.js +15 -13
- package/dist/capture/release-sequence.js.map +1 -1
- package/dist/capture/sensor-raw-frame.d.ts +5 -6
- package/dist/capture/sensor-raw-frame.js +26 -9
- package/dist/capture/sensor-raw-frame.js.map +1 -1
- package/dist/capture/sensor-raw-producer.d.ts +21 -13
- package/dist/capture/sensor-raw-producer.js +86 -25
- package/dist/capture/sensor-raw-producer.js.map +1 -1
- package/dist/capture/simulated-capture.d.ts +15 -16
- package/dist/capture/simulated-capture.js +22 -12
- package/dist/capture/simulated-capture.js.map +1 -1
- package/dist/color/camera-color-matrix.d.ts +69 -0
- package/dist/color/camera-color-matrix.js +132 -0
- package/dist/color/camera-color-matrix.js.map +1 -0
- package/dist/color/capture-color.d.ts +17 -10
- package/dist/color/capture-color.js +50 -17
- package/dist/color/capture-color.js.map +1 -1
- package/dist/color/chromatic-adaptation.d.ts +63 -0
- package/dist/color/chromatic-adaptation.js +91 -0
- package/dist/color/chromatic-adaptation.js.map +1 -0
- package/dist/color/color-difference.d.ts +104 -0
- package/dist/color/color-difference.js +205 -0
- package/dist/color/color-difference.js.map +1 -0
- package/dist/color/color-matching-functions.d.ts +168 -0
- package/dist/color/color-matching-functions.js +309 -0
- package/dist/color/color-matching-functions.js.map +1 -0
- package/dist/color/colorimetry-math.d.ts +52 -0
- package/dist/color/colorimetry-math.js +144 -0
- package/dist/color/colorimetry-math.js.map +1 -0
- package/dist/color/gamut-mapping.d.ts +54 -0
- package/dist/color/gamut-mapping.js +107 -0
- package/dist/color/gamut-mapping.js.map +1 -0
- package/dist/color/illuminants.d.ts +182 -0
- package/dist/color/illuminants.js +434 -0
- package/dist/color/illuminants.js.map +1 -0
- package/dist/color/rgb-color-spaces.d.ts +79 -0
- package/dist/color/rgb-color-spaces.js +115 -0
- package/dist/color/rgb-color-spaces.js.map +1 -0
- package/dist/color/sensor-color-development.d.ts +33 -11
- package/dist/color/sensor-color-development.js +104 -30
- package/dist/color/sensor-color-development.js.map +1 -1
- package/dist/color/srgb-icc.d.ts +9 -2
- package/dist/color/srgb-icc.js +16 -5
- package/dist/color/srgb-icc.js.map +1 -1
- package/dist/color/srgb-transfer.d.ts +1 -2
- package/dist/color/srgb-transfer.js +1 -1
- package/dist/color/srgb-transfer.js.map +1 -1
- package/dist/color/white-balance.d.ts +68 -19
- package/dist/color/white-balance.js +168 -35
- package/dist/color/white-balance.js.map +1 -1
- package/dist/composition/image-formation-plan.d.ts +152 -128
- package/dist/composition/image-formation-plan.js +292 -138
- package/dist/composition/image-formation-plan.js.map +1 -1
- package/dist/composition/plan-consumer.d.ts +6 -7
- package/dist/composition/plan-consumer.js +14 -11
- package/dist/composition/plan-consumer.js.map +1 -1
- package/dist/core/calculation-result.d.ts +21 -14
- package/dist/core/calculation-result.js +209 -11
- package/dist/core/calculation-result.js.map +1 -1
- package/dist/core/canonical-json.d.ts +13 -8
- package/dist/core/canonical-json.js +34 -15
- package/dist/core/canonical-json.js.map +1 -1
- package/dist/core/configuration-error.d.ts +5 -4
- package/dist/core/configuration-error.js +5 -3
- package/dist/core/configuration-error.js.map +1 -1
- package/dist/core/evidence-provenance.d.ts +12 -12
- package/dist/core/evidence-provenance.js +10 -9
- package/dist/core/evidence-provenance.js.map +1 -1
- package/dist/core/image-formation.d.ts +11 -10
- package/dist/core/image-formation.js +11 -9
- package/dist/core/image-formation.js.map +1 -1
- package/dist/core/owned-data.d.ts +9 -17
- package/dist/core/owned-data.js +9 -16
- package/dist/core/owned-data.js.map +1 -1
- package/dist/core/portable-math.d.ts +15 -0
- package/dist/core/portable-math.js +56 -0
- package/dist/core/portable-math.js.map +1 -0
- package/dist/core/record-validation.d.ts +48 -9
- package/dist/core/record-validation.js +93 -19
- package/dist/core/record-validation.js.map +1 -1
- package/dist/core/scientific-assurance.d.ts +16 -14
- package/dist/core/scientific-assurance.js +22 -18
- package/dist/core/scientific-assurance.js.map +1 -1
- package/dist/core/spectral-composition.d.ts +13 -14
- package/dist/core/spectral-composition.js +30 -27
- package/dist/core/spectral-composition.js.map +1 -1
- package/dist/core/spectral.d.ts +5 -6
- package/dist/core/spectral.js +9 -7
- package/dist/core/spectral.js.map +1 -1
- package/dist/core/validation.d.ts +3 -6
- package/dist/core/validation.js +3 -5
- package/dist/core/validation.js.map +1 -1
- package/dist/core/version.d.ts +6 -6
- package/dist/core/version.js +6 -5
- package/dist/core/version.js.map +1 -1
- package/dist/equipment/exposure-capabilities.d.ts +10 -10
- package/dist/equipment/exposure-capabilities.js +40 -30
- package/dist/equipment/exposure-capabilities.js.map +1 -1
- package/dist/equipment/generic-tier-assets.d.ts +13 -6
- package/dist/equipment/generic-tier-assets.js +34 -15
- package/dist/equipment/generic-tier-assets.js.map +1 -1
- package/dist/equipment/generic-tier-presets.d.ts +5 -6
- package/dist/equipment/generic-tier-presets.js +15 -13
- package/dist/equipment/generic-tier-presets.js.map +1 -1
- package/dist/equipment/iso-capabilities.d.ts +21 -22
- package/dist/equipment/iso-capabilities.js +49 -44
- package/dist/equipment/iso-capabilities.js.map +1 -1
- package/dist/equipment/metering-capabilities.d.ts +5 -6
- package/dist/equipment/metering-capabilities.js +22 -19
- package/dist/equipment/metering-capabilities.js.map +1 -1
- package/dist/equipment/release-capabilities.d.ts +3 -4
- package/dist/equipment/release-capabilities.js +18 -14
- package/dist/equipment/release-capabilities.js.map +1 -1
- package/dist/exposure/exposure-duration-control.d.ts +19 -17
- package/dist/exposure/exposure-duration-control.js +27 -23
- package/dist/exposure/exposure-duration-control.js.map +1 -1
- package/dist/exposure/exposure-mode-resolver.d.ts +42 -39
- package/dist/exposure/exposure-mode-resolver.js +127 -82
- package/dist/exposure/exposure-mode-resolver.js.map +1 -1
- package/dist/exposure/exposure.d.ts +17 -16
- package/dist/exposure/exposure.js +22 -15
- package/dist/exposure/exposure.js.map +1 -1
- package/dist/exposure/flash-ttl.d.ts +135 -0
- package/dist/exposure/flash-ttl.js +193 -0
- package/dist/exposure/flash-ttl.js.map +1 -0
- package/dist/exposure/flash.d.ts +144 -36
- package/dist/exposure/flash.js +259 -59
- package/dist/exposure/flash.js.map +1 -1
- package/dist/exposure/metering-scene-radiance.d.ts +10 -10
- package/dist/exposure/metering-scene-radiance.js +42 -23
- package/dist/exposure/metering-scene-radiance.js.map +1 -1
- package/dist/exposure/metering-target.d.ts +8 -8
- package/dist/exposure/metering-target.js +30 -20
- package/dist/exposure/metering-target.js.map +1 -1
- package/dist/exposure/metering-temporal.d.ts +16 -15
- package/dist/exposure/metering-temporal.js +41 -19
- package/dist/exposure/metering-temporal.js.map +1 -1
- package/dist/exposure/metering.d.ts +64 -17
- package/dist/exposure/metering.js +159 -30
- package/dist/exposure/metering.js.map +1 -1
- package/dist/exposure/program-line.d.ts +5 -5
- package/dist/exposure/program-line.js +20 -13
- package/dist/exposure/program-line.js.map +1 -1
- package/dist/facade/camera-preset.d.ts +8 -0
- package/dist/facade/camera-preset.js +102 -0
- package/dist/facade/camera-preset.js.map +1 -0
- package/dist/facade/chart-radiance-batch.d.ts +57 -0
- package/dist/facade/chart-radiance-batch.js +121 -0
- package/dist/facade/chart-radiance-batch.js.map +1 -0
- package/dist/facade/chart-scenes.d.ts +177 -0
- package/dist/facade/chart-scenes.js +232 -0
- package/dist/facade/chart-scenes.js.map +1 -0
- package/dist/facade/host-yield.d.ts +7 -0
- package/dist/facade/host-yield.js +23 -0
- package/dist/facade/host-yield.js.map +1 -0
- package/dist/facade/scene-radiance.d.ts +117 -0
- package/dist/facade/scene-radiance.js +205 -0
- package/dist/facade/scene-radiance.js.map +1 -0
- package/dist/facade/simulate-capture.d.ts +284 -0
- package/dist/facade/simulate-capture.js +1026 -0
- package/dist/facade/simulate-capture.js.map +1 -0
- package/dist/gpu/chart-radiance-gpu.d.ts +17 -0
- package/dist/gpu/chart-radiance-gpu.js +176 -0
- package/dist/gpu/chart-radiance-gpu.js.map +1 -0
- package/dist/gpu/image-kernel-accelerator.d.ts +132 -0
- package/dist/gpu/image-kernel-accelerator.js +720 -0
- package/dist/gpu/image-kernel-accelerator.js.map +1 -0
- package/dist/gpu/image-kernel-execution.d.ts +92 -0
- package/dist/gpu/image-kernel-execution.js +84 -0
- package/dist/gpu/image-kernel-execution.js.map +1 -0
- package/dist/gpu/sensor-stage-gpu.d.ts +44 -0
- package/dist/gpu/sensor-stage-gpu.js +317 -0
- package/dist/gpu/sensor-stage-gpu.js.map +1 -0
- package/dist/gpu/temporal-sum-gpu.d.ts +23 -0
- package/dist/gpu/temporal-sum-gpu.js +150 -0
- package/dist/gpu/temporal-sum-gpu.js.map +1 -0
- package/dist/gpu/webgpu-runtime.d.ts +63 -0
- package/dist/gpu/webgpu-runtime.js +215 -0
- package/dist/gpu/webgpu-runtime.js.map +1 -0
- package/dist/gpu/wgsl-chart-kernel.d.ts +30 -0
- package/dist/gpu/wgsl-chart-kernel.js +165 -0
- package/dist/gpu/wgsl-chart-kernel.js.map +1 -0
- package/dist/gpu/wgsl-kernels.d.ts +53 -0
- package/dist/gpu/wgsl-kernels.js +365 -0
- package/dist/gpu/wgsl-kernels.js.map +1 -0
- package/dist/gpu/wgsl-sensor-kernel.d.ts +64 -0
- package/dist/gpu/wgsl-sensor-kernel.js +409 -0
- package/dist/gpu/wgsl-sensor-kernel.js.map +1 -0
- package/dist/index.d.ts +89 -25
- package/dist/index.js +59 -15
- package/dist/index.js.map +1 -1
- package/dist/motion/camera-rotation.d.ts +92 -40
- package/dist/motion/camera-rotation.js +84 -47
- package/dist/motion/camera-rotation.js.map +1 -1
- package/dist/motion/capture-rotation-inverse-mapping.d.ts +37 -34
- package/dist/motion/capture-rotation-inverse-mapping.js +32 -24
- package/dist/motion/capture-rotation-inverse-mapping.js.map +1 -1
- package/dist/motion/capture-rotation-temporal-quadrature.d.ts +39 -35
- package/dist/motion/capture-rotation-temporal-quadrature.js +37 -28
- package/dist/motion/capture-rotation-temporal-quadrature.js.map +1 -1
- package/dist/motion/capture-rotation-trajectory.d.ts +32 -28
- package/dist/motion/capture-rotation-trajectory.js +36 -26
- package/dist/motion/capture-rotation-trajectory.js.map +1 -1
- package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts +23 -21
- package/dist/motion/capture-translation-parallax-temporal-quadrature.js +33 -14
- package/dist/motion/capture-translation-parallax-temporal-quadrature.js.map +1 -1
- package/dist/motion/extended-object-projection.d.ts +19 -16
- package/dist/motion/extended-object-projection.js +38 -18
- package/dist/motion/extended-object-projection.js.map +1 -1
- package/dist/motion/projected-motion.d.ts +18 -17
- package/dist/motion/projected-motion.js +25 -17
- package/dist/motion/projected-motion.js.map +1 -1
- package/dist/motion/temporal-exposure-sum.d.ts +55 -0
- package/dist/motion/temporal-exposure-sum.js +141 -0
- package/dist/motion/temporal-exposure-sum.js.map +1 -0
- package/dist/motion/video-sequence.d.ts +111 -0
- package/dist/motion/video-sequence.js +179 -0
- package/dist/motion/video-sequence.js.map +1 -0
- package/dist/optics/aperture.d.ts +14 -15
- package/dist/optics/aperture.js +13 -11
- package/dist/optics/aperture.js.map +1 -1
- package/dist/optics/atmospheric-haze.d.ts +83 -0
- package/dist/optics/atmospheric-haze.js +113 -0
- package/dist/optics/atmospheric-haze.js.map +1 -0
- package/dist/optics/brown-conrady-distortion.d.ts +116 -0
- package/dist/optics/brown-conrady-distortion.js +291 -0
- package/dist/optics/brown-conrady-distortion.js.map +1 -0
- package/dist/optics/circle-of-confusion.d.ts +10 -10
- package/dist/optics/circle-of-confusion.js +15 -11
- package/dist/optics/circle-of-confusion.js.map +1 -1
- package/dist/optics/complex-pupil-psf.d.ts +64 -33
- package/dist/optics/complex-pupil-psf.js +190 -98
- package/dist/optics/complex-pupil-psf.js.map +1 -1
- package/dist/optics/depth-of-field.d.ts +25 -15
- package/dist/optics/depth-of-field.js +67 -27
- package/dist/optics/depth-of-field.js.map +1 -1
- package/dist/optics/diffraction.d.ts +14 -13
- package/dist/optics/diffraction.js +14 -10
- package/dist/optics/diffraction.js.map +1 -1
- package/dist/optics/focus-breathing.d.ts +88 -27
- package/dist/optics/focus-breathing.js +114 -23
- package/dist/optics/focus-breathing.js.map +1 -1
- package/dist/optics/focus-state.d.ts +18 -18
- package/dist/optics/focus-state.js +21 -15
- package/dist/optics/focus-state.js.map +1 -1
- package/dist/optics/front-of-lens-filter.d.ts +45 -14
- package/dist/optics/front-of-lens-filter.js +259 -88
- package/dist/optics/front-of-lens-filter.js.map +1 -1
- package/dist/optics/illumination-vignetting.d.ts +16 -17
- package/dist/optics/illumination-vignetting.js +40 -17
- package/dist/optics/illumination-vignetting.js.map +1 -1
- package/dist/optics/irradiance-convolution.d.ts +59 -0
- package/dist/optics/irradiance-convolution.js +138 -0
- package/dist/optics/irradiance-convolution.js.map +1 -0
- package/dist/optics/lateral-chromatic-aberration.d.ts +33 -30
- package/dist/optics/lateral-chromatic-aberration.js +33 -23
- package/dist/optics/lateral-chromatic-aberration.js.map +1 -1
- package/dist/optics/lens-psf-kernels.d.ts +89 -0
- package/dist/optics/lens-psf-kernels.js +175 -0
- package/dist/optics/lens-psf-kernels.js.map +1 -0
- package/dist/optics/lens-psf-profile.d.ts +78 -46
- package/dist/optics/lens-psf-profile.js +335 -124
- package/dist/optics/lens-psf-profile.js.map +1 -1
- package/dist/optics/longitudinal-chromatic-aberration.d.ts +102 -0
- package/dist/optics/longitudinal-chromatic-aberration.js +210 -0
- package/dist/optics/longitudinal-chromatic-aberration.js.map +1 -0
- package/dist/optics/polygon-diffraction.d.ts +80 -23
- package/dist/optics/polygon-diffraction.js +130 -25
- package/dist/optics/polygon-diffraction.js.map +1 -1
- package/dist/optics/profile-contract.d.ts +5 -6
- package/dist/optics/profile-contract.js +14 -11
- package/dist/optics/profile-contract.js.map +1 -1
- package/dist/optics/psf-foundation.d.ts +23 -23
- package/dist/optics/psf-foundation.js +24 -21
- package/dist/optics/psf-foundation.js.map +1 -1
- package/dist/optics/pupil-vignetting.d.ts +118 -0
- package/dist/optics/pupil-vignetting.js +264 -0
- package/dist/optics/pupil-vignetting.js.map +1 -0
- package/dist/optics/radial-distortion.d.ts +34 -33
- package/dist/optics/radial-distortion.js +37 -30
- package/dist/optics/radial-distortion.js.map +1 -1
- package/dist/optics/scene-to-sensor-irradiance.d.ts +47 -33
- package/dist/optics/scene-to-sensor-irradiance.js +73 -45
- package/dist/optics/scene-to-sensor-irradiance.js.map +1 -1
- package/dist/optics/scene-to-sensor-quadrature.d.ts +23 -18
- package/dist/optics/scene-to-sensor-quadrature.js +16 -11
- package/dist/optics/scene-to-sensor-quadrature.js.map +1 -1
- package/dist/optics/sensor-aperture-rays.d.ts +20 -4
- package/dist/optics/sensor-aperture-rays.js +32 -14
- package/dist/optics/sensor-aperture-rays.js.map +1 -1
- package/dist/optics/sensor-environment-query.d.ts +81 -16
- package/dist/optics/sensor-environment-query.js +145 -12
- package/dist/optics/sensor-environment-query.js.map +1 -1
- package/dist/optics/sensor-psf-quadrature.d.ts +12 -10
- package/dist/optics/sensor-psf-quadrature.js +18 -11
- package/dist/optics/sensor-psf-quadrature.js.map +1 -1
- package/dist/optics/sensor-psf-support.d.ts +8 -6
- package/dist/optics/sensor-psf-support.js +8 -5
- package/dist/optics/sensor-psf-support.js.map +1 -1
- package/dist/optics/stray-light.d.ts +22 -19
- package/dist/optics/stray-light.js +18 -12
- package/dist/optics/stray-light.js.map +1 -1
- package/dist/optics/thin-lens.d.ts +10 -9
- package/dist/optics/thin-lens.js +12 -8
- package/dist/optics/thin-lens.js.map +1 -1
- package/dist/optics/zernike-wavefront.d.ts +154 -0
- package/dist/optics/zernike-wavefront.js +352 -0
- package/dist/optics/zernike-wavefront.js.map +1 -0
- package/dist/output/capture-corrected-sdr.d.ts +16 -8
- package/dist/output/capture-corrected-sdr.js +16 -8
- package/dist/output/capture-corrected-sdr.js.map +1 -1
- package/dist/output/capture-geometry.d.ts +34 -36
- package/dist/output/capture-geometry.js +52 -32
- package/dist/output/capture-geometry.js.map +1 -1
- package/dist/output/capture-sdr.d.ts +7 -6
- package/dist/output/capture-sdr.js +11 -8
- package/dist/output/capture-sdr.js.map +1 -1
- package/dist/output/crop.d.ts +22 -6
- package/dist/output/crop.js +40 -6
- package/dist/output/crop.js.map +1 -1
- package/dist/output/geometric-transforms.d.ts +60 -23
- package/dist/output/geometric-transforms.js +111 -24
- package/dist/output/geometric-transforms.js.map +1 -1
- package/dist/output/lens-corrections.d.ts +27 -19
- package/dist/output/lens-corrections.js +29 -13
- package/dist/output/lens-corrections.js.map +1 -1
- package/dist/output/native-capture-sdr.d.ts +71 -16
- package/dist/output/native-capture-sdr.js +190 -33
- package/dist/output/native-capture-sdr.js.map +1 -1
- package/dist/output/png-encoder.d.ts +65 -0
- package/dist/output/png-encoder.js +461 -0
- package/dist/output/png-encoder.js.map +1 -0
- package/dist/output/print-contrast-reference.d.ts +10 -9
- package/dist/output/print-contrast-reference.js +10 -8
- package/dist/output/print-contrast-reference.js.map +1 -1
- package/dist/output/print-detail.d.ts +18 -17
- package/dist/output/print-detail.js +12 -10
- package/dist/output/print-detail.js.map +1 -1
- package/dist/output/print-jpeg.d.ts +26 -5
- package/dist/output/print-jpeg.js +117 -50
- package/dist/output/print-jpeg.js.map +1 -1
- package/dist/output/print-plan.d.ts +19 -19
- package/dist/output/print-plan.js +11 -10
- package/dist/output/print-plan.js.map +1 -1
- package/dist/output/print-region-statistics.d.ts +14 -15
- package/dist/output/print-region-statistics.js +11 -11
- package/dist/output/print-region-statistics.js.map +1 -1
- package/dist/output/sdr-rendering.d.ts +48 -10
- package/dist/output/sdr-rendering.js +114 -25
- package/dist/output/sdr-rendering.js.map +1 -1
- package/dist/output/subject-framing-crop.d.ts +6 -10
- package/dist/output/subject-framing-crop.js +23 -13
- package/dist/output/subject-framing-crop.js.map +1 -1
- package/dist/processing/demosaic.d.ts +90 -0
- package/dist/processing/demosaic.js +275 -0
- package/dist/processing/demosaic.js.map +1 -0
- package/dist/processing/denoise.d.ts +68 -0
- package/dist/processing/denoise.js +214 -0
- package/dist/processing/denoise.js.map +1 -0
- package/dist/processing/focus-stacking.d.ts +17 -0
- package/dist/processing/focus-stacking.js +80 -0
- package/dist/processing/focus-stacking.js.map +1 -0
- package/dist/processing/hdr.d.ts +54 -0
- package/dist/processing/hdr.js +172 -0
- package/dist/processing/hdr.js.map +1 -0
- package/dist/processing/image-ops.d.ts +66 -0
- package/dist/processing/image-ops.js +192 -0
- package/dist/processing/image-ops.js.map +1 -0
- package/dist/processing/panorama.d.ts +51 -0
- package/dist/processing/panorama.js +305 -0
- package/dist/processing/panorama.js.map +1 -0
- package/dist/processing/processing-task.d.ts +85 -0
- package/dist/processing/processing-task.js +164 -0
- package/dist/processing/processing-task.js.map +1 -0
- package/dist/processing/tone-mapping.d.ts +69 -0
- package/dist/processing/tone-mapping.js +310 -0
- package/dist/processing/tone-mapping.js.map +1 -0
- package/dist/schema/camera.d.ts +5 -4
- package/dist/schema/illumination-spectral.d.ts +13 -19
- package/dist/schema/illumination-spectral.js +23 -19
- package/dist/schema/illumination-spectral.js.map +1 -1
- package/dist/schema/illumination-temporal.d.ts +12 -15
- package/dist/schema/illumination-temporal.js +43 -28
- package/dist/schema/illumination-temporal.js.map +1 -1
- package/dist/schema/illumination.d.ts +5 -4
- package/dist/schema/illumination.js +55 -20
- package/dist/schema/illumination.js.map +1 -1
- package/dist/schema/scene-radiance-temporal.d.ts +9 -11
- package/dist/schema/scene-radiance-temporal.js +26 -23
- package/dist/schema/scene-radiance-temporal.js.map +1 -1
- package/dist/schema/scene-radiance.d.ts +17 -17
- package/dist/schema/scene-radiance.js +56 -34
- package/dist/schema/scene-radiance.js.map +1 -1
- package/dist/schema/scene.d.ts +14 -13
- package/dist/schema/validation.d.ts +0 -1
- package/dist/schema/validation.js +17 -15
- package/dist/schema/validation.js.map +1 -1
- package/dist/sensor/accumulated-charge.d.ts +45 -64
- package/dist/sensor/accumulated-charge.js +41 -47
- package/dist/sensor/accumulated-charge.js.map +1 -1
- package/dist/sensor/architecture.d.ts +22 -25
- package/dist/sensor/architecture.js +17 -16
- package/dist/sensor/architecture.js.map +1 -1
- package/dist/sensor/camera-saturation-capacity.d.ts +21 -28
- package/dist/sensor/camera-saturation-capacity.js +36 -34
- package/dist/sensor/camera-saturation-capacity.js.map +1 -1
- package/dist/sensor/capture-color-sampling-binding.d.ts +46 -51
- package/dist/sensor/capture-color-sampling-binding.js +39 -41
- package/dist/sensor/capture-color-sampling-binding.js.map +1 -1
- package/dist/sensor/capture-mode-timing.d.ts +8 -9
- package/dist/sensor/capture-mode-timing.js +24 -21
- package/dist/sensor/capture-mode-timing.js.map +1 -1
- package/dist/sensor/capture-mode.d.ts +28 -30
- package/dist/sensor/capture-mode.js +33 -31
- package/dist/sensor/capture-mode.js.map +1 -1
- package/dist/sensor/color-sampling.d.ts +30 -33
- package/dist/sensor/color-sampling.js +32 -37
- package/dist/sensor/color-sampling.js.map +1 -1
- package/dist/sensor/constant-rate-temporal-integration.d.ts +19 -23
- package/dist/sensor/constant-rate-temporal-integration.js +28 -26
- package/dist/sensor/constant-rate-temporal-integration.js.map +1 -1
- package/dist/sensor/dark-current.d.ts +53 -49
- package/dist/sensor/dark-current.js +87 -46
- package/dist/sensor/dark-current.js.map +1 -1
- package/dist/sensor/environment-photo-signal.d.ts +71 -30
- package/dist/sensor/environment-photo-signal.js +127 -46
- package/dist/sensor/environment-photo-signal.js.map +1 -1
- package/dist/sensor/eqe-electron-rate.d.ts +14 -13
- package/dist/sensor/eqe-electron-rate.js +34 -14
- package/dist/sensor/eqe-electron-rate.js.map +1 -1
- package/dist/sensor/eqe-local-exposure.d.ts +24 -24
- package/dist/sensor/eqe-local-exposure.js +15 -11
- package/dist/sensor/eqe-local-exposure.js.map +1 -1
- package/dist/sensor/eqe-temporal-exposure.d.ts +11 -11
- package/dist/sensor/eqe-temporal-exposure.js +15 -10
- package/dist/sensor/eqe-temporal-exposure.js.map +1 -1
- package/dist/sensor/exposure-window.d.ts +48 -34
- package/dist/sensor/exposure-window.js +77 -36
- package/dist/sensor/exposure-window.js.map +1 -1
- package/dist/sensor/fixed-pattern-noise.d.ts +108 -0
- package/dist/sensor/fixed-pattern-noise.js +166 -0
- package/dist/sensor/fixed-pattern-noise.js.map +1 -0
- package/dist/sensor/iso-gain.d.ts +44 -0
- package/dist/sensor/iso-gain.js +119 -0
- package/dist/sensor/iso-gain.js.map +1 -0
- package/dist/sensor/iso-signal-chain.d.ts +25 -48
- package/dist/sensor/iso-signal-chain.js +52 -66
- package/dist/sensor/iso-signal-chain.js.map +1 -1
- package/dist/sensor/local-exposure-binding.d.ts +21 -21
- package/dist/sensor/local-exposure-binding.js +22 -18
- package/dist/sensor/local-exposure-binding.js.map +1 -1
- package/dist/sensor/optical-stack.d.ts +36 -40
- package/dist/sensor/optical-stack.js +34 -37
- package/dist/sensor/optical-stack.js.map +1 -1
- package/dist/sensor/photon-energy.d.ts +22 -28
- package/dist/sensor/photon-energy.js +42 -34
- package/dist/sensor/photon-energy.js.map +1 -1
- package/dist/sensor/physical-charge-capacity.d.ts +20 -30
- package/dist/sensor/physical-charge-capacity.js +35 -36
- package/dist/sensor/physical-charge-capacity.js.map +1 -1
- package/dist/sensor/pixel-pitch.d.ts +2 -3
- package/dist/sensor/pixel-pitch.js +4 -2
- package/dist/sensor/pixel-pitch.js.map +1 -1
- package/dist/sensor/radiometry-readiness.d.ts +13 -15
- package/dist/sensor/radiometry-readiness.js +20 -17
- package/dist/sensor/radiometry-readiness.js.map +1 -1
- package/dist/sensor/raw-readout.d.ts +173 -83
- package/dist/sensor/raw-readout.js +425 -160
- package/dist/sensor/raw-readout.js.map +1 -1
- package/dist/sensor/raw-reconstruction.d.ts +112 -44
- package/dist/sensor/raw-reconstruction.js +200 -47
- package/dist/sensor/raw-reconstruction.js.map +1 -1
- package/dist/sensor/readout-exposure-linkage.d.ts +103 -34
- package/dist/sensor/readout-exposure-linkage.js +125 -27
- package/dist/sensor/readout-exposure-linkage.js.map +1 -1
- package/dist/sensor/readout-timing.d.ts +43 -44
- package/dist/sensor/readout-timing.js +38 -30
- package/dist/sensor/readout-timing.js.map +1 -1
- package/dist/sensor/response-application-compatibility.d.ts +21 -28
- package/dist/sensor/response-application-compatibility.js +35 -34
- package/dist/sensor/response-application-compatibility.js.map +1 -1
- package/dist/sensor/response-operating-range.d.ts +26 -35
- package/dist/sensor/response-operating-range.js +40 -39
- package/dist/sensor/response-operating-range.js.map +1 -1
- package/dist/sensor/responsivity-photocurrent.d.ts +21 -29
- package/dist/sensor/responsivity-photocurrent.js +57 -40
- package/dist/sensor/responsivity-photocurrent.js.map +1 -1
- package/dist/sensor/sampling-aperture.d.ts +21 -25
- package/dist/sensor/sampling-aperture.js +29 -28
- package/dist/sensor/sampling-aperture.js.map +1 -1
- package/dist/sensor/scene-eqe-temporal-exposure.d.ts +14 -12
- package/dist/sensor/scene-eqe-temporal-exposure.js +13 -8
- package/dist/sensor/scene-eqe-temporal-exposure.js.map +1 -1
- package/dist/sensor/sensor-geometry.d.ts +28 -32
- package/dist/sensor/sensor-geometry.js +35 -20
- package/dist/sensor/sensor-geometry.js.map +1 -1
- package/dist/sensor/signal-noise.d.ts +14 -16
- package/dist/sensor/signal-noise.js +15 -13
- package/dist/sensor/signal-noise.js.map +1 -1
- package/dist/sensor/spatial-sample-reduction.d.ts +45 -60
- package/dist/sensor/spatial-sample-reduction.js +39 -48
- package/dist/sensor/spatial-sample-reduction.js.map +1 -1
- package/dist/sensor/spatial-sampling-quadrature.d.ts +46 -54
- package/dist/sensor/spatial-sampling-quadrature.js +31 -36
- package/dist/sensor/spatial-sampling-quadrature.js.map +1 -1
- package/dist/sensor/spatio-spectral-reduction.d.ts +32 -42
- package/dist/sensor/spatio-spectral-reduction.js +24 -29
- package/dist/sensor/spatio-spectral-reduction.js.map +1 -1
- package/dist/sensor/spectral-coverage.d.ts +6 -9
- package/dist/sensor/spectral-coverage.js +9 -6
- package/dist/sensor/spectral-coverage.js.map +1 -1
- package/dist/sensor/spectral-quadrature.d.ts +46 -60
- package/dist/sensor/spectral-quadrature.js +38 -48
- package/dist/sensor/spectral-quadrature.js.map +1 -1
- package/dist/sensor/spectral-response.d.ts +53 -41
- package/dist/sensor/spectral-response.js +80 -47
- package/dist/sensor/spectral-response.js.map +1 -1
- package/dist/sensor/stochastic-seed.d.ts +50 -0
- package/dist/sensor/stochastic-seed.js +123 -0
- package/dist/sensor/stochastic-seed.js.map +1 -0
- package/dist/sensor/temporal-eqe-sum.d.ts +2 -4
- package/dist/sensor/temporal-eqe-sum.js +5 -6
- package/dist/sensor/temporal-eqe-sum.js.map +1 -1
- package/dist/sensor/temporal-photo-signal.d.ts +5 -6
- package/dist/sensor/temporal-photo-signal.js +11 -10
- package/dist/sensor/temporal-photo-signal.js.map +1 -1
- package/dist/sensor/temporal-sample-binding.d.ts +1 -2
- package/dist/sensor/temporal-sample-binding.js +3 -3
- package/dist/sensor/temporal-sample-binding.js.map +1 -1
- package/dist/simulation/poc-simulation.d.ts +16 -16
- package/dist/simulation/poc-simulation.js +20 -15
- package/dist/simulation/poc-simulation.js.map +1 -1
- package/dist/stabilization/camera-shake.d.ts +42 -18
- package/dist/stabilization/camera-shake.js +43 -20
- package/dist/stabilization/camera-shake.js.map +1 -1
- package/dist/stabilization/system.d.ts +44 -41
- package/dist/stabilization/system.js +196 -108
- package/dist/stabilization/system.js.map +1 -1
- package/docs/AGENT_GUIDE.md +183 -0
- package/docs/API_REFERENCE.md +761 -2
- package/docs/QUICK_START.md +495 -0
- package/docs/USAGE.md +1719 -714
- package/docs/api/camera-equivalent-focal-length.md +6 -7
- package/docs/api/camera-field-of-view.md +16 -8
- package/docs/api/camera-lens-projection.md +246 -0
- package/docs/api/camera-projected-object-size.md +6 -5
- package/docs/api/capture-capture-export-metadata.md +10 -10
- package/docs/api/capture-dng-import.md +134 -0
- package/docs/api/capture-environment-raw-producer.md +17 -11
- package/docs/api/capture-export-jpeg.md +16 -0
- package/docs/api/capture-focus-control.md +25 -47
- package/docs/api/capture-linear-encoding.md +21 -12
- package/docs/api/capture-lossless-jpeg.md +49 -0
- package/docs/api/capture-native-environment-optical-stage.md +75 -0
- package/docs/api/capture-native-environment-raw.md +161 -4
- package/docs/api/capture-native-raw-development.md +69 -4
- package/docs/api/capture-native-raw-dng.md +84 -0
- package/docs/api/capture-native-raw.md +23 -8
- package/docs/api/capture-packed-sensor-raw.md +156 -0
- package/docs/api/capture-photographic-export.md +69 -31
- package/docs/api/capture-raw-frame-reconstruction.md +8 -8
- package/docs/api/capture-raw-white-level.md +37 -0
- package/docs/api/capture-release-sequence.md +6 -7
- package/docs/api/capture-sensor-raw-frame.md +6 -6
- package/docs/api/capture-sensor-raw-producer.md +17 -11
- package/docs/api/capture-simulated-capture.md +15 -15
- package/docs/api/color-camera-color-matrix.md +103 -0
- package/docs/api/color-capture-color.md +22 -11
- package/docs/api/color-chromatic-adaptation.md +82 -0
- package/docs/api/color-color-difference.md +134 -0
- package/docs/api/color-color-matching-functions.md +259 -0
- package/docs/api/color-colorimetry-math.md +54 -0
- package/docs/api/color-gamut-mapping.md +72 -0
- package/docs/api/color-illuminants.md +280 -0
- package/docs/api/color-rgb-color-spaces.md +151 -0
- package/docs/api/color-sensor-color-development.md +27 -0
- package/docs/api/color-srgb-icc.md +2 -4
- package/docs/api/color-white-balance.md +95 -19
- package/docs/api/composition-image-formation-plan.md +124 -95
- package/docs/api/composition-plan-consumer.md +7 -7
- package/docs/api/core-calculation-result.md +18 -14
- package/docs/api/core-configuration-error.md +1 -1
- package/docs/api/core-image-formation.md +7 -7
- package/docs/api/core-scientific-assurance.md +12 -10
- package/docs/api/core-spectral-composition.md +14 -14
- package/docs/api/core-spectral.md +6 -6
- package/docs/api/core-validation.md +3 -3
- package/docs/api/core-version.md +7 -6
- package/docs/api/equipment-exposure-capabilities.md +11 -10
- package/docs/api/equipment-generic-tier-assets.md +7 -2
- package/docs/api/equipment-generic-tier-presets.md +6 -6
- package/docs/api/equipment-iso-capabilities.md +18 -18
- package/docs/api/equipment-metering-capabilities.md +6 -6
- package/docs/api/equipment-release-capabilities.md +4 -4
- package/docs/api/exports.json +2213 -8
- package/docs/api/exposure-exposure-duration-control.md +9 -9
- package/docs/api/exposure-exposure-mode-resolver.md +35 -31
- package/docs/api/exposure-exposure.md +10 -10
- package/docs/api/exposure-flash-ttl.md +182 -0
- package/docs/api/exposure-flash.md +183 -28
- package/docs/api/exposure-metering-scene-radiance.md +11 -10
- package/docs/api/exposure-metering-target.md +9 -8
- package/docs/api/exposure-metering-temporal.md +8 -8
- package/docs/api/exposure-metering.md +69 -9
- package/docs/api/exposure-program-line.md +6 -5
- package/docs/api/facade-chart-radiance-batch.md +96 -0
- package/docs/api/facade-chart-scenes.md +240 -0
- package/docs/api/facade-scene-radiance.md +122 -0
- package/docs/api/facade-simulate-capture.md +324 -0
- package/docs/api/gpu-image-kernel-accelerator.md +157 -0
- package/docs/api/gpu-image-kernel-execution.md +152 -0
- package/docs/api/motion-camera-rotation.md +43 -26
- package/docs/api/motion-capture-rotation-inverse-mapping.md +24 -23
- package/docs/api/motion-capture-rotation-temporal-quadrature.md +22 -22
- package/docs/api/motion-capture-rotation-trajectory.md +15 -15
- package/docs/api/motion-capture-translation-parallax-temporal-quadrature.md +15 -14
- package/docs/api/motion-extended-object-projection.md +10 -8
- package/docs/api/motion-projected-motion.md +8 -8
- package/docs/api/motion-temporal-exposure-sum.md +98 -0
- package/docs/api/motion-video-sequence.md +159 -0
- package/docs/api/optics-aperture.md +8 -8
- package/docs/api/optics-atmospheric-haze.md +104 -0
- package/docs/api/optics-brown-conrady-distortion.md +123 -0
- package/docs/api/optics-circle-of-confusion.md +5 -4
- package/docs/api/optics-complex-pupil-psf.md +57 -16
- package/docs/api/optics-depth-of-field.md +12 -6
- package/docs/api/optics-diffraction.md +8 -7
- package/docs/api/optics-focus-breathing.md +104 -16
- package/docs/api/optics-focus-state.md +9 -10
- package/docs/api/optics-front-of-lens-filter.md +72 -14
- package/docs/api/optics-illumination-vignetting.md +10 -10
- package/docs/api/optics-irradiance-convolution.md +95 -0
- package/docs/api/optics-lateral-chromatic-aberration.md +22 -21
- package/docs/api/optics-lens-psf-kernels.md +72 -0
- package/docs/api/optics-lens-psf-profile.md +48 -26
- package/docs/api/optics-longitudinal-chromatic-aberration.md +128 -0
- package/docs/api/optics-polygon-diffraction.md +78 -13
- package/docs/api/optics-profile-contract.md +4 -4
- package/docs/api/optics-psf-foundation.md +12 -12
- package/docs/api/optics-pupil-vignetting.md +132 -0
- package/docs/api/optics-radial-distortion.md +12 -12
- package/docs/api/optics-scene-to-sensor-irradiance.md +25 -14
- package/docs/api/optics-scene-to-sensor-quadrature.md +15 -12
- package/docs/api/optics-sensor-aperture-rays.md +3 -2
- package/docs/api/optics-sensor-environment-query.md +52 -9
- package/docs/api/optics-sensor-psf-quadrature.md +13 -10
- package/docs/api/optics-stray-light.md +12 -11
- package/docs/api/optics-thin-lens.md +4 -3
- package/docs/api/optics-zernike-wavefront.md +229 -0
- package/docs/api/output-capture-corrected-sdr.md +10 -7
- package/docs/api/output-capture-geometry.md +35 -36
- package/docs/api/output-capture-sdr.md +4 -4
- package/docs/api/output-crop.md +7 -4
- package/docs/api/output-geometric-transforms.md +65 -19
- package/docs/api/output-lens-corrections.md +17 -15
- package/docs/api/output-native-capture-sdr.md +26 -13
- package/docs/api/output-png-encoder.md +105 -0
- package/docs/api/output-print-contrast-reference.md +8 -8
- package/docs/api/output-print-detail.md +14 -14
- package/docs/api/output-print-jpeg.md +22 -5
- package/docs/api/output-print-plan.md +18 -18
- package/docs/api/output-print-region-statistics.md +14 -14
- package/docs/api/output-sdr-rendering.md +52 -10
- package/docs/api/output-subject-framing-crop.md +5 -6
- package/docs/api/processing-demosaic.md +120 -0
- package/docs/api/processing-denoise.md +148 -0
- package/docs/api/processing-focus-stacking.md +41 -0
- package/docs/api/processing-hdr.md +113 -0
- package/docs/api/processing-panorama.md +82 -0
- package/docs/api/processing-processing-task.md +107 -0
- package/docs/api/processing-tone-mapping.md +142 -0
- package/docs/api/schema-camera.md +6 -4
- package/docs/api/schema-illumination-spectral.md +10 -11
- package/docs/api/schema-illumination-temporal.md +13 -15
- package/docs/api/schema-illumination.md +4 -4
- package/docs/api/schema-scene-radiance-temporal.md +10 -11
- package/docs/api/schema-scene-radiance.md +18 -17
- package/docs/api/schema-scene.md +9 -9
- package/docs/api/schema-validation.md +1 -1
- package/docs/api/sensor-accumulated-charge.md +12 -20
- package/docs/api/sensor-architecture.md +15 -16
- package/docs/api/sensor-camera-saturation-capacity.md +9 -11
- package/docs/api/sensor-capture-color-sampling-binding.md +47 -51
- package/docs/api/sensor-capture-mode-timing.md +9 -9
- package/docs/api/sensor-capture-mode.md +29 -30
- package/docs/api/sensor-color-sampling.md +31 -33
- package/docs/api/sensor-constant-rate-temporal-integration.md +10 -11
- package/docs/api/sensor-dark-current.md +30 -14
- package/docs/api/sensor-environment-photo-signal.md +13 -6
- package/docs/api/sensor-eqe-electron-rate.md +9 -8
- package/docs/api/sensor-eqe-local-exposure.md +18 -17
- package/docs/api/sensor-eqe-temporal-exposure.md +12 -11
- package/docs/api/sensor-exposure-window.md +24 -24
- package/docs/api/sensor-fixed-pattern-noise.md +104 -0
- package/docs/api/sensor-iso-gain.md +63 -0
- package/docs/api/sensor-iso-signal-chain.md +13 -22
- package/docs/api/sensor-local-exposure-binding.md +12 -13
- package/docs/api/sensor-optical-stack.md +37 -40
- package/docs/api/sensor-photon-energy.md +10 -11
- package/docs/api/sensor-physical-charge-capacity.md +8 -13
- package/docs/api/sensor-pixel-pitch.md +1 -1
- package/docs/api/sensor-radiometry-readiness.md +9 -9
- package/docs/api/sensor-raw-readout.md +118 -52
- package/docs/api/sensor-raw-reconstruction.md +97 -20
- package/docs/api/sensor-readout-exposure-linkage.md +120 -24
- package/docs/api/sensor-readout-timing.md +33 -35
- package/docs/api/sensor-response-application-compatibility.md +9 -11
- package/docs/api/sensor-response-operating-range.md +14 -18
- package/docs/api/sensor-responsivity-photocurrent.md +9 -12
- package/docs/api/sensor-sampling-aperture.md +22 -25
- package/docs/api/sensor-scene-eqe-temporal-exposure.md +9 -8
- package/docs/api/sensor-sensor-geometry.md +23 -24
- package/docs/api/sensor-signal-noise.md +10 -10
- package/docs/api/sensor-spatial-sample-reduction.md +27 -30
- package/docs/api/sensor-spatial-sampling-quadrature.md +37 -39
- package/docs/api/sensor-spatio-spectral-reduction.md +27 -29
- package/docs/api/sensor-spectral-coverage.md +5 -5
- package/docs/api/sensor-spectral-quadrature.md +33 -35
- package/docs/api/sensor-spectral-response.md +28 -16
- package/docs/api/sensor-temporal-photo-signal.md +6 -6
- package/docs/api/simulation-poc-simulation.md +17 -16
- package/docs/api/stabilization-camera-shake.md +29 -10
- package/docs/api/stabilization-system.md +25 -21
- package/docs/examples/production-request.json +3821 -2157
- package/docs/examples/simulate-capture.mjs +14 -0
- package/llms.txt +35 -0
- package/package.json +32 -12
- package/AGENTS.md +0 -674
- package/CONTRIBUTING.md +0 -76
- package/DCO +0 -33
- package/dist/camera/equivalent-focal-length.d.ts.map +0 -1
- package/dist/camera/field-of-view.d.ts.map +0 -1
- package/dist/camera/projected-object-size.d.ts.map +0 -1
- package/dist/capture/capture-export-metadata.d.ts.map +0 -1
- package/dist/capture/environment-raw-producer.d.ts.map +0 -1
- package/dist/capture/export-jpeg.d.ts.map +0 -1
- package/dist/capture/export-tiff.d.ts.map +0 -1
- package/dist/capture/focus-control.d.ts.map +0 -1
- package/dist/capture/linear-encoding.d.ts.map +0 -1
- package/dist/capture/native-environment-raw.d.ts.map +0 -1
- package/dist/capture/native-raw-development.d.ts.map +0 -1
- package/dist/capture/native-raw.d.ts.map +0 -1
- package/dist/capture/photographic-export.d.ts.map +0 -1
- package/dist/capture/raw-frame-limits.d.ts.map +0 -1
- package/dist/capture/raw-frame-reconstruction.d.ts.map +0 -1
- package/dist/capture/release-sequence.d.ts.map +0 -1
- package/dist/capture/sensor-raw-frame.d.ts.map +0 -1
- package/dist/capture/sensor-raw-producer.d.ts.map +0 -1
- package/dist/capture/simulated-capture.d.ts.map +0 -1
- package/dist/color/capture-color.d.ts.map +0 -1
- package/dist/color/sensor-color-development.d.ts.map +0 -1
- package/dist/color/srgb-icc.d.ts.map +0 -1
- package/dist/color/srgb-transfer.d.ts.map +0 -1
- package/dist/color/white-balance.d.ts.map +0 -1
- package/dist/composition/image-formation-plan.d.ts.map +0 -1
- package/dist/composition/plan-consumer.d.ts.map +0 -1
- package/dist/core/calculation-result.d.ts.map +0 -1
- package/dist/core/canonical-json.d.ts.map +0 -1
- package/dist/core/configuration-error.d.ts.map +0 -1
- package/dist/core/evidence-provenance.d.ts.map +0 -1
- package/dist/core/image-formation.d.ts.map +0 -1
- package/dist/core/owned-data.d.ts.map +0 -1
- package/dist/core/record-validation.d.ts.map +0 -1
- package/dist/core/scientific-assurance.d.ts.map +0 -1
- package/dist/core/spectral-composition.d.ts.map +0 -1
- package/dist/core/spectral.d.ts.map +0 -1
- package/dist/core/validation.d.ts.map +0 -1
- package/dist/core/version.d.ts.map +0 -1
- package/dist/equipment/exposure-capabilities.d.ts.map +0 -1
- package/dist/equipment/generic-tier-assets.d.ts.map +0 -1
- package/dist/equipment/generic-tier-presets.d.ts.map +0 -1
- package/dist/equipment/iso-capabilities.d.ts.map +0 -1
- package/dist/equipment/metering-capabilities.d.ts.map +0 -1
- package/dist/equipment/release-capabilities.d.ts.map +0 -1
- package/dist/exposure/exposure-duration-control.d.ts.map +0 -1
- package/dist/exposure/exposure-mode-resolver.d.ts.map +0 -1
- package/dist/exposure/exposure.d.ts.map +0 -1
- package/dist/exposure/flash.d.ts.map +0 -1
- package/dist/exposure/metering-scene-radiance.d.ts.map +0 -1
- package/dist/exposure/metering-target.d.ts.map +0 -1
- package/dist/exposure/metering-temporal.d.ts.map +0 -1
- package/dist/exposure/metering.d.ts.map +0 -1
- package/dist/exposure/program-line.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/motion/camera-rotation.d.ts.map +0 -1
- package/dist/motion/capture-rotation-inverse-mapping.d.ts.map +0 -1
- package/dist/motion/capture-rotation-temporal-quadrature.d.ts.map +0 -1
- package/dist/motion/capture-rotation-trajectory.d.ts.map +0 -1
- package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts.map +0 -1
- package/dist/motion/extended-object-projection.d.ts.map +0 -1
- package/dist/motion/projected-motion.d.ts.map +0 -1
- package/dist/optics/aperture.d.ts.map +0 -1
- package/dist/optics/circle-of-confusion.d.ts.map +0 -1
- package/dist/optics/complex-pupil-psf.d.ts.map +0 -1
- package/dist/optics/depth-of-field.d.ts.map +0 -1
- package/dist/optics/diffraction.d.ts.map +0 -1
- package/dist/optics/focus-breathing.d.ts.map +0 -1
- package/dist/optics/focus-state.d.ts.map +0 -1
- package/dist/optics/front-of-lens-filter.d.ts.map +0 -1
- package/dist/optics/illumination-vignetting.d.ts.map +0 -1
- package/dist/optics/lateral-chromatic-aberration.d.ts.map +0 -1
- package/dist/optics/lens-psf-profile.d.ts.map +0 -1
- package/dist/optics/polygon-diffraction.d.ts.map +0 -1
- package/dist/optics/profile-contract.d.ts.map +0 -1
- package/dist/optics/psf-foundation.d.ts.map +0 -1
- package/dist/optics/radial-distortion.d.ts.map +0 -1
- package/dist/optics/scene-to-sensor-irradiance.d.ts.map +0 -1
- package/dist/optics/scene-to-sensor-quadrature.d.ts.map +0 -1
- package/dist/optics/sensor-aperture-rays.d.ts.map +0 -1
- package/dist/optics/sensor-environment-query.d.ts.map +0 -1
- package/dist/optics/sensor-psf-quadrature.d.ts.map +0 -1
- package/dist/optics/sensor-psf-support.d.ts.map +0 -1
- package/dist/optics/stray-light.d.ts.map +0 -1
- package/dist/optics/thin-lens.d.ts.map +0 -1
- package/dist/output/capture-corrected-sdr.d.ts.map +0 -1
- package/dist/output/capture-geometry.d.ts.map +0 -1
- package/dist/output/capture-sdr.d.ts.map +0 -1
- package/dist/output/crop.d.ts.map +0 -1
- package/dist/output/geometric-transforms.d.ts.map +0 -1
- package/dist/output/lens-corrections.d.ts.map +0 -1
- package/dist/output/native-capture-sdr.d.ts.map +0 -1
- package/dist/output/print-contrast-reference.d.ts.map +0 -1
- package/dist/output/print-detail.d.ts.map +0 -1
- package/dist/output/print-jpeg.d.ts.map +0 -1
- package/dist/output/print-plan.d.ts.map +0 -1
- package/dist/output/print-region-statistics.d.ts.map +0 -1
- package/dist/output/sdr-rendering.d.ts.map +0 -1
- package/dist/output/subject-framing-crop.d.ts.map +0 -1
- package/dist/schema/camera.d.ts.map +0 -1
- package/dist/schema/camera.js +0 -3
- package/dist/schema/camera.js.map +0 -1
- package/dist/schema/illumination-spectral.d.ts.map +0 -1
- package/dist/schema/illumination-temporal.d.ts.map +0 -1
- package/dist/schema/illumination.d.ts.map +0 -1
- package/dist/schema/scene-radiance-temporal.d.ts.map +0 -1
- package/dist/schema/scene-radiance.d.ts.map +0 -1
- package/dist/schema/scene.d.ts.map +0 -1
- package/dist/schema/scene.js +0 -3
- package/dist/schema/scene.js.map +0 -1
- package/dist/schema/validation.d.ts.map +0 -1
- package/dist/sensor/accumulated-charge.d.ts.map +0 -1
- package/dist/sensor/architecture.d.ts.map +0 -1
- package/dist/sensor/camera-saturation-capacity.d.ts.map +0 -1
- package/dist/sensor/capture-color-sampling-binding.d.ts.map +0 -1
- package/dist/sensor/capture-mode-timing.d.ts.map +0 -1
- package/dist/sensor/capture-mode.d.ts.map +0 -1
- package/dist/sensor/color-sampling.d.ts.map +0 -1
- package/dist/sensor/constant-rate-temporal-integration.d.ts.map +0 -1
- package/dist/sensor/dark-current.d.ts.map +0 -1
- package/dist/sensor/environment-photo-signal.d.ts.map +0 -1
- package/dist/sensor/eqe-electron-rate.d.ts.map +0 -1
- package/dist/sensor/eqe-local-exposure.d.ts.map +0 -1
- package/dist/sensor/eqe-temporal-exposure.d.ts.map +0 -1
- package/dist/sensor/exposure-window.d.ts.map +0 -1
- package/dist/sensor/iso-signal-chain.d.ts.map +0 -1
- package/dist/sensor/local-exposure-binding.d.ts.map +0 -1
- package/dist/sensor/optical-stack.d.ts.map +0 -1
- package/dist/sensor/photon-energy.d.ts.map +0 -1
- package/dist/sensor/physical-charge-capacity.d.ts.map +0 -1
- package/dist/sensor/pixel-pitch.d.ts.map +0 -1
- package/dist/sensor/radiometry-readiness.d.ts.map +0 -1
- package/dist/sensor/raw-readout.d.ts.map +0 -1
- package/dist/sensor/raw-reconstruction.d.ts.map +0 -1
- package/dist/sensor/readout-exposure-linkage.d.ts.map +0 -1
- package/dist/sensor/readout-timing.d.ts.map +0 -1
- package/dist/sensor/response-application-compatibility.d.ts.map +0 -1
- package/dist/sensor/response-operating-range.d.ts.map +0 -1
- package/dist/sensor/responsivity-photocurrent.d.ts.map +0 -1
- package/dist/sensor/sampling-aperture.d.ts.map +0 -1
- package/dist/sensor/scene-eqe-temporal-exposure.d.ts.map +0 -1
- package/dist/sensor/sensor-geometry.d.ts.map +0 -1
- package/dist/sensor/signal-noise.d.ts.map +0 -1
- package/dist/sensor/spatial-sample-reduction.d.ts.map +0 -1
- package/dist/sensor/spatial-sampling-quadrature.d.ts.map +0 -1
- package/dist/sensor/spatio-spectral-reduction.d.ts.map +0 -1
- package/dist/sensor/spectral-coverage.d.ts.map +0 -1
- package/dist/sensor/spectral-quadrature.d.ts.map +0 -1
- package/dist/sensor/spectral-response.d.ts.map +0 -1
- package/dist/sensor/temporal-eqe-sum.d.ts.map +0 -1
- package/dist/sensor/temporal-photo-signal.d.ts.map +0 -1
- package/dist/sensor/temporal-sample-binding.d.ts.map +0 -1
- package/dist/simulation/poc-simulation.d.ts.map +0 -1
- package/dist/stabilization/camera-shake.d.ts.map +0 -1
- package/dist/stabilization/system.d.ts.map +0 -1
- package/docs/API_STYLE.md +0 -235
- package/docs/ARCHITECTURE.md +0 -356
- package/docs/AUTOMATION_COORDINATION.md +0 -190
- package/docs/CAPTURE_COLOR.md +0 -25
- package/docs/CAPTURE_CORRECTED_SDR.md +0 -25
- package/docs/CAPTURE_EXPORT_METADATA.md +0 -27
- package/docs/CAPTURE_SDR.md +0 -22
- package/docs/DEVELOPERS.md +0 -68
- package/docs/DIGITAL_OPTICS_FOUNDATION.md +0 -69
- package/docs/ENVIRONMENT_RAW_CAPTURE.md +0 -208
- package/docs/EXPORT_ACCEPTANCE.md +0 -133
- package/docs/GENERIC_TIER_PRESETS.md +0 -269
- package/docs/GEOMETRIC_PREPARATION_REUSE.md +0 -141
- package/docs/IMAGE_FORMATION.md +0 -247
- package/docs/LINEAR_CAPTURE_ENCODING.md +0 -25
- package/docs/MOTION_AND_SIGNAL.md +0 -250
- package/docs/NATIVE_CAPTURE_SDR.md +0 -70
- package/docs/NATIVE_CAPTURE_SDR_REVIEW.md +0 -37
- package/docs/NATIVE_CAPTURE_SDR_VALIDATION.md +0 -34
- package/docs/NATIVE_RAW_AND_PRINT.md +0 -47
- package/docs/NUMERICAL_CORRECTNESS.md +0 -191
- package/docs/PERFORMANCE_BASELINE.md +0 -56
- package/docs/PHOTOGRAPHIC_EXPORT.md +0 -206
- package/docs/PHYSICS_FOUNDATION.md +0 -426
- package/docs/POC_API.md +0 -278
- package/docs/POC_PROJECTION_PLATFORM_REFERENCE.md +0 -12
- package/docs/POC_PROJECTION_REUSE.md +0 -124
- package/docs/PRINT_195_196_REVIEW.md +0 -93
- package/docs/PRINT_196_ENGINE_ACCEPTANCE.md +0 -45
- package/docs/PRINT_CONTRAST_REFERENCE.md +0 -43
- package/docs/PRINT_DETAIL_ASSESSMENT.md +0 -81
- package/docs/PRINT_DETAIL_JPEG_EVIDENCE.md +0 -36
- package/docs/PRINT_DETAIL_SDR_EVIDENCE.md +0 -29
- package/docs/PRINT_DETAIL_VALIDATION.md +0 -36
- package/docs/PRINT_PLANNING.md +0 -75
- package/docs/PRINT_REGION_STATISTICS.md +0 -38
- package/docs/PROCESSED_OUTPUT.md +0 -157
- package/docs/PRODUCTION_COMPOSITION.md +0 -373
- package/docs/PRODUCTION_ENVIRONMENT_CAPTURE.md +0 -131
- package/docs/PROVENANCE.md +0 -115
- package/docs/PSF_FOUNDATION.md +0 -165
- package/docs/RAW_FRAME_ENVELOPE.md +0 -56
- package/docs/RAW_FRAME_RECONSTRUCTION.md +0 -30
- package/docs/RELEASE_1_0.md +0 -66
- package/docs/RELEASE_1_0_1.md +0 -61
- package/docs/RELEASE_1_1_0.md +0 -25
- package/docs/RELEASE_1_2_0.md +0 -51
- package/docs/RELEASE_1_3_0.md +0 -15
- package/docs/RELEASE_1_4_0.md +0 -23
- package/docs/RELEASE_AUDIT.md +0 -39
- package/docs/SCENE_RADIANCE_AND_ILLUMINATION.md +0 -298
- package/docs/SCENE_SENSOR_QUADRATURE.md +0 -98
- package/docs/SCENE_SENSOR_TEMPORAL_EXPOSURE.md +0 -86
- package/docs/SCIENTIFIC_ASSURANCE.md +0 -280
- package/docs/SCIENTIFIC_CONFORMANCE.md +0 -83
- package/docs/SDR_RENDERING.md +0 -33
- package/docs/SENSOR_APERTURE_RAYS.md +0 -23
- package/docs/SENSOR_ENVIRONMENT_QUERY.md +0 -86
- package/docs/SENSOR_EQE_LOCAL_EXPOSURE.md +0 -104
- package/docs/SENSOR_EQE_TEMPORAL_EXPOSURE.md +0 -74
- package/docs/SENSOR_PSF_QUADRATURE.md +0 -90
- package/docs/SENSOR_RAW_FRAME.md +0 -20
- package/docs/SENSOR_RAW_PRODUCER.md +0 -77
- package/docs/SIGNAL_CONFORMANCE.md +0 -23
- package/docs/SIMULATED_CAPTURE.md +0 -65
- package/docs/STABILIZATION.md +0 -234
- package/docs/TEMPORAL_PHOTO_RAW.md +0 -83
- package/docs/TIER_ACCEPTANCE.md +0 -129
- package/docs/TIER_PRESET_ACCEPTANCE.md +0 -59
- package/docs/V1_COMPOSITION_MAP.md +0 -123
- package/docs/V1_HELPER_REUSE_REVIEW.md +0 -60
- package/docs/V1_PERFORMANCE_DISPOSITION.md +0 -88
- package/docs/benchmarks/2026-10-01-main-baseline.json +0 -694
- package/docs/benchmarks/2026-10-02-geometric-preparation-reuse.json +0 -2190
- package/docs/benchmarks/2026-10-02-poc-projection-reuse.json +0 -2423
- package/docs/benchmarks/2026-10-02-v1-environment-gc-profile.json +0 -210
- package/docs/benchmarks/2026-10-02-v1-environment-ordinary.json +0 -187
- package/docs/benchmarks/2026-10-02-v1-geometry-gc-profile.json +0 -756
- package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-1.json +0 -711
- package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-2.json +0 -711
- package/docs/benchmarks/2026-10-02-v1-poc-gc-profile.json +0 -885
- package/docs/benchmarks/2026-10-02-v1-poc-ordinary-1.json +0 -868
- package/docs/benchmarks/2026-10-02-v1-poc-ordinary-2.json +0 -868
- package/docs/licenses/castleCSF-MIT.txt +0 -21
- package/docs/validation/documentation-fragments.json +0 -212
- package/docs/validation/native-capture-sdr-darwin-arm64-node26-review.jsonl +0 -4
- package/docs/validation/native-capture-sdr-darwin-arm64.jsonl +0 -3
- package/docs/validation/native-raw-print-2026-10-04/fractional-asymmetric-crop.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/gray-ramp.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/linear-area-checker.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/manifest.json +0 -218
- package/docs/validation/native-raw-print-2026-10-04/megapixel-native.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/native-color.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel-validation.json +0 -9
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json +0 -29
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.codes.u16le.gz +0 -0
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.rgb.gz +0 -0
- package/docs/validation/native-raw-print-2026-10-04/srgb.icc +0 -0
- package/docs/validation/native-raw-print-2026-10-04/validation.json +0 -41
- package/docs/validation/print-196-candidate-capabilities.json +0 -28
- package/docs/validation/print-196-candidate-evidence.json +0 -356
- package/docs/validation/print-196-engine-acceptance.json +0 -81
- package/docs/validation/print-detail-capabilities.json +0 -103
- package/docs/validation/print-detail-jpeg-evidence.json +0 -116
- package/docs/validation/print-detail-sdr-evidence.json +0 -81
- package/docs/validation/release-audit-inventory.json +0 -1306
- package/docs/validation/tier-acceptance-report-v1.json +0 -2538
|
@@ -1,23 +1,38 @@
|
|
|
1
1
|
// SPDX-License-Identifier: Apache-2.0
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* at
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
3
|
+
* Where a still point in the world appears on the image plane while the camera rotates.
|
|
4
|
+
*
|
|
5
|
+
* Forward mapping: given the point's image position at exposure start (t=0), find its image position
|
|
6
|
+
* at a later time t.
|
|
7
|
+
* - The starting image point defines the world ray in the camera frame at t=0.
|
|
8
|
+
* - Constant angular velocity is integrated as a single axis-angle rotation vector. This avoids any
|
|
9
|
+
* dependence on Euler-angle order.
|
|
10
|
+
* - The world ray is expressed in the rotated camera frame with the inverse camera rotation, then
|
|
11
|
+
* projected rectilinearly back onto the image plane.
|
|
12
|
+
* Only rotation is modelled. Camera translation is deliberately left out, because the image motion it
|
|
13
|
+
* causes (optical flow) depends on scene depth.
|
|
14
|
+
*
|
|
15
|
+
* Inverse mapping: given a ray captured at a non-negative time, find where it was at exposure start.
|
|
16
|
+
* For this constant-axis, pure-rotation model the inverse is analytic: apply the forward camera
|
|
17
|
+
* rotation to the captured ray, then project rectilinearly. No iterative solver is needed.
|
|
18
|
+
* @see docs/MOTION_AND_SIGNAL.md for the equations, units, coordinate conventions, known blockers
|
|
19
|
+
* and support limits.
|
|
17
20
|
*/
|
|
18
21
|
import { calculatedResult } from "../core/calculation-result.js";
|
|
19
22
|
import { InvalidScientificInputError, requirePositiveFinite } from "../core/validation.js";
|
|
20
23
|
import { calculateThinLensImageDistance } from "../optics/thin-lens.js";
|
|
24
|
+
import { rejectUnknownFields, requireInputKeys, requireInputObject } from "../core/record-validation.js";
|
|
25
|
+
/** Checks the nested objects of a rotation-mapping input before any of their fields are read. */
|
|
26
|
+
function requireRotationMappingSubObjects(input) {
|
|
27
|
+
requireInputObject(input.imagePointMm, "imagePointMm");
|
|
28
|
+
rejectUnknownFields(input.imagePointMm, ["x", "y"], "imagePointMm");
|
|
29
|
+
requireInputObject(input.angularVelocityRadPerSec, "angularVelocityRadPerSec");
|
|
30
|
+
rejectUnknownFields(input.angularVelocityRadPerSec, ["pitch", "yaw", "roll"], "angularVelocityRadPerSec");
|
|
31
|
+
if (input.samplingPitchMicrometers !== undefined) {
|
|
32
|
+
requireInputObject(input.samplingPitchMicrometers, "samplingPitchMicrometers");
|
|
33
|
+
rejectUnknownFields(input.samplingPitchMicrometers, ["x", "y"], "samplingPitchMicrometers");
|
|
34
|
+
}
|
|
35
|
+
}
|
|
21
36
|
function requireFinite(name, value) {
|
|
22
37
|
if (!Number.isFinite(value)) {
|
|
23
38
|
throw new InvalidScientificInputError(`${name} must be finite.`);
|
|
@@ -28,7 +43,14 @@ function requireNonNegativeFinite(name, value) {
|
|
|
28
43
|
throw new InvalidScientificInputError(`${name} must be finite and greater than or equal to zero.`);
|
|
29
44
|
}
|
|
30
45
|
}
|
|
31
|
-
/**
|
|
46
|
+
/**
|
|
47
|
+
* Internal Rodrigues rotation in component form:
|
|
48
|
+
* v cos a + (k x v) sin a + k (k . v)(1 - cos a), with the cross product
|
|
49
|
+
* computed by its usual component formula. In the left-handed camera basis
|
|
50
|
+
* this is a physical left-hand rotation. Camera-rotation code must call
|
|
51
|
+
* applyPhysicalCameraRotation() instead, so the right-hand sign convention
|
|
52
|
+
* lives in one place.
|
|
53
|
+
*/
|
|
32
54
|
export function rotateVectorByAxisAngle(vector, axis, angleRad) {
|
|
33
55
|
if (angleRad === 0) {
|
|
34
56
|
return { ...vector };
|
|
@@ -56,7 +78,33 @@ export function rotateVectorByAxisAngle(vector, axis, angleRad) {
|
|
|
56
78
|
axis.z * dot * oneMinusCosine
|
|
57
79
|
};
|
|
58
80
|
}
|
|
59
|
-
|
|
81
|
+
/**
|
|
82
|
+
* Internal: applies the physical camera rotation for one right-hand angular
|
|
83
|
+
* displacement (pitch/yaw/roll about camera +X/+Y/+Z, radians) to a vector in
|
|
84
|
+
* camera components.
|
|
85
|
+
*
|
|
86
|
+
* - "camera-to-reference" applies R: a ray expressed in the rotated camera
|
|
87
|
+
* frame is re-expressed in the exposure-start (reference) camera frame.
|
|
88
|
+
* - "reference-to-camera" applies R^-1: a stationary reference ray is
|
|
89
|
+
* expressed in the rotated camera frame.
|
|
90
|
+
*
|
|
91
|
+
* Because the camera basis is left-handed, the physical right-hand rotation R
|
|
92
|
+
* is the component Rodrigues formula with the angle negated.
|
|
93
|
+
*/
|
|
94
|
+
export function applyPhysicalCameraRotation(vector, angularDisplacementRad, direction) {
|
|
95
|
+
const magnitude = Math.hypot(angularDisplacementRad.pitch, angularDisplacementRad.yaw, angularDisplacementRad.roll);
|
|
96
|
+
if (magnitude === 0) {
|
|
97
|
+
return { ...vector };
|
|
98
|
+
}
|
|
99
|
+
const axis = {
|
|
100
|
+
x: angularDisplacementRad.pitch / magnitude,
|
|
101
|
+
y: angularDisplacementRad.yaw / magnitude,
|
|
102
|
+
z: angularDisplacementRad.roll / magnitude
|
|
103
|
+
};
|
|
104
|
+
return rotateVectorByAxisAngle(vector, axis, direction === "camera-to-reference" ? -magnitude : magnitude);
|
|
105
|
+
}
|
|
106
|
+
/** Internal: projection distance, shared with the lean native environment executor. Not exported from the package root. */
|
|
107
|
+
export function resolveProjectionDistanceMm(focalLengthMm, focusDistanceM) {
|
|
60
108
|
const projection = focusDistanceM === undefined
|
|
61
109
|
? undefined
|
|
62
110
|
: calculateThinLensImageDistance({
|
|
@@ -72,19 +120,21 @@ function resolveProjectionDistanceMm(focalLengthMm, focusDistanceM) {
|
|
|
72
120
|
* Maps one stationary-world ray to its image-plane location after pure camera
|
|
73
121
|
* rotation at an arbitrary physical time from exposure start.
|
|
74
122
|
*
|
|
75
|
-
* The
|
|
76
|
-
* Constant angular velocity is integrated as
|
|
77
|
-
*
|
|
78
|
-
* in the rotated camera frame
|
|
79
|
-
* rectilinearly back onto the image plane.
|
|
123
|
+
* The starting image point defines the world ray in the camera frame at t=0.
|
|
124
|
+
* Constant angular velocity is integrated as a single axis-angle rotation
|
|
125
|
+
* vector, which avoids any dependence on Euler-angle order. The world ray is
|
|
126
|
+
* then expressed in the rotated camera frame with the inverse camera rotation,
|
|
127
|
+
* and projected rectilinearly back onto the image plane.
|
|
80
128
|
*
|
|
81
|
-
*
|
|
82
|
-
*
|
|
129
|
+
* Only rotation is modelled. Camera translation is deliberately left out,
|
|
130
|
+
* because the image motion it causes depends on scene depth.
|
|
83
131
|
*
|
|
84
132
|
* @returns Field-position-dependent image-plane mapping and displacement.
|
|
85
133
|
*/
|
|
86
134
|
export function calculateCameraRotationImageMapping(input) {
|
|
135
|
+
requireInputKeys(input, "calculateCameraRotationImageMapping", ["focalLengthMm", "imagePointMm", "timeSecondsFromExposureStart", "angularVelocityRadPerSec", "focusDistanceM", "samplingPitchMicrometers"]);
|
|
87
136
|
requirePositiveFinite("focalLengthMm", input.focalLengthMm);
|
|
137
|
+
requireRotationMappingSubObjects(input);
|
|
88
138
|
requireFinite("imagePointMm.x", input.imagePointMm.x);
|
|
89
139
|
requireFinite("imagePointMm.y", input.imagePointMm.y);
|
|
90
140
|
requireNonNegativeFinite("timeSecondsFromExposureStart", input.timeSecondsFromExposureStart);
|
|
@@ -110,15 +160,7 @@ export function calculateCameraRotationImageMapping(input) {
|
|
|
110
160
|
y: input.imagePointMm.y / projectionDistanceMm,
|
|
111
161
|
z: 1
|
|
112
162
|
};
|
|
113
|
-
|
|
114
|
-
if (angularMagnitude !== 0) {
|
|
115
|
-
const inverseAxis = {
|
|
116
|
-
x: angularDisplacementRad.pitch / angularMagnitude,
|
|
117
|
-
y: angularDisplacementRad.yaw / angularMagnitude,
|
|
118
|
-
z: angularDisplacementRad.roll / angularMagnitude
|
|
119
|
-
};
|
|
120
|
-
mappedRay = rotateVectorByAxisAngle(initialRay, inverseAxis, -angularMagnitude);
|
|
121
|
-
}
|
|
163
|
+
const mappedRay = applyPhysicalCameraRotation(initialRay, angularDisplacementRad, "reference-to-camera");
|
|
122
164
|
if (!Number.isFinite(mappedRay.z) || mappedRay.z <= 0) {
|
|
123
165
|
throw new InvalidScientificInputError("Camera rotation maps the requested world ray to or behind the camera plane.");
|
|
124
166
|
}
|
|
@@ -158,14 +200,14 @@ export function calculateCameraRotationImageMapping(input) {
|
|
|
158
200
|
: { deltaImagePlaneSamples })
|
|
159
201
|
}, focusAware
|
|
160
202
|
? "focus-aware-spatial-camera-rotation-mapping"
|
|
161
|
-
: "spatial-camera-rotation-mapping", "
|
|
203
|
+
: "spatial-camera-rotation-mapping", "2.0.0", [
|
|
162
204
|
"Ideal rectilinear projection",
|
|
163
205
|
focusAware
|
|
164
206
|
? "Thin-lens image distance for the selected focus plane is used as the projection distance"
|
|
165
207
|
: "Nominal focal length is used as the infinity-focus projection distance",
|
|
166
208
|
"Camera angular velocity is constant during the evaluated interval",
|
|
167
209
|
"Angular velocity components are resolved in the camera axes at exposure start and integrated as one axis-angle vector",
|
|
168
|
-
"Positive pitch/yaw/roll follow the right-hand rule about camera +X/+Y/+Z",
|
|
210
|
+
"Positive pitch/yaw/roll follow the physical right-hand rule about camera +X/+Y/+Z (pitch up, yaw left, roll clockwise seen from behind); the camera basis is left-handed",
|
|
169
211
|
"The world ray is stationary; subject motion is not included",
|
|
170
212
|
"Camera translation and depth-dependent parallax are not modeled",
|
|
171
213
|
"The stationary world ray is transformed by the inverse camera rotation before rectilinear projection"
|
|
@@ -175,12 +217,14 @@ export function calculateCameraRotationImageMapping(input) {
|
|
|
175
217
|
* Maps a captured stationary-world ray at one non-negative capture time back
|
|
176
218
|
* to its image-plane location at exposure start.
|
|
177
219
|
*
|
|
178
|
-
* For
|
|
179
|
-
* the
|
|
180
|
-
*
|
|
220
|
+
* For this constant-axis, pure-rotation model the inverse is analytic: apply
|
|
221
|
+
* the forward camera rotation to the captured ray, then project
|
|
222
|
+
* rectilinearly. No iterative solver is needed.
|
|
181
223
|
*/
|
|
182
224
|
export function calculateInverseCameraRotationImageMapping(input) {
|
|
225
|
+
requireInputKeys(input, "calculateInverseCameraRotationImageMapping", ["focalLengthMm", "imagePointMm", "timeSecondsFromExposureStart", "angularVelocityRadPerSec", "focusDistanceM", "samplingPitchMicrometers"]);
|
|
183
226
|
requirePositiveFinite("focalLengthMm", input.focalLengthMm);
|
|
227
|
+
requireRotationMappingSubObjects(input);
|
|
184
228
|
requireFinite("imagePointMm.x", input.imagePointMm.x);
|
|
185
229
|
requireFinite("imagePointMm.y", input.imagePointMm.y);
|
|
186
230
|
requireNonNegativeFinite("timeSecondsFromExposureStart", input.timeSecondsFromExposureStart);
|
|
@@ -206,15 +250,7 @@ export function calculateInverseCameraRotationImageMapping(input) {
|
|
|
206
250
|
y: input.imagePointMm.y / projectionDistanceMm,
|
|
207
251
|
z: 1
|
|
208
252
|
};
|
|
209
|
-
|
|
210
|
-
if (angularMagnitude !== 0) {
|
|
211
|
-
const axis = {
|
|
212
|
-
x: angularDisplacementRad.pitch / angularMagnitude,
|
|
213
|
-
y: angularDisplacementRad.yaw / angularMagnitude,
|
|
214
|
-
z: angularDisplacementRad.roll / angularMagnitude
|
|
215
|
-
};
|
|
216
|
-
referenceRay = rotateVectorByAxisAngle(capturedRay, axis, angularMagnitude);
|
|
217
|
-
}
|
|
253
|
+
const referenceRay = applyPhysicalCameraRotation(capturedRay, angularDisplacementRad, "camera-to-reference");
|
|
218
254
|
if (!Number.isFinite(referenceRay.z) || referenceRay.z <= 0) {
|
|
219
255
|
throw new InvalidScientificInputError("Inverse camera rotation maps the requested captured ray to or behind the reference camera plane.");
|
|
220
256
|
}
|
|
@@ -254,13 +290,14 @@ export function calculateInverseCameraRotationImageMapping(input) {
|
|
|
254
290
|
: { deltaImagePlaneSamples })
|
|
255
291
|
}, focusAware
|
|
256
292
|
? "focus-aware-inverse-spatial-camera-rotation-mapping"
|
|
257
|
-
: "inverse-spatial-camera-rotation-mapping", "
|
|
293
|
+
: "inverse-spatial-camera-rotation-mapping", "2.0.0", [
|
|
258
294
|
"Ideal rectilinear projection",
|
|
259
295
|
focusAware
|
|
260
296
|
? "Thin-lens image distance for the selected focus plane is used as the projection distance"
|
|
261
297
|
: "Nominal focal length is used as the infinity-focus projection distance",
|
|
262
298
|
"Camera angular velocity is constant during the evaluated interval",
|
|
263
299
|
"Angular velocity components are resolved in the camera axes at exposure start and integrated as one axis-angle vector",
|
|
300
|
+
"Positive pitch/yaw/roll follow the physical right-hand rule about camera +X/+Y/+Z (pitch up, yaw left, roll clockwise seen from behind); the camera basis is left-handed",
|
|
264
301
|
"The inverse is analytic under the same constant-axis pure-rotation model; no iterative solve is used",
|
|
265
302
|
"The captured stationary-world ray is transformed by the forward camera rotation to recover its exposure-start reference ray",
|
|
266
303
|
"Camera translation, scene depth parallax and subject motion are not modeled"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"camera-rotation.js","sourceRoot":"","sources":["../../src/motion/camera-rotation.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"camera-rotation.js","sourceRoot":"","sources":["../../src/motion/camera-rotation.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Where a still point in the world appears on the image plane while the camera rotates.\n *\n * Forward mapping: given the point's image position at exposure start (t=0), find its image position\n * at a later time t.\n * - The starting image point defines the world ray in the camera frame at t=0.\n * - Constant angular velocity is integrated as a single axis-angle rotation vector. This avoids any\n * dependence on Euler-angle order.\n * - The world ray is expressed in the rotated camera frame with the inverse camera rotation, then\n * projected rectilinearly back onto the image plane.\n * Only rotation is modelled. Camera translation is deliberately left out, because the image motion it\n * causes (optical flow) depends on scene depth.\n *\n * Inverse mapping: given a ray captured at a non-negative time, find where it was at exposure start.\n * For this constant-axis, pure-rotation model the inverse is analytic: apply the forward camera\n * rotation to the captured ray, then project rectilinearly. No iterative solver is needed.\n * @see docs/MOTION_AND_SIGNAL.md for the equations, units, coordinate conventions, known blockers\n * and support limits.\n */\n\nimport {\n calculatedResult,\n type CalculationResult\n} from \"../core/calculation-result.js\";\nimport {\n InvalidScientificInputError,\n requirePositiveFinite\n} from \"../core/validation.js\";\nimport { calculateThinLensImageDistance } from \"../optics/thin-lens.js\";\nimport { rejectUnknownFields, requireInputKeys, requireInputObject } from \"../core/record-validation.js\";\n\n/** Checks the nested objects of a rotation-mapping input before any of their fields are read. */\nfunction requireRotationMappingSubObjects(input: {\n imagePointMm: unknown; angularVelocityRadPerSec: unknown; samplingPitchMicrometers?: unknown;\n}): void {\n requireInputObject(input.imagePointMm, \"imagePointMm\");\n rejectUnknownFields(input.imagePointMm as object, [\"x\", \"y\"], \"imagePointMm\");\n requireInputObject(input.angularVelocityRadPerSec, \"angularVelocityRadPerSec\");\n rejectUnknownFields(input.angularVelocityRadPerSec as object, [\"pitch\", \"yaw\", \"roll\"], \"angularVelocityRadPerSec\");\n if (input.samplingPitchMicrometers !== undefined) {\n requireInputObject(input.samplingPitchMicrometers, \"samplingPitchMicrometers\");\n rejectUnknownFields(input.samplingPitchMicrometers as object, [\"x\", \"y\"], \"samplingPitchMicrometers\");\n }\n}\n\n/**\n * Camera angular velocity in radians per second about the exposure-start\n * camera axes (+X right, +Y up, +Z forward along the optical axis).\n *\n * Signs follow the physical right-hand rule about each named axis. These axes\n * form a left-handed basis. So a positive rotation is the mirror image of what\n * the plain component Rodrigues (cross-product) formula would give in it:\n *\n * - Positive pitch tilts the optical axis up. Still scene content moves\n * toward image -Y (down).\n * - Positive yaw turns the optical axis left (counter-clockwise seen from\n * above). Still scene content moves toward image +X (right).\n * - Positive roll turns the camera clockwise, as seen by the photographer\n * looking along +Z. Still scene content rotates counter-clockwise in the\n * +X-right/+Y-up image plane.\n */\nexport interface CameraAngularVelocityRadPerSec {\n /** Right-hand rotation rate about camera +X (right): positive tilts the optical axis up. */\n pitch: number;\n /** Right-hand rotation rate about camera +Y (up): positive turns the optical axis left. */\n yaw: number;\n /** Right-hand rotation rate about camera +Z (forward): positive rolls the camera clockwise as seen from behind it. */\n roll: number;\n}\n\nexport interface ImagePlanePointMm {\n /** Image-plane X coordinate relative to the optical axis, in millimetres. */\n x: number;\n /** Image-plane Y coordinate relative to the optical axis, in millimetres. */\n y: number;\n}\n\nexport interface AxisSamplingPitchMicrometers {\n x: number;\n y: number;\n}\n\nexport interface CalculateCameraRotationImageMappingInput {\n /** Physical focal length in millimetres. */\n focalLengthMm: number;\n /**\n * Stationary-world-ray image-plane position at exposure start.\n *\n * Image-plane coordinates have their origin on the optical axis, +X right, +Y up.\n */\n imagePointMm: ImagePlanePointMm;\n /**\n * Time in seconds from exposure start. Must be greater than or equal to zero.\n */\n timeSecondsFromExposureStart: number;\n /**\n * Constant camera angular-velocity vector in radians per second.\n *\n * Components are given in the camera axes at exposure start and follow the\n * physical right-hand rule:\n * - pitch about +X: positive tilts up; content moves toward image -Y;\n * - yaw about +Y: positive turns left; content moves toward image +X;\n * - roll about +Z: positive is clockwise seen from behind the camera.\n * See CameraAngularVelocityRadPerSec.\n */\n angularVelocityRadPerSec: CameraAngularVelocityRadPerSec;\n /** Optional focus distance in metres for thin-lens projection distance. */\n focusDistanceM?: number;\n /**\n * Optional sampling pitch per axis, used to also report the displacement in\n * samples. This is the geometric spacing of samples, not the light-collecting\n * area of a photosite.\n */\n samplingPitchMicrometers?: AxisSamplingPitchMicrometers;\n}\n\nexport interface CameraRotationImageMapping {\n projectionDistanceMm: number;\n timeSecondsFromExposureStart: number;\n angularDisplacementRad: {\n pitch: number;\n yaw: number;\n roll: number;\n magnitude: number;\n };\n startImagePointMm: ImagePlanePointMm;\n mappedImagePointMm: ImagePlanePointMm;\n deltaMm: {\n x: number;\n y: number;\n distance: number;\n };\n /**\n * Optional displacement in samples, in image-plane axes (+X right, +Y up).\n * This is not a vector in native raster axes.\n */\n deltaImagePlaneSamples?: {\n x: number;\n y: number;\n distance: number;\n };\n}\n\nexport interface CalculateInverseCameraRotationImageMappingInput {\n /** Physical focal length in millimetres. */\n focalLengthMm: number;\n /**\n * Captured image-plane location of a stationary world ray at the requested\n * time. Coordinates have their origin on the optical axis, +X right, +Y up.\n */\n imagePointMm: ImagePlanePointMm;\n /**\n * Capture time in seconds from exposure start. Must be greater than or equal\n * to zero.\n */\n timeSecondsFromExposureStart: number;\n /**\n * Constant camera angular-velocity vector in radians per second, with the\n * same sign/axis semantics as calculateCameraRotationImageMapping().\n */\n angularVelocityRadPerSec: CameraAngularVelocityRadPerSec;\n /** Optional focus distance in metres for thin-lens projection distance. */\n focusDistanceM?: number;\n /**\n * Optional sampling pitch per axis, used to also report the inverse\n * displacement in samples.\n */\n samplingPitchMicrometers?: AxisSamplingPitchMicrometers;\n}\n\nexport interface InverseCameraRotationImageMapping {\n projectionDistanceMm: number;\n timeSecondsFromExposureStart: number;\n angularDisplacementRad: {\n pitch: number;\n yaw: number;\n roll: number;\n magnitude: number;\n };\n capturedImagePointMm: ImagePlanePointMm;\n referenceImagePointMm: ImagePlanePointMm;\n /**\n * Reference-minus-captured displacement in the image-plane basis.\n */\n deltaMm: {\n x: number;\n y: number;\n distance: number;\n };\n deltaImagePlaneSamples?: {\n x: number;\n y: number;\n distance: number;\n };\n}\n\ninterface Vector3 {\n x: number;\n y: number;\n z: number;\n}\n\nfunction requireFinite(name: string, value: number): void {\n if (!Number.isFinite(value)) {\n throw new InvalidScientificInputError(`${name} must be finite.`);\n }\n}\n\nfunction requireNonNegativeFinite(name: string, value: number): void {\n if (!Number.isFinite(value) || value < 0) {\n throw new InvalidScientificInputError(\n `${name} must be finite and greater than or equal to zero.`\n );\n }\n}\n\n/**\n * Internal Rodrigues rotation in component form:\n * v cos a + (k x v) sin a + k (k . v)(1 - cos a), with the cross product\n * computed by its usual component formula. In the left-handed camera basis\n * this is a physical left-hand rotation. Camera-rotation code must call\n * applyPhysicalCameraRotation() instead, so the right-hand sign convention\n * lives in one place.\n */\nexport function rotateVectorByAxisAngle(\n vector: Vector3,\n axis: Vector3,\n angleRad: number\n): Vector3 {\n if (angleRad === 0) {\n return { ...vector };\n }\n\n const cosine = Math.cos(angleRad);\n const sine = Math.sin(angleRad);\n const oneMinusCosine = 1 - cosine;\n const dot =\n axis.x * vector.x +\n axis.y * vector.y +\n axis.z * vector.z;\n const cross = {\n x: axis.y * vector.z - axis.z * vector.y,\n y: axis.z * vector.x - axis.x * vector.z,\n z: axis.x * vector.y - axis.y * vector.x\n };\n\n return {\n x:\n vector.x * cosine +\n cross.x * sine +\n axis.x * dot * oneMinusCosine,\n y:\n vector.y * cosine +\n cross.y * sine +\n axis.y * dot * oneMinusCosine,\n z:\n vector.z * cosine +\n cross.z * sine +\n axis.z * dot * oneMinusCosine\n };\n}\n\n/**\n * Internal: applies the physical camera rotation for one right-hand angular\n * displacement (pitch/yaw/roll about camera +X/+Y/+Z, radians) to a vector in\n * camera components.\n *\n * - \"camera-to-reference\" applies R: a ray expressed in the rotated camera\n * frame is re-expressed in the exposure-start (reference) camera frame.\n * - \"reference-to-camera\" applies R^-1: a stationary reference ray is\n * expressed in the rotated camera frame.\n *\n * Because the camera basis is left-handed, the physical right-hand rotation R\n * is the component Rodrigues formula with the angle negated.\n */\nexport function applyPhysicalCameraRotation(\n vector: Vector3,\n angularDisplacementRad: { pitch: number; yaw: number; roll: number },\n direction: \"camera-to-reference\" | \"reference-to-camera\"\n): Vector3 {\n const magnitude = Math.hypot(\n angularDisplacementRad.pitch,\n angularDisplacementRad.yaw,\n angularDisplacementRad.roll\n );\n if (magnitude === 0) {\n return { ...vector };\n }\n const axis = {\n x: angularDisplacementRad.pitch / magnitude,\n y: angularDisplacementRad.yaw / magnitude,\n z: angularDisplacementRad.roll / magnitude\n };\n return rotateVectorByAxisAngle(\n vector,\n axis,\n direction === \"camera-to-reference\" ? -magnitude : magnitude\n );\n}\n\n/** Internal: projection distance, shared with the lean native environment executor. Not exported from the package root. */\nexport function resolveProjectionDistanceMm(\n focalLengthMm: number,\n focusDistanceM: number | undefined\n): {\n projectionDistanceMm: number;\n focusAware: boolean;\n} {\n const projection =\n focusDistanceM === undefined\n ? undefined\n : calculateThinLensImageDistance({\n focalLengthMm,\n objectDistanceM: focusDistanceM\n });\n\n return {\n projectionDistanceMm:\n projection?.value.imageDistanceMm ?? focalLengthMm,\n focusAware: projection !== undefined\n };\n}\n\n/**\n * Maps one stationary-world ray to its image-plane location after pure camera\n * rotation at an arbitrary physical time from exposure start.\n *\n * The starting image point defines the world ray in the camera frame at t=0.\n * Constant angular velocity is integrated as a single axis-angle rotation\n * vector, which avoids any dependence on Euler-angle order. The world ray is\n * then expressed in the rotated camera frame with the inverse camera rotation,\n * and projected rectilinearly back onto the image plane.\n *\n * Only rotation is modelled. Camera translation is deliberately left out,\n * because the image motion it causes depends on scene depth.\n *\n * @returns Field-position-dependent image-plane mapping and displacement.\n */\nexport function calculateCameraRotationImageMapping(\n input: CalculateCameraRotationImageMappingInput\n): CalculationResult<CameraRotationImageMapping> {\n requireInputKeys(input, \"calculateCameraRotationImageMapping\", [\"focalLengthMm\", \"imagePointMm\", \"timeSecondsFromExposureStart\", \"angularVelocityRadPerSec\", \"focusDistanceM\", \"samplingPitchMicrometers\"]);\n requirePositiveFinite(\"focalLengthMm\", input.focalLengthMm);\n requireRotationMappingSubObjects(input);\n requireFinite(\"imagePointMm.x\", input.imagePointMm.x);\n requireFinite(\"imagePointMm.y\", input.imagePointMm.y);\n requireNonNegativeFinite(\n \"timeSecondsFromExposureStart\",\n input.timeSecondsFromExposureStart\n );\n requireFinite(\n \"angularVelocityRadPerSec.pitch\",\n input.angularVelocityRadPerSec.pitch\n );\n requireFinite(\n \"angularVelocityRadPerSec.yaw\",\n input.angularVelocityRadPerSec.yaw\n );\n requireFinite(\n \"angularVelocityRadPerSec.roll\",\n input.angularVelocityRadPerSec.roll\n );\n\n if (input.samplingPitchMicrometers !== undefined) {\n requirePositiveFinite(\n \"samplingPitchMicrometers.x\",\n input.samplingPitchMicrometers.x\n );\n requirePositiveFinite(\n \"samplingPitchMicrometers.y\",\n input.samplingPitchMicrometers.y\n );\n }\n\n const { projectionDistanceMm, focusAware } =\n resolveProjectionDistanceMm(\n input.focalLengthMm,\n input.focusDistanceM\n );\n\n const angularDisplacementRad = {\n pitch:\n input.angularVelocityRadPerSec.pitch *\n input.timeSecondsFromExposureStart,\n yaw:\n input.angularVelocityRadPerSec.yaw *\n input.timeSecondsFromExposureStart,\n roll:\n input.angularVelocityRadPerSec.roll *\n input.timeSecondsFromExposureStart\n };\n const angularMagnitude = Math.hypot(\n angularDisplacementRad.pitch,\n angularDisplacementRad.yaw,\n angularDisplacementRad.roll\n );\n\n const initialRay: Vector3 = {\n x: input.imagePointMm.x / projectionDistanceMm,\n y: input.imagePointMm.y / projectionDistanceMm,\n z: 1\n };\n\n const mappedRay = applyPhysicalCameraRotation(\n initialRay,\n angularDisplacementRad,\n \"reference-to-camera\"\n );\n\n if (!Number.isFinite(mappedRay.z) || mappedRay.z <= 0) {\n throw new InvalidScientificInputError(\n \"Camera rotation maps the requested world ray to or behind the camera plane.\"\n );\n }\n\n const mappedImagePointMm = {\n x: projectionDistanceMm * (mappedRay.x / mappedRay.z),\n y: projectionDistanceMm * (mappedRay.y / mappedRay.z)\n };\n const deltaMm = {\n x: mappedImagePointMm.x - input.imagePointMm.x,\n y: mappedImagePointMm.y - input.imagePointMm.y,\n distance: Math.hypot(\n mappedImagePointMm.x - input.imagePointMm.x,\n mappedImagePointMm.y - input.imagePointMm.y\n )\n };\n\n let deltaImagePlaneSamples:\n | {\n x: number;\n y: number;\n distance: number;\n }\n | undefined;\n if (input.samplingPitchMicrometers !== undefined) {\n const pitchXmm = input.samplingPitchMicrometers.x / 1000;\n const pitchYmm = input.samplingPitchMicrometers.y / 1000;\n const sampleX = deltaMm.x / pitchXmm;\n const sampleY = deltaMm.y / pitchYmm;\n deltaImagePlaneSamples = {\n x: sampleX,\n y: sampleY,\n distance: Math.hypot(sampleX, sampleY)\n };\n }\n\n return calculatedResult(\n {\n projectionDistanceMm,\n timeSecondsFromExposureStart:\n input.timeSecondsFromExposureStart,\n angularDisplacementRad: {\n ...angularDisplacementRad,\n magnitude: angularMagnitude\n },\n startImagePointMm: { ...input.imagePointMm },\n mappedImagePointMm,\n deltaMm,\n ...(deltaImagePlaneSamples === undefined\n ? {}\n : { deltaImagePlaneSamples })\n },\n focusAware\n ? \"focus-aware-spatial-camera-rotation-mapping\"\n : \"spatial-camera-rotation-mapping\",\n \"2.0.0\",\n [\n \"Ideal rectilinear projection\",\n focusAware\n ? \"Thin-lens image distance for the selected focus plane is used as the projection distance\"\n : \"Nominal focal length is used as the infinity-focus projection distance\",\n \"Camera angular velocity is constant during the evaluated interval\",\n \"Angular velocity components are resolved in the camera axes at exposure start and integrated as one axis-angle vector\",\n \"Positive pitch/yaw/roll follow the physical right-hand rule about camera +X/+Y/+Z (pitch up, yaw left, roll clockwise seen from behind); the camera basis is left-handed\",\n \"The world ray is stationary; subject motion is not included\",\n \"Camera translation and depth-dependent parallax are not modeled\",\n \"The stationary world ray is transformed by the inverse camera rotation before rectilinear projection\"\n ]\n );\n}\n\n\n/**\n * Maps a captured stationary-world ray at one non-negative capture time back\n * to its image-plane location at exposure start.\n *\n * For this constant-axis, pure-rotation model the inverse is analytic: apply\n * the forward camera rotation to the captured ray, then project\n * rectilinearly. No iterative solver is needed.\n */\nexport function calculateInverseCameraRotationImageMapping(\n input: CalculateInverseCameraRotationImageMappingInput\n): CalculationResult<InverseCameraRotationImageMapping> {\n requireInputKeys(input, \"calculateInverseCameraRotationImageMapping\", [\"focalLengthMm\", \"imagePointMm\", \"timeSecondsFromExposureStart\", \"angularVelocityRadPerSec\", \"focusDistanceM\", \"samplingPitchMicrometers\"]);\n requirePositiveFinite(\"focalLengthMm\", input.focalLengthMm);\n requireRotationMappingSubObjects(input);\n requireFinite(\"imagePointMm.x\", input.imagePointMm.x);\n requireFinite(\"imagePointMm.y\", input.imagePointMm.y);\n requireNonNegativeFinite(\n \"timeSecondsFromExposureStart\",\n input.timeSecondsFromExposureStart\n );\n requireFinite(\n \"angularVelocityRadPerSec.pitch\",\n input.angularVelocityRadPerSec.pitch\n );\n requireFinite(\n \"angularVelocityRadPerSec.yaw\",\n input.angularVelocityRadPerSec.yaw\n );\n requireFinite(\n \"angularVelocityRadPerSec.roll\",\n input.angularVelocityRadPerSec.roll\n );\n\n if (input.samplingPitchMicrometers !== undefined) {\n requirePositiveFinite(\n \"samplingPitchMicrometers.x\",\n input.samplingPitchMicrometers.x\n );\n requirePositiveFinite(\n \"samplingPitchMicrometers.y\",\n input.samplingPitchMicrometers.y\n );\n }\n\n const { projectionDistanceMm, focusAware } =\n resolveProjectionDistanceMm(\n input.focalLengthMm,\n input.focusDistanceM\n );\n\n const angularDisplacementRad = {\n pitch:\n input.angularVelocityRadPerSec.pitch *\n input.timeSecondsFromExposureStart,\n yaw:\n input.angularVelocityRadPerSec.yaw *\n input.timeSecondsFromExposureStart,\n roll:\n input.angularVelocityRadPerSec.roll *\n input.timeSecondsFromExposureStart\n };\n const angularMagnitude = Math.hypot(\n angularDisplacementRad.pitch,\n angularDisplacementRad.yaw,\n angularDisplacementRad.roll\n );\n\n const capturedRay: Vector3 = {\n x: input.imagePointMm.x / projectionDistanceMm,\n y: input.imagePointMm.y / projectionDistanceMm,\n z: 1\n };\n\n const referenceRay = applyPhysicalCameraRotation(\n capturedRay,\n angularDisplacementRad,\n \"camera-to-reference\"\n );\n\n if (!Number.isFinite(referenceRay.z) || referenceRay.z <= 0) {\n throw new InvalidScientificInputError(\n \"Inverse camera rotation maps the requested captured ray to or behind the reference camera plane.\"\n );\n }\n\n const referenceImagePointMm = {\n x: projectionDistanceMm * (referenceRay.x / referenceRay.z),\n y: projectionDistanceMm * (referenceRay.y / referenceRay.z)\n };\n const deltaMm = {\n x: referenceImagePointMm.x - input.imagePointMm.x,\n y: referenceImagePointMm.y - input.imagePointMm.y,\n distance: Math.hypot(\n referenceImagePointMm.x - input.imagePointMm.x,\n referenceImagePointMm.y - input.imagePointMm.y\n )\n };\n\n let deltaImagePlaneSamples:\n | {\n x: number;\n y: number;\n distance: number;\n }\n | undefined;\n if (input.samplingPitchMicrometers !== undefined) {\n const pitchXmm = input.samplingPitchMicrometers.x / 1000;\n const pitchYmm = input.samplingPitchMicrometers.y / 1000;\n const sampleX = deltaMm.x / pitchXmm;\n const sampleY = deltaMm.y / pitchYmm;\n deltaImagePlaneSamples = {\n x: sampleX,\n y: sampleY,\n distance: Math.hypot(sampleX, sampleY)\n };\n }\n\n return calculatedResult(\n {\n projectionDistanceMm,\n timeSecondsFromExposureStart:\n input.timeSecondsFromExposureStart,\n angularDisplacementRad: {\n ...angularDisplacementRad,\n magnitude: angularMagnitude\n },\n capturedImagePointMm: { ...input.imagePointMm },\n referenceImagePointMm,\n deltaMm,\n ...(deltaImagePlaneSamples === undefined\n ? {}\n : { deltaImagePlaneSamples })\n },\n focusAware\n ? \"focus-aware-inverse-spatial-camera-rotation-mapping\"\n : \"inverse-spatial-camera-rotation-mapping\",\n \"2.0.0\",\n [\n \"Ideal rectilinear projection\",\n focusAware\n ? \"Thin-lens image distance for the selected focus plane is used as the projection distance\"\n : \"Nominal focal length is used as the infinity-focus projection distance\",\n \"Camera angular velocity is constant during the evaluated interval\",\n \"Angular velocity components are resolved in the camera axes at exposure start and integrated as one axis-angle vector\",\n \"Positive pitch/yaw/roll follow the physical right-hand rule about camera +X/+Y/+Z (pitch up, yaw left, roll clockwise seen from behind); the camera basis is left-handed\",\n \"The inverse is analytic under the same constant-axis pure-rotation model; no iterative solve is used\",\n \"The captured stationary-world ray is transformed by the forward camera rotation to recover its exposure-start reference ray\",\n \"Camera translation, scene depth parallax and subject motion are not modeled\"\n ]\n );\n}\n"]}
|
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* rotation.
|
|
5
|
-
*
|
|
6
|
-
* the
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
2
|
+
* Instantaneous inverse mapping for a rotating camera whose sensor exposes different points at
|
|
3
|
+
* different times (for example a rolling shutter). Applies to still world rays under pure camera
|
|
4
|
+
* rotation.
|
|
5
|
+
*
|
|
6
|
+
* The destination point on the native sensor sets the local exposure timing. At a chosen phase within
|
|
7
|
+
* that local window, the captured image-plane ray is mapped back analytically to the reference image
|
|
8
|
+
* plane at the first opening-boundary phase (when the shutter starts to open). No iterative solve is
|
|
9
|
+
* needed: once the destination and local capture time are known, pure rotation under this
|
|
10
|
+
* constant-axis model has an analytic inverse.
|
|
11
|
+
*
|
|
12
|
+
* This is not a renderer for a finite exposure, and it does not integrate blur. Sensor data-readout
|
|
13
|
+
* timing is deliberately not used; exposure boundaries are the only timing source.
|
|
14
|
+
* @see docs/MOTION_AND_SIGNAL.md for the equations, units, coordinate conventions, known blockers
|
|
15
|
+
* and support limits.
|
|
13
16
|
*/
|
|
14
17
|
import { type CalculationProvenance, type CalculationResult } from "../core/calculation-result.js";
|
|
15
18
|
import { type CaptureOrientation, type RasterPoint, type RasterVector } from "../output/capture-geometry.js";
|
|
@@ -22,17 +25,18 @@ export interface CalculateCaptureRotationInverseMappingsInput extends CalculateC
|
|
|
22
25
|
focusDistanceM?: number;
|
|
23
26
|
angularVelocityRadPerSec: CameraAngularVelocityRadPerSec;
|
|
24
27
|
/**
|
|
25
|
-
*
|
|
26
|
-
* instantaneous mapping
|
|
28
|
+
* Where in each point's local exposure interval to evaluate the
|
|
29
|
+
* instantaneous mapping, as a fraction.
|
|
27
30
|
*
|
|
28
31
|
* 0 = local exposure start, 0.5 = local midpoint, 1 = local exposure end.
|
|
29
|
-
* A phase is required because finite exposure has no single sharp
|
|
32
|
+
* A phase is required because a finite exposure has no single sharp
|
|
33
|
+
* geometry.
|
|
30
34
|
*/
|
|
31
35
|
localExposurePhase: number;
|
|
32
36
|
/**
|
|
33
|
-
* Physical capture orientation used only to rotate the reported
|
|
34
|
-
* inverse
|
|
35
|
-
* It does not
|
|
37
|
+
* Physical capture orientation. It is used only to rotate the reported
|
|
38
|
+
* native inverse displacement (in samples) into oriented-capture
|
|
39
|
+
* coordinates. It does not change the native exposure schedule.
|
|
36
40
|
*/
|
|
37
41
|
orientation: CaptureOrientation;
|
|
38
42
|
samplePointsNative: readonly RasterPoint[];
|
|
@@ -48,8 +52,8 @@ export interface CaptureRotationInverseMappingSample {
|
|
|
48
52
|
localExposurePhase: number;
|
|
49
53
|
captureTimeSecondsFromReference: number;
|
|
50
54
|
/**
|
|
51
|
-
*
|
|
52
|
-
*
|
|
55
|
+
* The same still world ray on the reference image plane at exposure start.
|
|
56
|
+
* It may lie outside the active capture area; it is deliberately not
|
|
53
57
|
* clamped.
|
|
54
58
|
*/
|
|
55
59
|
referenceImagePointMm: ImagePlanePointMm;
|
|
@@ -59,8 +63,8 @@ export interface CaptureRotationInverseMappingSample {
|
|
|
59
63
|
distance: number;
|
|
60
64
|
};
|
|
61
65
|
/**
|
|
62
|
-
* Reference
|
|
63
|
-
* raster
|
|
66
|
+
* Reference minus destination displacement, in continuous native effective
|
|
67
|
+
* raster samples (+X right, +Y down).
|
|
64
68
|
*/
|
|
65
69
|
inverseDisplacementNativeSamples: RasterVector & {
|
|
66
70
|
distance: number;
|
|
@@ -93,21 +97,20 @@ export interface CaptureRotationInverseMappings {
|
|
|
93
97
|
};
|
|
94
98
|
}
|
|
95
99
|
/**
|
|
96
|
-
* Calculates an instantaneous inverse capture-scan mapping for
|
|
97
|
-
*
|
|
100
|
+
* Calculates an instantaneous inverse capture-scan mapping for still world
|
|
101
|
+
* rays under pure camera rotation.
|
|
98
102
|
*
|
|
99
|
-
* The destination native sensor
|
|
100
|
-
*
|
|
101
|
-
*
|
|
102
|
-
*
|
|
103
|
+
* The destination point on the native sensor sets the local exposure timing.
|
|
104
|
+
* At a chosen phase within that local window, the captured image-plane ray is
|
|
105
|
+
* mapped back analytically to the reference image plane at the first
|
|
106
|
+
* opening-boundary phase.
|
|
103
107
|
*
|
|
104
|
-
* No
|
|
105
|
-
*
|
|
106
|
-
*
|
|
108
|
+
* No iterative solve is needed. Once the destination and local capture time
|
|
109
|
+
* are known, pure rotation under this constant-axis model has an analytic
|
|
110
|
+
* inverse.
|
|
107
111
|
*
|
|
108
|
-
* This
|
|
109
|
-
* Sensor data-readout timing is deliberately
|
|
110
|
-
* the only timing source.
|
|
112
|
+
* This is not a renderer for a finite exposure, and it does not integrate
|
|
113
|
+
* blur. Sensor data-readout timing is deliberately not used; exposure
|
|
114
|
+
* boundaries are the only timing source.
|
|
111
115
|
*/
|
|
112
116
|
export declare function calculateCaptureRotationInverseMappings(input: CalculateCaptureRotationInverseMappingsInput): CalculationResult<CaptureRotationInverseMappings>;
|
|
113
|
-
//# sourceMappingURL=capture-rotation-inverse-mapping.d.ts.map
|
|
@@ -1,16 +1,19 @@
|
|
|
1
1
|
// SPDX-License-Identifier: Apache-2.0
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* rotation.
|
|
6
|
-
*
|
|
7
|
-
* the
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
3
|
+
* Instantaneous inverse mapping for a rotating camera whose sensor exposes different points at
|
|
4
|
+
* different times (for example a rolling shutter). Applies to still world rays under pure camera
|
|
5
|
+
* rotation.
|
|
6
|
+
*
|
|
7
|
+
* The destination point on the native sensor sets the local exposure timing. At a chosen phase within
|
|
8
|
+
* that local window, the captured image-plane ray is mapped back analytically to the reference image
|
|
9
|
+
* plane at the first opening-boundary phase (when the shutter starts to open). No iterative solve is
|
|
10
|
+
* needed: once the destination and local capture time are known, pure rotation under this
|
|
11
|
+
* constant-axis model has an analytic inverse.
|
|
12
|
+
*
|
|
13
|
+
* This is not a renderer for a finite exposure, and it does not integrate blur. Sensor data-readout
|
|
14
|
+
* timing is deliberately not used; exposure boundaries are the only timing source.
|
|
15
|
+
* @see docs/MOTION_AND_SIGNAL.md for the equations, units, coordinate conventions, known blockers
|
|
16
|
+
* and support limits.
|
|
14
17
|
*/
|
|
15
18
|
import { approximationResult } from "../core/calculation-result.js";
|
|
16
19
|
import { InvalidScientificInputError, requirePositiveFinite } from "../core/validation.js";
|
|
@@ -18,6 +21,8 @@ import { mapOrientedPhysicalUvToImagePlanePoint, resolveCaptureGeometry, transfo
|
|
|
18
21
|
import { calculateCaptureExposureWindows } from "../sensor/exposure-window.js";
|
|
19
22
|
import { calculateSensorGeometryMetrics } from "../sensor/sensor-geometry.js";
|
|
20
23
|
import { calculateInverseCameraRotationImageMapping } from "./camera-rotation.js";
|
|
24
|
+
import { requireInputObject, requireInputKeys } from "../core/record-validation.js";
|
|
25
|
+
import { InvalidConfigurationError } from "../core/configuration-error.js";
|
|
21
26
|
function requireExposurePhase(value) {
|
|
22
27
|
if (!Number.isFinite(value) || value < 0 || value > 1) {
|
|
23
28
|
throw new InvalidScientificInputError("localExposurePhase must be finite and within [0, 1].");
|
|
@@ -25,8 +30,9 @@ function requireExposurePhase(value) {
|
|
|
25
30
|
}
|
|
26
31
|
function requireNonEmptySamples(value) {
|
|
27
32
|
if (!Array.isArray(value) || value.length === 0) {
|
|
28
|
-
throw new
|
|
33
|
+
throw new InvalidConfigurationError("samplePointsNative must be a non-empty array.");
|
|
29
34
|
}
|
|
35
|
+
value.forEach((point, index) => requireInputObject(point, "samplePointsNative[" + index + "]"));
|
|
30
36
|
}
|
|
31
37
|
function nativePointToImagePlane(point, activeCaptureRect, activePhysicalBoundsFromOpticalAxisMm) {
|
|
32
38
|
const u = (point.x - activeCaptureRect.x) / activeCaptureRect.width;
|
|
@@ -42,23 +48,25 @@ function captureTimeAtPhase(exposure, phase) {
|
|
|
42
48
|
phase * exposure.localExposureDurationSeconds);
|
|
43
49
|
}
|
|
44
50
|
/**
|
|
45
|
-
* Calculates an instantaneous inverse capture-scan mapping for
|
|
46
|
-
*
|
|
51
|
+
* Calculates an instantaneous inverse capture-scan mapping for still world
|
|
52
|
+
* rays under pure camera rotation.
|
|
47
53
|
*
|
|
48
|
-
* The destination native sensor
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
54
|
+
* The destination point on the native sensor sets the local exposure timing.
|
|
55
|
+
* At a chosen phase within that local window, the captured image-plane ray is
|
|
56
|
+
* mapped back analytically to the reference image plane at the first
|
|
57
|
+
* opening-boundary phase.
|
|
52
58
|
*
|
|
53
|
-
* No
|
|
54
|
-
*
|
|
55
|
-
*
|
|
59
|
+
* No iterative solve is needed. Once the destination and local capture time
|
|
60
|
+
* are known, pure rotation under this constant-axis model has an analytic
|
|
61
|
+
* inverse.
|
|
56
62
|
*
|
|
57
|
-
* This
|
|
58
|
-
* Sensor data-readout timing is deliberately
|
|
59
|
-
* the only timing source.
|
|
63
|
+
* This is not a renderer for a finite exposure, and it does not integrate
|
|
64
|
+
* blur. Sensor data-readout timing is deliberately not used; exposure
|
|
65
|
+
* boundaries are the only timing source.
|
|
60
66
|
*/
|
|
61
67
|
export function calculateCaptureRotationInverseMappings(input) {
|
|
68
|
+
requireInputKeys(input, "calculateCaptureRotationInverseMappings", ["imagingArea", "focalLengthMm", "focusDistanceM", "angularVelocityRadPerSec", "localExposurePhase", "orientation", "samplePointsNative", "nativeRaster", "activeCaptureRect", "shutterMechanism", "nominalExposureDurationSeconds", "opening", "closing"]);
|
|
69
|
+
requireInputObject(input.imagingArea, "imagingArea");
|
|
62
70
|
requirePositiveFinite("imagingArea.widthMm", input.imagingArea.widthMm);
|
|
63
71
|
requirePositiveFinite("imagingArea.heightMm", input.imagingArea.heightMm);
|
|
64
72
|
requirePositiveFinite("focalLengthMm", input.focalLengthMm);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capture-rotation-inverse-mapping.js","sourceRoot":"","sources":["../../src/motion/capture-rotation-inverse-mapping.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"capture-rotation-inverse-mapping.js","sourceRoot":"","sources":["../../src/motion/capture-rotation-inverse-mapping.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Instantaneous inverse mapping for a rotating camera whose sensor exposes different points at\n * different times (for example a rolling shutter). Applies to still world rays under pure camera\n * rotation.\n *\n * The destination point on the native sensor sets the local exposure timing. At a chosen phase within\n * that local window, the captured image-plane ray is mapped back analytically to the reference image\n * plane at the first opening-boundary phase (when the shutter starts to open). No iterative solve is\n * needed: once the destination and local capture time are known, pure rotation under this\n * constant-axis model has an analytic inverse.\n *\n * This is not a renderer for a finite exposure, and it does not integrate blur. Sensor data-readout\n * timing is deliberately not used; exposure boundaries are the only timing source.\n * @see docs/MOTION_AND_SIGNAL.md for the equations, units, coordinate conventions, known blockers\n * and support limits.\n */\n\nimport {\n approximationResult,\n type CalculationProvenance,\n type CalculationResult\n} from \"../core/calculation-result.js\";\nimport {\n InvalidScientificInputError,\n requirePositiveFinite\n} from \"../core/validation.js\";\nimport {\n mapOrientedPhysicalUvToImagePlanePoint,\n resolveCaptureGeometry,\n transformNativeRasterVectorToOriented,\n type CaptureOrientation,\n type RasterPoint,\n type RasterVector\n} from \"../output/capture-geometry.js\";\nimport {\n calculateCaptureExposureWindows,\n type CalculateCaptureExposureWindowsInput,\n type CaptureExposureWindowSample\n} from \"../sensor/exposure-window.js\";\nimport {\n calculateSensorGeometryMetrics,\n type SensorImagingArea\n} from \"../sensor/sensor-geometry.js\";\nimport {\n calculateInverseCameraRotationImageMapping,\n type CameraAngularVelocityRadPerSec,\n type ImagePlanePointMm\n} from \"./camera-rotation.js\";\nimport { requireInputObject, requireInputKeys } from \"../core/record-validation.js\";\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\n\nexport interface CalculateCaptureRotationInverseMappingsInput\n extends CalculateCaptureExposureWindowsInput {\n imagingArea: SensorImagingArea;\n focalLengthMm: number;\n focusDistanceM?: number;\n angularVelocityRadPerSec: CameraAngularVelocityRadPerSec;\n /**\n * Where in each point's local exposure interval to evaluate the\n * instantaneous mapping, as a fraction.\n *\n * 0 = local exposure start, 0.5 = local midpoint, 1 = local exposure end.\n * A phase is required because a finite exposure has no single sharp\n * geometry.\n */\n localExposurePhase: number;\n /**\n * Physical capture orientation. It is used only to rotate the reported\n * native inverse displacement (in samples) into oriented-capture\n * coordinates. It does not change the native exposure schedule.\n */\n orientation: CaptureOrientation;\n samplePointsNative: readonly RasterPoint[];\n}\n\nexport interface CaptureRotationInverseMappingSample {\n destinationPointNative: RasterPoint;\n destinationImagePointMm: ImagePlanePointMm;\n localExposureWindow: {\n startSecondsFromCaptureReference: number;\n endSecondsFromCaptureReference: number;\n durationSeconds: number;\n };\n localExposurePhase: number;\n captureTimeSecondsFromReference: number;\n /**\n * The same still world ray on the reference image plane at exposure start.\n * It may lie outside the active capture area; it is deliberately not\n * clamped.\n */\n referenceImagePointMm: ImagePlanePointMm;\n inverseDisplacementImagePlaneMm: {\n x: number;\n y: number;\n distance: number;\n };\n /**\n * Reference minus destination displacement, in continuous native effective\n * raster samples (+X right, +Y down).\n */\n inverseDisplacementNativeSamples: RasterVector & {\n distance: number;\n };\n /**\n * The same displacement after physical capture orientation.\n */\n inverseDisplacementOrientedSamples: RasterVector & {\n distance: number;\n };\n}\n\nexport interface CaptureRotationInverseMappings {\n timeReference: \"first-opening-boundary-phase\";\n referenceTimeSecondsFromCaptureReference: 0;\n mappingMeaning:\n \"instantaneous-destination-to-exposure-start-reference-ray\";\n orientation: CaptureOrientation;\n localExposurePhase: number;\n imagingArea: SensorImagingArea;\n activeCaptureRect: {\n x: number;\n y: number;\n width: number;\n height: number;\n };\n samples: readonly CaptureRotationInverseMappingSample[];\n componentProvenance: {\n exposureWindows: CalculationProvenance;\n sensorGeometry: CalculationProvenance;\n inverseCameraRotation: CalculationProvenance;\n };\n}\n\nfunction requireExposurePhase(value: number): void {\n if (!Number.isFinite(value) || value < 0 || value > 1) {\n throw new InvalidScientificInputError(\n \"localExposurePhase must be finite and within [0, 1].\"\n );\n }\n}\n\nfunction requireNonEmptySamples(\n value: readonly RasterPoint[]\n): void {\n if (!Array.isArray(value) || value.length === 0) {\n throw new InvalidConfigurationError(\n \"samplePointsNative must be a non-empty array.\"\n );\n }\n value.forEach((point, index) => requireInputObject(point, \"samplePointsNative[\" + index + \"]\"));\n}\n\nfunction nativePointToImagePlane(\n point: RasterPoint,\n activeCaptureRect: {\n x: number;\n y: number;\n width: number;\n height: number;\n },\n activePhysicalBoundsFromOpticalAxisMm: {\n left: number;\n right: number;\n top: number;\n bottom: number;\n }\n): ImagePlanePointMm {\n const u = (point.x - activeCaptureRect.x) / activeCaptureRect.width;\n const v = (point.y - activeCaptureRect.y) / activeCaptureRect.height;\n\n return mapOrientedPhysicalUvToImagePlanePoint({\n uv: { u, v },\n orientedPhysicalBoundsFromOpticalAxisMm:\n activePhysicalBoundsFromOpticalAxisMm,\n orientation: \"landscape\"\n });\n}\n\nfunction captureTimeAtPhase(\n exposure: CaptureExposureWindowSample,\n phase: number\n): number {\n return (\n exposure.startOffsetSecondsFromOpeningReference +\n phase * exposure.localExposureDurationSeconds\n );\n}\n\n/**\n * Calculates an instantaneous inverse capture-scan mapping for still world\n * rays under pure camera rotation.\n *\n * The destination point on the native sensor sets the local exposure timing.\n * At a chosen phase within that local window, the captured image-plane ray is\n * mapped back analytically to the reference image plane at the first\n * opening-boundary phase.\n *\n * No iterative solve is needed. Once the destination and local capture time\n * are known, pure rotation under this constant-axis model has an analytic\n * inverse.\n *\n * This is not a renderer for a finite exposure, and it does not integrate\n * blur. Sensor data-readout timing is deliberately not used; exposure\n * boundaries are the only timing source.\n */\nexport function calculateCaptureRotationInverseMappings(\n input: CalculateCaptureRotationInverseMappingsInput\n): CalculationResult<CaptureRotationInverseMappings> {\n requireInputKeys(input, \"calculateCaptureRotationInverseMappings\", [\"imagingArea\", \"focalLengthMm\", \"focusDistanceM\", \"angularVelocityRadPerSec\", \"localExposurePhase\", \"orientation\", \"samplePointsNative\", \"nativeRaster\", \"activeCaptureRect\", \"shutterMechanism\", \"nominalExposureDurationSeconds\", \"opening\", \"closing\"]);\n requireInputObject(input.imagingArea, \"imagingArea\");\n requirePositiveFinite(\"imagingArea.widthMm\", input.imagingArea.widthMm);\n requirePositiveFinite(\"imagingArea.heightMm\", input.imagingArea.heightMm);\n requirePositiveFinite(\"focalLengthMm\", input.focalLengthMm);\n requireExposurePhase(input.localExposurePhase);\n requireNonEmptySamples(input.samplePointsNative);\n\n const exposureWindows = calculateCaptureExposureWindows({\n nativeRaster: input.nativeRaster,\n ...(input.activeCaptureRect === undefined\n ? {}\n : { activeCaptureRect: input.activeCaptureRect }),\n shutterMechanism: input.shutterMechanism,\n nominalExposureDurationSeconds:\n input.nominalExposureDurationSeconds,\n opening: input.opening,\n closing: input.closing,\n samplePointsNative: input.samplePointsNative\n });\n\n const geometry = resolveCaptureGeometry({\n imagingArea: input.imagingArea,\n nativeRaster: input.nativeRaster,\n orientation: input.orientation,\n activeCaptureRect: exposureWindows.value.activeCaptureRect\n }).value;\n\n const sensorGeometry = calculateSensorGeometryMetrics({\n imagingArea: input.imagingArea,\n nativeRaster: input.nativeRaster\n });\n\n const pitchXmm =\n sensorGeometry.value.sampling.pitchXMicrometers / 1000;\n const pitchYmm =\n sensorGeometry.value.sampling.pitchYMicrometers / 1000;\n\n let inverseRotationProvenance: CalculationProvenance | undefined;\n const samples = input.samplePointsNative.map((point, index) => {\n const exposure = exposureWindows.value.samples[index];\n if (exposure === undefined) {\n throw new InvalidScientificInputError(\n \"Exposure-window sample alignment failed.\"\n );\n }\n\n const destinationImagePointMm = nativePointToImagePlane(\n point,\n geometry.activeCapture.nativeRect,\n geometry.activeCapture.physicalBoundsFromOpticalAxisMm\n );\n const captureTimeSecondsFromReference = captureTimeAtPhase(\n exposure,\n input.localExposurePhase\n );\n\n const inverse = calculateInverseCameraRotationImageMapping({\n focalLengthMm: input.focalLengthMm,\n imagePointMm: destinationImagePointMm,\n timeSecondsFromExposureStart:\n captureTimeSecondsFromReference,\n angularVelocityRadPerSec: input.angularVelocityRadPerSec,\n ...(input.focusDistanceM === undefined\n ? {}\n : { focusDistanceM: input.focusDistanceM }),\n samplingPitchMicrometers: {\n x: sensorGeometry.value.sampling.pitchXMicrometers,\n y: sensorGeometry.value.sampling.pitchYMicrometers\n }\n });\n inverseRotationProvenance ??= inverse.provenance;\n\n const nativeX = inverse.value.deltaMm.x / pitchXmm;\n const nativeY = -inverse.value.deltaMm.y / pitchYmm;\n const inverseDisplacementNativeSamples = {\n x: nativeX,\n y: nativeY,\n distance: Math.hypot(nativeX, nativeY)\n };\n const orientedVector = transformNativeRasterVectorToOriented({\n vector: {\n x: inverseDisplacementNativeSamples.x,\n y: inverseDisplacementNativeSamples.y\n },\n orientation: input.orientation\n });\n const inverseDisplacementOrientedSamples = {\n ...orientedVector,\n distance: Math.hypot(orientedVector.x, orientedVector.y)\n };\n\n return {\n destinationPointNative: { ...point },\n destinationImagePointMm,\n localExposureWindow: {\n startSecondsFromCaptureReference:\n exposure.startOffsetSecondsFromOpeningReference,\n endSecondsFromCaptureReference:\n exposure.endOffsetSecondsFromOpeningReference,\n durationSeconds: exposure.localExposureDurationSeconds\n },\n localExposurePhase: input.localExposurePhase,\n captureTimeSecondsFromReference,\n referenceImagePointMm: {\n ...inverse.value.referenceImagePointMm\n },\n inverseDisplacementImagePlaneMm: {\n ...inverse.value.deltaMm\n },\n inverseDisplacementNativeSamples,\n inverseDisplacementOrientedSamples\n };\n });\n\n if (inverseRotationProvenance === undefined) {\n throw new InvalidScientificInputError(\n \"At least one inverse rotation mapping sample is required.\"\n );\n }\n\n return approximationResult(\n {\n timeReference: \"first-opening-boundary-phase\",\n referenceTimeSecondsFromCaptureReference: 0,\n mappingMeaning:\n \"instantaneous-destination-to-exposure-start-reference-ray\",\n orientation: input.orientation,\n localExposurePhase: input.localExposurePhase,\n imagingArea: { ...input.imagingArea },\n activeCaptureRect: {\n ...exposureWindows.value.activeCaptureRect\n },\n samples,\n componentProvenance: {\n exposureWindows: exposureWindows.provenance,\n sensorGeometry: sensorGeometry.provenance,\n inverseCameraRotation: inverseRotationProvenance\n }\n },\n \"capture-rotation-instantaneous-inverse-mapping\",\n \"1.0.0\",\n [\n \"Destination native capture location determines the local exposure window.\",\n \"The caller explicitly selects one phase within each local exposure interval; no midpoint or other phase is inferred.\",\n \"The first opening-boundary phase is the reference image time and is bound to t=0 of the camera-rotation model for this composition.\",\n \"Pure rotation is inverted analytically after local capture time is known; no iterative or fixed-point solver is used.\",\n \"Sensor data-readout timing is not an input and is not assumed to equal any exposure boundary.\",\n \"Reference image-plane coordinates are not clamped to the active capture and may fall outside it under motion.\",\n \"Native geometric sample displacement uses the full physical imaging-area/native-raster pitch and is not output-resolution dependent.\",\n \"Physical capture orientation rotates reported native displacement only; it does not alter native exposure timing.\",\n \"The mapping lives in the ideal pre-lens image plane and does not compose radial distortion, chromatic aberration, PSF, or output resampling.\",\n \"This is an instantaneous mapping, not finite-exposure integration or a blur kernel.\",\n \"Camera translation, depth parallax, subject motion, deformation, occlusion changes, flash/flicker and shutter shock are excluded.\",\n \"The model does not claim the global rolling/capture-scan picture-taking map is one-to-one for arbitrary motion.\"\n ]\n );\n}\n"]}
|