# ISS — versión 20

Implementación local de posición orbital y un modelo 3D original de la Estación Espacial Internacional. Consultado y construido el 21 de septiembre de 2026.

## Datos reales y procedencia

- Objeto: ISS (ZARYA), NORAD 25544, identificador internacional 1998-067A.
- [Consulta original OMM/JSON de CelesTrak](https://celestrak.org/NORAD/elements/gp.php?CATNR=25544&FORMAT=JSON).
- Época original exacta: **2026-09-21T04:11:30.947136 UTC**. Recuperación: 2026-09-21. JavaScript trabaja a milisegundos y usa `.947Z`.
- Se conserva la respuesta original en `assets/iss/iss-omm.json`. Los mismos elementos se incorporan a `js/iss-datos.js` para funcionar abriendo `index.html` con `file://`.
- SHA-256 de la respuesta descargada: `0D1852E3CE0FCAE16597E3A4FDDBB54FB1AB0D270D0994EE2EE36CACB4DC8CCB`.
- No se inventaron elementos ni se confundió la fecha de descarga con la época orbital.

La [documentación de CelesTrak sobre GP/OMM](https://celestrak.org/NORAD/documentation/gp-data-formats.php) especifica los nombres de campo. En su JSON pueden omitirse las constantes redundantes EARTH, TEME, UTC y SGP4. El importador comprueba NORAD, época, números finitos, intervalos orbitales y esos metadatos cuando existen. Una entrada inválida mantiene el conjunto anterior.

## Propagador, coordenadas y límites

Biblioteca local **satellite.js 6.0.1**, versión fijada, obtenida de `https://cdn.jsdelivr.net/npm/satellite.js@6.0.1/dist/satellite.min.js`. Repositorio de sus autores: [shashwatak/satellite-js](https://github.com/shashwatak/satellite-js). Licencia **MIT** incluida íntegramente en `js/vendor/SATELLITE-LICENSE.md`; permite uso comercial conservando el aviso. SHA-256 del JavaScript: `6FD7487ABB99BEC37EA2C8D1F5739B59143A6130A00B0FAA6C44DD44585AEBBF`.

`json2satrec` inicializa SGP4 con los elementos medios; no se usa una órbita circular inventada. El modelo devuelve posición y velocidad inerciales TEME, longitud/latitud geodésicas, altitud sobre el elipsoide, período medio y un estado de validez. Velocidad mostrada: magnitud inercial en km/s. El período procede del movimiento medio publicado.

La conversión TEME → PEF usa GMST. Para el globo propio: `(x,y,z) de PEF → (x,z,-y) de THREE`, con el meridiano cero en +X, este en −Z y norte en +Y. El globo queda fijo a la Tierra y el satélite se mueve correctamente respecto a él. Su achatamiento representa el elipsoide WGS84. La trayectoria es un intervalo de una órbita SGP4 con el giro terrestre congelado al instante seleccionado: **no es una traza sobre el suelo**. El dibujo no cierra artificialmente los extremos de una órbita que precesa.

La API `temeToSceneKm(position, date)` y el campo `sceneKm` convierten además a la eclíptica J2000 del simulador existente: PEF → ecuador verdadero de fecha mediante tiempo sidéreo aparente; Astronomy Engine transforma EQD → EQJ → ECL; se aplica `(x,z,-y)`. Esto evita interpretar TEME como J2000. La API entrega un vector relativo al centro terrestre en km, al que se puede sumar la Tierra heliocéntrica y aplicar la escala del visor. No se añade una marca solar en esta versión: el seguimiento se presenta en el visor terrestre dedicado.

La transformación aproxima UT1 con UTC y no aplica movimiento polar ni EOP. El error operacional depende, además, de los elementos, arrastre y maniobras. **No se afirma precisión de navegación ni una posición medida en directo.** El recorrido y la posición se recalculan con la fecha global del simulador, incluidos pausa, fecha manual y tiempo real.

Reglas propias, prudentes y explícitas: separación absoluta entre fecha elegida y época de hasta 2 días → elementos cercanos; más de 2 y hasta 7 días → aviso de estimación degradada; más de 7 días → posición, estación orbital y trayectoria ocultas. El modelo 3D sigue disponible. Estos intervalos son decisiones de la aplicación, no garantías de CelesTrak. La época, fecha seleccionada, separación y antigüedad respecto al reloj real se muestran al usuario.

[Vallado et al., Revisiting Spacetrack Report #3, AIAA 2006-6753](https://celestrak.org/publications/AIAA/2006-6753/) aporta la referencia primaria del propagador y sus casos de validación.

## Modelo 3D y derechos

Geometría original creada en `js/iss-modelo.js`, sin descargar ningún modelo de terceros: celosía transversal, ocho alas solares, seis superficies de radiadores, módulos cilíndricos, conexiones, Cupola y brazo robótico articulado. Incluye superposiciones simplificadas que evocan los paneles iROSA. Unidades internas: metros. No se afirma que posiciones de radiadores, paneles o vehículos correspondan a una fecha concreta. No contiene logotipos.

La orientación orbital del modelo es una pose ilustrativa de vertical local, no actitud telemedida. La estación se amplía en la vista orbital para verla, y una etiqueta lo informa. Tierra y altitud orbital sí comparten escala. El modo Modelo 3D permite inspeccionar la geometría sin el globo. Referencia factual para estructura y dimensiones: [NASA, International Space Station Reference](https://www.nasa.gov/reference/international-space-station/). La textura terrestre reutiliza el recurso local ya documentado por el simulador.

## Funcionamiento y API de integración

Orden: `three.min.js`, `astronomy.browser.min.js`, `satellite.min.js`, texturas locales y después `iss-datos.js`, `iss-fisica.js`, `iss-modelo.js`, `iss.js`. Cargar `css/iss.css`.

```js
const issPanel = new SolarISSPanel(document.getElementById('iss-panel'), {
  clock,
  wake: () => loop?.wake(true),
});
// En la actualización compartida:
issPanel.update(scene.data); // También acepta Date.
// Ruta desde el menú principal:
issPanel.reveal(); // Abre los ancestros DETAILS y la tarjeta; funciona pausado.
```

También acepta `getDate` y `setDate` si no se entrega `clock`. `setActive(false)` impide cálculo y render. La tarjeta crea WebGL al abrirse; ni intervalos ni RAF propios. Comprueba ancestros plegados, nodos ocultos y documento en segundo plano. Teclado, botones, ratón y toque permiten mover la cámara. `Centrar` orienta la cámara hacia la posición ISS calculada en modo orbital. El botón Época de datos sincroniza el reloj global, por lo que cambia también el resto del simulador.

La única consulta remota sucede tras pulsar **Consultar elementos actuales**: una petición CelesTrak con timeout, sin credenciales y sin repetición automática. Si falla Internet o CORS bajo `file://`, se conserva la instantánea y se ofrece importar JSON desde el enlace original. No hay CDN en tiempo de ejecución ni telemetría del visitante. Los datos importados solo afectan a la sesión; recargar recupera la instantánea incluida.

## Verificación ejecutada

- `node tests/iss-fisica.cjs`: vector oficial SGP4 00005 de Vallado; posición y velocidad de referencia; altitud y período razonables del OMM incluido; cruce ecuatorial; cuarto de órbita; límites recientes/degradados/caducados; órbita; importaciones inválidas; dimensiones originales del modelo. Los cambios de coordenadas coinciden con el quaternion del globo existente en tres fechas y varios ejes: se comprueba **coherencia matemática**, no precisión física de una millonésima de km.
- `node tests/iss-panel.cjs`: visibilidad de ancestros, ausencia de cálculo/arranque WebGL cuando se pliega, apertura desde menú con reloj pausado y conservación de elementos válidos.
- La integración se comprobó visualmente desde la vista previa local: selección de vistas, modelo, lecturas y navegación. Las pruebas de navegador auxiliares no son dependencias de la aplicación.
- Capturas verificadas visualmente fuera del producto: `../iss-v20-qa/qa-orbit.png` y `../iss-v20-qa/qa-model.png` (no incluidas al distribuir la aplicación).

