El archivo de avistamiento
Una grabación es un archivo JSON, la haya escrito el editor o tú. Esto es lo que puede contener, y lo que significa cada campo.
Una grabación es un simple archivo JSON. Nada en ella es un blob binario, un identificador de una base de datos ni una referencia a este sitio — puedes escribir una a mano, generarla desde tu propio archivo, o comparar dos en una revisión de código.
Cada extracto de abajo es de solo lectura, y cada uno conoce el formato: sitúa el cursor dentro de un objeto y pulsa Ctrl+Espacio (⌥+I en un Mac) para listar todas las claves que podrían ir allí, con lo que el modelo dice de cada una.
La observación#
| Campo | Significado |
|---|---|
version | Siempre 1 |
id | Qué relato es este, único entre todas las grabaciones de cualquier parte: el día, y luego quién lo vio ("1964-04-24-ZamoraLonnie"), o dónde para un observador anónimo ("1964-04-24-Socorro"). Aquello por lo que un caso lo nombra no es este id sino el de su evento (véase más abajo). |
time, endTime | { year, month, day, hour, minute, second, raw }, cada parte opcional — así es como el formato expresa “1954” o “hacia las 05:00”. raw es la fecha tal como se escribe en EDTF, y es lo que la fecha significa: "1948-07-24T02:45~" (aproximada), "2025-06?" (incierta), "1965-07-01%" (ambas cosas), "19XX" (un año enmascarado), o "05:00" solo, para una hora del día recordada sin su fecha. Los números se mantienen de acuerdo con ella para lo que se calcula (el cielo, el reloj). Es un subconjunto de EDTF (nivel 0, estos calificadores sobre la fecha entera, años enmascarados); @rr0/time es el modelo EDTF completo de RR0, al que las herramientas propias de UFO@home convierten las fechas de una grabación season (spring, summer, autumn o winter) dice una fecha conocida solo como «en primavera de 2022» (EDTF 2022-21), donde se omiten month y day. |
durationSeconds | Una alternativa a endTime, y prevalece si se dan las dos |
durationText | La duración tal como se enunció cuando no era exacta: una duración ISO 8601 con una duda (PT10M~) o un rango (PT5M/PT10M). durationSeconds es entonces la única duración a la que se reproduce, elegida a partir de ella |
utcOffsetHours | La hora LEGAL que marcaba el reloj del observador (+1 para Francia en 1965). Si falta, se aproxima a partir de la longitud, que no puede conocer la hora legal ni un cambio de horario de verano |
timeZone | La zona IANA de la que se derivó el desfase ("Europe/Paris"): la regla, mientras que utcOffsetHours es el número que daba en esa fecha. Solo se lee el número para situar el cielo; la zona es lo que permite derivar de nuevo el desfase cuando cambia la fecha |
place | [{ lat, lng, name }] — name es el nombre completo del lugar a partir del cual se resolvieron las coordenadas |
observer | { id, title, lastName, firstNames }, todos opcionales; se omite por completo para un observador anónimo. id es una referencia a la persona (en RR0, su directorio: "ZamoraLonnie"); los demás campos la describen cuando nadie le ha dado uno |
description | El relato en prosa — una cadena, o una por idioma (véase más abajo) |
image, summary, summaryTime | Lo que representa la observación donde solo se enlaza y nunca se reproduce: la tarjeta que muestra un enlace compartido (véase Compartir). image es una imagen, una dirección (absoluta, relativa al archivo, o una ruta RR0 desde la raíz del sitio); summary una o dos frases, una cadena o una por idioma. Ausentes, la tarjeta muestra el logotipo y dice quién la vio, en qué caso y cuándo, hasta donde lo diga el archivo. summaryTime es el segundo de la grabación en que se fotografía la imagen de la tarjeta (0 por defecto: la primera imagen), para una grabación cuya primera imagen no muestra el fenómeno; solo la herramienta de captura del proyecto lo lee, nunca el reproductor |
tags | Una lista de cadenas, escritas en inglés: son términos técnicos, y dos grabaciones que comparten uno tienen que coincidir en él. A cada lector se le muestran en su propio idioma cuando se conoce una traducción, que hoy es el caso de landing, trace, aerial observation, project sign, paralysis, contact, occupants, close encounter, photograph, radar, electromagnetic effect. La lista no está cerrada: cualquier otra se muestra tal como está escrita, y los códigos de clasificación ("RR3", "NL") o las referencias de caso ("Blue Book 8729") se escriben tal cual. Una cambia la reproducción: paralysis mantiene inmóvil la vista del observador |
account | Quién lo vio y cómo viajó el relato: observerAgeYears (en aquel momento), observerOccupation, source (cómo llegó a quien escribió la grabación: on-site, interview, telephone, questionnaire, letter, social-media, press) y followedUp (si se volvió a contactar al observador después) |
sources | Dónde leer el relato tal como se dio, con la forma de una fuente RR0: [{ type, title, authors, url, publication: { publisher, time }, index }], siendo type book o article, o nada para una página web o una publicación, que entonces es solo su url. Se muestran en el panel ?del reproductor, enlazadas cuando tienen dirección; se copian tal cual en un expediente RR0 |
milestones | Los momentos con nombre del relato, mostrados en la barra de reproducción: [{ t, label, note }], siendo label la letra o el número que usa el propio relato ("A", "B") o un par de palabras, y note lo que ocurrió entonces, con las palabras del relato cuando sea posible (una cadena, o una por idioma) |
roads | Las carreteras o caminos que dibuja el propio plano del relato, cuando el mapa no los tiene: [{ id, title, surface, widthM, path, source }], siendo surface paved, gravel o dirt, path el eje como [{ eastM, northM }] desde el lugar del observador al inicio, y source el plano o levantamiento del que se tomó |
Varios observadores: el caso#
Cada observador tiene su propia grabación, y una grabación no dice a qué caso
pertenece: un relato se sostiene por sí solo. Lo que los muestra juntos es el
caso, que los nombra: el
case.json de un expediente de RR0, que indica el
título, la fecha y la clasificación del caso, y enumera todo lo que ocurrió en él como
events. Sus eventos de tipo sighting son sus relatos, cada uno apuntando
a la grabación de un observador:
{
"id": "ChilesWhitted",
"title": "Chiles et Whitted",
"time": "1948-07-24 02:45",
"events": [
{ "type": "event", "eventType": "sighting", "url": "observer-chiles.json" },
{ "type": "event", "eventType": "sighting", "url": "observer-whitted.json" }
]
}
| Campo | Significado |
|---|---|
id | El identificador propio del caso. En rr0.org es el directorio del expediente y puede omitirse; un archivo de caso independiente lo indica |
title, time | El nombre del caso, y cuándo ocurrió tal como RR0 escribe una hora ("1948-07-24 02:45", "1954"). El reproductor nombra un caso que abre por su título |
events | La cronología del caso. Solo se reproducen los sighting, cada uno por su url, leída respecto a la dirección del propio archivo de caso (de modo que el mismo caso funciona desde la página de su expediente y desde cualquier otro lugar); los marcados con interpretationOf son lecturas de uno de ellos (véase abajo); los demás (un artículo, una película, una confesión) son de RR0 Un evento lleva un id cuando una lectura lo designa, y solo entonces: pertenece al caso, así que debe ser único entre los eventos del caso y en ninguna otra parte, y una referencia se lee en el archivo que la escribe. Un interpretationOf que ningún evento lleva se lee, como antes, como el id que declara una grabación que el caso enumera; el que no corresponde a ninguno de los dos es un fallo del caso, que el reproductor señala en su consola, el editor sobre sus grabaciones, y el validate.py del skill cuando se le da el archivo del caso. |
image, summary | Lo que muestra un enlace compartido al caso, como para una grabación (véase Compartir): una imagen, y una o dos frases, una cadena o una por idioma |
Dáselo a <rr0-sighting src> o al reproductor, y cada observador podrá
elegirse de una lista. Una grabación puede darse directamente, sin caso, pero un caso con un solo
avistamiento funciona igual y nombra lo que muestra. Pruébalo con
case-chiles-whitted.json
(reproducirlo).
Decirlo en más de un idioma#
Una grabación pasa de un lector a otro, así que cada campo que escribe un autor puede contener
una cadena por idioma en lugar de una sola: description, el title de
una forma o de un elemento del decorado, y el label y la note de un hito.
{
"description": {
"fr": "Tout le compte rendu de Lonnie Zamora, d'un seul tenant…",
"en": "Lonnie Zamora's whole account, of a piece…"
}
}
Las claves son etiquetas de idioma tal como las da un navegador (fr, en,
pt-BR), y ninguna es obligatoria. Una cadena simple sigue siendo perfectamente válida y
significa “en el idioma en que se escribiera” — lo que es toda grabación hecha antes de esto.
Un lector cuyos idiomas no son ninguno de los presentes recibe lo que el archivo SÍ tiene en
lugar de un campo vacío: una traducción que falta nunca debe convertir algo que el observador
dijo en algo que no dijo.
El idioma que recibe un lector es el de su navegador, salvo que la página diga otra cosa: un
lang en el propio elemento, o en cualquier cosa a su alrededor, se toma primero — un
artículo que declara su propio idioma ya ha dicho en qué idioma lo está leyendo su lector. La
lista del navegador viene después, así que declarar uno fuerza una elección sin descartar los
demás.
El editor muestra un idioma, el del lector, y al escribir solo toca ese — así que abrir un archivo en el otro idioma y escribir es como se añade una traducción, y un autor no puede borrar la de otro.
Lo que se vio#
timeline.keyframes es una lista de { t, shapes }, con t en
milisegundos desde el inicio. Cada forma lleva un sourceId — varias formas pueden
compartir una línea de tiempo (el fenómeno, una llama que lo sigue, una segunda luz) — y una shape:
{
"kind": "oval",
"bounds": { "x": 0, "y": 0, "width": 0, "height": 0 },
"color": "#39ff14",
"angle": 0,
"transparency": 0,
"haloScale": 1.5,
"brightness": 0,
"blur": 0,
"selected": false,
"title": "el fenómeno",
"angular": { "widthDeg": 1.2, "heightDeg": 0.4 },
"aim": { "azimuthDeg": 353.6, "altitudeDeg": 0.6 }
}
| Campo | Significado |
|---|---|
kind | oval, o polygon, que entonces también toma points: [{ x, y }] en píxeles desde la esquina superior izquierda de bounds, abarcando su anchura y su altura, para que el contorno se estire con ella cuando el ángulo redimensiona la caja |
title | Su nombre, mostrado al pasar el puntero por encima; una cadena, o una por idioma |
color | Cualquier color CSS |
angle | Su inclinación, en radianes alrededor de su propio centro, positiva en sentido horario en pantalla |
transparency | De 0 opaco a 1 invisible |
haloScale | El resplandor a su alrededor; 0 es ninguno |
brightness | Cuánto deslumbra: un velo, las puntas del diafragma, un núcleo saturado a blanco |
blur | Lo difusos que el observador dijo que se veían los bordes |
angular | Su tamaño aparente en grados — véase más abajo |
aim | Dónde estaba en el cielo del observador: la dirección de su centro, azimuthDeg en sentido horario desde el norte verdadero y altitudeDeg sobre el horizonte. No hacia dónde miraba el observador, que es el headingDeg y el pitchDeg de la pose — véase más abajo |
aim lo sitúa, angular lo dimensiona. bounds
es la proyección de ambos sobre el lienzo fijo de 640×360 con el rumbo y el campo de visión de
la pose, a través del propio instrumento de la grabación; se vuelve a derivar al cargar, así que
un archivo sobrevive a un cambio de lienzo, de campo de visión, de instrumento, o de hacia dónde
miraba el observador. Si los píxeles y los ángulos llegan a discrepar, ganan los ángulos: mover
bounds en un archivo no hace nada mientras aim esté ahí. Un archivo
escrito a mano puede omitir bounds por completo.
timeline.order es el orden de pintado de atrás hacia delante, timeline.groups los
identificadores de fuente agrupados. Ambos opcionales.
Todo lo que lo rodea#
| Campo | Significado |
|---|---|
observerTrack | { keyframes: [{ t, pose }] } — pose contiene lat, lng, elevationM (sobre el suelo local), headingDeg, pitchDeg, rollDeg, fovDeg, y para una cámara fNumber y focusDistanceM. Se reproduce como se mueve una persona: exactamente la pose indicada en cada fotograma clave, y entre ellos un movimiento que gana velocidad, la mantiene a través de los fotogramas clave que siguen moviéndose, y frena hasta una pausa — dos fotogramas clave con el mismo lugar, o el mismo rumbo. Una mirada empieza y acaba inmóvil; una marcha a pie o en coche ya en curso en el primer fotograma clave continúa. Detenerse y echar a andar añaden su propia sacudida, un cabeceo que se extingue en un segundo y medio, trasladado a la imagen tanto como el instrumento lo permite (apenas un ojo, del todo una cámara sostenida a mano). Y un cuerpo en reposo nunca está del todo quieto: de pie o esperando, la vista oscila unos milímetros y deriva una décima de grado, despacio, del mismo modo en el mismo instante — salvo para un observador que el relato dice que quedó paralizado (etiqueta paralysis). El pitchDeg indicado es cómo miraba el observador en el marco de lo que lo llevaba: mientras se desplaza, el reproductor suma la pendiente de la carretera bajo la traza (leída del relieve, positiva al subir, atenuada cuando la mirada se aparta de su camino), de modo que una cuesta eleva la vista y el chip Inclinaciónindica la suma filter es lo que se sostenía delante del instrumento, un id de FILTERS como solar-visual para un eclipse. Se mantiene entre fotogramas clave, sin mezclarse (nadie lleva media gafa), y se quita declarando "none". |
weatherTrack | { keyframes: [{ t, weather }] } — las condiciones del cielo a lo largo de la grabación: precipitación, viento, tormenta, y las nubes como capas con alturas reales, cada una capaz de contener nubes individuales situadas en metros. Todos los campos de un weather están en la sección siguiente |
weatherSource | { id, name, url } del registro del que se consultó el tiempo. Su presencia significa que la grabación se reproduce exactamente como se compuso y no se vuelve a consultar nunca. Si falta, es el propio relato del observador |
lightPollution | El brillo del cielo nocturno del lugar, ciudades incluidas: el cenit de una noche sin Luna en magnitudes por segundo de arco cuadrado, tal como lo lee un Sky Quality Meter o lo da el atlas mundial del brillo artificial del cielo nocturno (su cifra «SQM», Falchi et al. 2016, que lightpollutionmap.info muestra para cualquier lugar). 22 es un cielo natural, un suburbio ronda 19, el centro de una ciudad 17. Si falta, un cielo natural. La parte de las ciudades, lo que queda al quitar los 22 naturales, se suma al cielo como luz: más intensa hacia el horizonte, donde el aire bajo devuelve más, y dibujada con el blanco cálido de una lámpara de 3000 K. Ahoga la Vía Láctea y la luz zodiacal, y quita estrellas, por la diferencia en la estrella más débil que un ojo distingue (Crumey 2014): unas dos magnitudes a 19. La Luna ahora hace lo mismo. "derived" cuando se consulta en el atlas, "stated" cuando el observador lo midió. El editor lo rellena a partir del atlas para una observación de 2015 en adelante, como "derived" con el atlas nombrado, y nunca reemplaza una cifra escrita a mano; antes de 2015 no consulta nada, porque el cielo era más oscuro que el del atlas |
observerMap | Si el mapa de dónde estaba el observador empieza abierto cuando se reproduce o edita la grabación: true o false. Si falta, decide el reproductor: abierto para un observador que se desplazó, cerrado para uno que se quedó en su sitio. Una página que integra el reproductor tiene la última palabra (su atributo show-observer-map). El editor lo escribe cuando se abre o se cierra el mapa en él, para que un lector vea lo que el autor dejó |
soundTrack | { keyframes: [{ t, sound }] } — kind (none/hum/whistle/rumble/crackle), volume, pitchHz, y un src opcional de una grabación real. volume y pitchHz se deslizan entre fotogramas clave, kind y src cambian en el fotograma clave. Un src en otro sitio debe servirse a cualquier origen (CORS) |
references | Imágenes del lugar superpuestas a la escena: src (una dirección, o una URL data: para una imagen añadida desde un disco), kind (photo/panorama), registration (headingDeg, pitchDeg, rollDeg, fovDeg), opacity, credit/creditUrl, t y drawing opcionales, from ({ lat, lng }, desde dónde se tomó: el reproductor la desvanece a medida que el observador se aleja de ese punto; si falta, nunca se desvanece), y los landmarks con los que se alineó (id, label, picture como { u, v } desde la esquina superior izquierda, scene como { azimuthDeg, altitudeDeg }) |
traces | Lo que un investigador dibujó sobre el lugar, importado de su archivo de Google Earth (KML o KMZ) y mostrado sobre la escena como suyo, nunca como parte de la reconstrucción: [{ id, title, kind, points, altitude, color, source }], siendo kind point, line o polygon, points los vértices como [{ lat, lng, altM }] tal como los tenía el archivo, altitude cómo se lee altM (ground, por defecto, relative al suelo bajo cada punto, o absolute sobre el nivel del mar), color un #rrggbb y source de quién es |
instrument, exposureSeconds | A través de qué se observó, y cuánto tiempo estuvo abierto el obturador. Si falta, el ojo desnudo. instrument es uno de eye, rectilinear-lens (una cámara de marca desconocida), roamer-1-120, instamatic-126, slr-35mm-50, slr-35mm-zoom, phone-landscape, phone-portrait; exposureSeconds es un valor para toda la grabación, limitado al rango propio de ese aparato |
iso | La sensibilidad de la película o del sensor con que se tomó la imagen, cuando se conoce: 400 para una película de 400 ISO. Si falta, la del propio aparato (el negativo en color de una réflex es 100, el de una Instamatic 64). La imagen de una cámara no responde como la de un ojo: una película no se adapta al cielo, recibe una exposición — la luz, por el tiempo de obturación, dividida por el cuadrado del número f — y responde a ella con su propia curva (la suave de un negativo, la más abrupta de una diapositiva, la línea recta de un sensor que se detiene en el blanco). Así, una pose nocturna sale con un cielo negro y lo que brillaba en él destacando |
sway | Cuánto mueve la vista el cuerpo que sostiene el instrumento cuando no camina: 1 para una persona de pie o sentada, 0 para una cámara sobre trípode, cualquier valor intermedio o superior para menos o más. Si falta, 1 — salvo para un observador que el relato dice que quedó paralizado (etiqueta paralysis), para quien es 0, y para una exposición de más de medio segundo, que ninguna mano sostiene inmóvil: eso es un trípode, y también 0 |
vehicle | El vehículo en el que iba el observador, cuando el decorado no lo dibuja: { kind, windowsOpen, noise }, siendo kind car, van, truck, motorcycle o generic. Oído desde dentro: su motor sigue el propio trayecto del observador — la marcha según la velocidad, las revoluciones según la marcha, el esfuerzo según acelere o frene — con la rodadura y el viento, amortiguados por un habitáculo cerrado, dejados entrar por ventanillas abiertas; noise es su sonoridad frente a uno corriente de su tipo (1 por defecto). Es también lo que mantiene activo el botón de sonido del reproductor cuando el archivo no tiene soundTrack: el botón responde de todo lo que reproduce la escena — este motor, un engine del decorado, la lluvia y el viento — y no solo de la pista |
decor | Decorado a unos eastM/northM reales del observador: edificios (con floors, windows), árboles, arbustos, farolas, vehículos, puentes, líneas aéreas, otros observadores, aeronaves — opcionalmente con una track y lights cuyo pattern lleva una cadencia de destellos real. Véase más abajo |
Un elemento del decorado se expresa en metros, como todo lo que no es el fenómeno:
| Campo | Significado |
|---|---|
eastM, northM, headingDeg | Dónde está respecto al observador, y hacia dónde mira su frente, en sentido horario desde el norte verdadero |
sizeM | { widthM, lengthM, heightM } a lo largo de sus propios ejes, siendo la longitud el sentido hacia el que mira. Cada eje es opcional: uno que nadie midió conserva la proporción propia de la forma integrada |
model | Un modelo 3D real en lugar de la forma integrada: una entrada del catálogo por id, o un archivo glTF/GLB en url (que prevalece, debe poder leerse desde cualquier origen, y entonces necesita su credit; una relativa se lee desde el archivo que la indica). Nunca decide el tamaño: se escala, conservando sus proporciones, al primer eje medido entre longitud, altura y anchura, o al tamaño real que le da el catálogo. Visto desde dentro, y siempre que no se pueda obtener el modelo, se dibuja en su lugar la forma integrada headingOffsetDeg gira el modelo cargado sobre su eje vertical para que su morro apunte hacia donde la escena lo espera (0 mira al norte con un rumbo de 0); una entrada del catálogo trae el suyo. credit es { title, author, license, sourceUrl }: license tal como la enuncia su autor ("CC BY 4.0") y sourceUrl de dónde viene, para que la afirmación sea verificable. |
bridge | Para un "bridge": cómo está construido. sizeM.lengthM es toda su longitud a lo largo de la carretera, terraplenes incluidos, widthM la anchura del tablero y heightM la altura de la calzada sobre el tablero por encima del suelo; spanM es la luz libre bajo el tablero, discurriendo la carretera sobre un terraplén de tierra que desciende hasta el suelo a cada lado; deckThicknessM el espesor de la losa (1,2 por defecto); railing { heightM, postSpacingM, rails } la barandilla de ambos bordes, postes y barras cuyas aberturas son rectángulos (1,05 m, 1,5 m y 2 barras por defecto). Dibujado con esas medidas, nunca estirado |
wire | Para un "wire" (una línea eléctrica o telefónica): sizeM.lengthM es el vano entre sus postes, a lo largo de su headingDeg, y heightM la altura del cable más bajo; strands [{ heightM, acrossM }] cuelga varios (los superpuestos comparten un acrossM, los de una cruceta difieren); poles es both (por defecto), start o end (el extremo del que se aleja su rumbo o hacia el que apunta: el otro está anclado a un edificio) o none; diameterM (8 mm por defecto) y poleHeightM (medio metro sobre el cable más alto). Recta, sin flecha, y dibujada a esas medidas, nunca estirada |
track | [{ t, eastM, northM, altitudeM, headingDeg }] cuando se mueve, altitudeM por encima del observador. La posición se interpola entre fotogramas clave; el rumbo se mantiene de uno al siguiente |
lights | Sus luces: id, offsetM { x, y, z } desde su centro (derecha, arriba, delante), color, intensity (1 es una luz de navegación corriente) y un pattern: { "kind": "steady" }, o { "kind": "flash", perMinute, dutyCycle, phase }, la cadencia tal como la establecen los reglamentos, la fracción encendida de cada ciclo (cerca de 0,5 para un intermitente de filamento, 0,01 para un estroboscopio) y un desfase de 0 a 1 entre luces. El editor las rellena a partir de ajustes predefinidos: “Avión de pasajeros”, “Helicóptero”, “Coche, faros encendidos”, “Coche, luces de emergencia”, “Rotativos de vehículo de emergencia”, “Farola” |
engine | Un vehículo que se oye en marcha: { kind, noise }, como vehicle más arriba. Su motor sigue su propia track, oído desde donde está el observador, más débil y apagado con la distancia |
occludesSourceIds | Los fenómenos delante de los cuales el observador dijo que estaba — véanse las reglas más abajo |
facade | Solo el tipo building: { color?, plain? }. color es el muro, "#rrggbb"; salvo que plain sea true, se dibujan ventanas en cada planta y una puerta en la planta baja de la cara frontal. Se dibuja al sizeM enunciado (deben estarlo los tres lados), nunca estirada, y no para un edificio con un observador dentro. El editor toma el color del material que el mapa enuncia para los muros (piedra, ladrillo, hormigón, bloque, madera), o un enlucido donde no enuncia ninguno. Ausente es la caja lisa. |
roof | Solo el tipo building: { shape, riseM, color?, ridge? }. shape es "flat" (la caja), "gable" (dos vertientes hasta una cumbrera a lo largo del lado mayor, o de la profundidad con ridge: "depth") o "hip" (cuatro vertientes); riseM es lo que la cumbrera sube sobre el alero, así que los muros miden sizeM.heightM menos eso; color es el tejado visto desde arriba, "#rrggbb". El editor los lee del láser y de la foto aérea del levantamiento. Ausente es un tejado plano del color de los muros. |
origin | El levantamiento del que se tomó este objeto, por el id de su proveedor ("ign-lidar-topo"), cuando el editor lo tomó del levantamiento del lugar y el autor no lo colocó a mano: un árbol, un edificio, un puente o un vano de línea. Elegir otro levantamiento, o ninguno, u otro lugar, sustituye o quita lo que lleva un origin, y nunca lo que no lo lleva |
surveyedOn | El día (AAAA-MM-DD) del levantamiento más reciente del que se extrajo este objeto, cuando viene de uno (véase origin): el editor advierte cuando es posterior a la observación. |
lit, litKeyframes | Si la lámpara de una farola o los faros de un vehículo están encendidos. litKeyframes es [{ t, lit }], ordenado por t, para una luz que se enciende o se apaga durante la grabación; sin él, lit vale para toda la duración. Se ignora en un edificio, un árbol o un observador |
observerSide, observerFacing, observerKeyframes, occupiedFloor | El observador dentro del objeto, para un building o un vehículo (solo un objeto a la vez lo contiene). observerSide dice dónde está: front, behind, left, right, front-left, front-right, behind-left o behind-right, estando el ocupante de un vehículo en una de sus cuatro puertas. observerFacing es la ventana por la que mira cuando no es la de su asiento: un conductor se sienta en front-left y mira por el parabrisas, front. observerKeyframes, [{ t, side, facing }], dice dónde se sienta a lo largo del tiempo, cada uno mantenido hasta el siguiente, y un fotograma sin side significa fuera a partir de entonces, como un conductor que se baja. occupiedFloor es la planta de un edificio en la que está, de 0 (planta baja) a floors |
modelParameters | Los ajustes del modelo con el que se dibuja el objeto, por la clave con que la entrada del catálogo publica cada uno: { "costumeColor": "#5a6b3a" } para la ropa de una persona, foliageColor para un árbol, hullColor para una nave, gearUp para un avión de línea en vuelo. Un modelo trae los suyos (el editor dibuja un campo para cada uno); un objeto dibujado como forma integrada no tiene ninguno, se pinta con color |
sightingUrl | Para un observer: la dirección de la grabación propia de ese observador, cuando se conoce, para que el menú de la escena pueda ofrecer ver su testimonio |
Lo que era: interpretaciones#
Una grabación expresa ángulos, y un cuerpo en metros nunca forma parte de lo que se vio. Es una
afirmación sobre ello, y se pone a prueba colocándola en la escena y mirándola desde donde
estaba el observador: proyecta su sombra, el suelo puede ocultarla, y su contorno se mide
en cada instante frente a lo que dijo el observador. Una interpretación se muestra sola, como el
mundo que afirma; si se pide comparar (el botón ◌, o compare-account en
<rr0-sighting>), el reproductor dibuja a su lado todo lo que vio el observador como
contornos discontinuos e indica cuánto se desvía la dirección y cuántas veces más ancho y más alto
parece cada cuerpo, en rojo cuando un observador no podría haberse equivocado tanto.
La lectura del propio observador va en la grabación, como interpretation. La de otro no está en el relato: es otra observación, listada en el caso (véase abajo). Un relato cuyo observador dijo lo que
era se dibuja en volumen, como lo dijo; uno que no dice nada en metros se dibuja como los
ángulos que expresa. El reproductor lo ofrece, junto con la interpretación de cada analista, una cada vez.
{
"interpretation": {
"title": "Una nave posada sobre sus patas",
"bodies": [{
"id": "craft",
"explains": ["ufo-1"],
"model": { "id": "ellipsoid" },
"track": [
{ "t": 52000, "eastM": -571.6, "northM": -965.5, "onGround": true,
"sizeM": { "widthM": 3.36, "lengthM": 3.36, "heightM": 1.73 },
"appearance": { "color": "#e8e6df", "albedo": 0.7 } },
{ "t": 83000, "azimuthDeg": 195.9, "altitudeDeg": 4.1, "distanceM": 44 }
]
}]
}
}
| Campo | Significado |
|---|---|
explains | Los sourceId de los fenómenos que este cuerpo afirma ser |
model | Una forma construida aquí (ellipsoid, sphere, disc, cylinder, cone, box, torus, figure), un modelo del catálogo por id, o un archivo glTF en url con su credit; una url relativa se lee desde el archivo que la indica, no desde la página. Estirado a sizeM sea cual sea headingOffsetDeg y credit ({ title, author, license, sourceUrl }) son los del modelo de un objeto del decorado. |
track | Dónde está y qué aspecto tiene en cada t. Una posición se expresa o bien en el mundo (eastM/northM desde donde estaba el observador al inicio, como el decorado, con onGround o altitudeAboveGroundM) o bien desde el observador en ese instante (azimuthDeg, altitudeDeg, distanceM). Un cuerpo onGround se apoya en el relieve; una dirección sin distancia se encuentra entonces con el suelo donde lo hace esa línea. sizeM, attitude (headingDeg, pitchDeg, rollDeg) y appearance (color, albedo, luminanceCdM2, transparency de 0 a 1, haloScale como múltiplo del deslumbramiento de su luz propia) se mantienen hasta que un fotograma clave posterior los vuelve a indicar, y se mezclan entre dos fotogramas clave. present: false saca el cuerpo de la escena a partir de ese fotograma clave, y present: true lo devuelve. Una flame (lengthM, widthM, color en la tobera, tipColor, luminanceCdM2) se enciende en el fotograma clave que la indica, sale del nodo del modelo llamado exhaust (o del que nombre su node), ilumina lo que la rodea, levanta polvo donde toca el suelo cuando raisesDust lo indica, y se apaga con una luminanceCdM2 de 0 |
motions | En un fotograma clave: cuánto ha avanzado cada uno de los movimientos propios de su modelo, por el nombre del movimiento — las animaciones del archivo glTF. 0 es el inicio de un movimiento, 1 su final, y uno que se repite sigue más allá de 1: { "legs-turn": 7 } son siete vueltas. El modelo dice qué se mueve y cómo; la pista dice cuándo. Cada movimiento se interpola entre los fotogramas clave que lo indican, sean cuales sean los demás fotogramas clave que muevan el cuerpo entretanto, se mantiene tras el último y vale 0 antes del primero. La partida de Valensole se escribe así: { "t": 246000, "motions": { "pivot-retract": 0 } }, { "t": 248000, "motions": { "pivot-retract": 1, "legs-turn": 0 } }, … { "t": 262000, "motions": { "legs-turn": 7 } } |
lights | En un fotograma clave: la luminancia, en cd/m², de cada una de las luces propias de su modelo, por el nombre del material de la luz en el archivo glTF — para que un mismo cuerpo lleve luces que hacen cada una lo suyo, una blanca fija en cada extremo y una roja que destella entre ambas. El modelo dice dónde está cada luz, su tamaño y su color; la pista dice cuánto brilla y cuándo. Cada luz se interpola entre los fotogramas clave que la nombran y se mantiene tras el último, así que un encendido o apagado son dos fotogramas clave separados por un milisegundo; una luz que ningún fotograma clave nombra brilla con su parte de appearance.luminanceCdM2. Una luz demasiado pequeña para verse se ve por su deslumbramiento, y lo que se interponga entre ella y el ojo — el propio casco del cuerpo, un puente — la oculta. La luz roja de Silly-le-Long: { "t": 499, "lights": { "front-red": 1500 } }, { "t": 500, "lights": { "front-red": 0 } } |
outlineNode | El nodo del modelo que es lo que dibujó el observador ("hull" para una nave cuyas patas no están en el dibujo): aquello por lo que se mide su contorno |
smoke | En la propia interpretación: lo que hace arder en el suelo, como { eastM, northM, fromT, untilT? }, visto por su humo arrastrado por el viento de la grabación halfLifeS dice a qué velocidad decae, en segundos hasta perder la mitad de su espesor (20 por defecto): un fuego de matorral llamea y luego arde sin llama. Nunca se detiene del todo antes de untilT. |
reentries | En la propia interpretación: las reentradas atmosféricas que afirma que se vieron, un satélite o una etapa de cohete que se desintegra en pedazos que arden. No son cuerpos: una reentrada arde entre 70 y 100 km de altura y se ve a cientos de kilómetros, así que se sitúa sobre la Tierra y se ve a través de su curvatura desde donde estaba el observador. Su track da el punto de cabeza en instantes de la grabación, { t, lat, lng, altitudeKm }, unidos por círculos máximos; cada uno de sus fragments sigue el mismo camino lagS segundos detrás, se ve desde fromT hasta apagarse en untilT, brilla con su absoluteMagnitude (a 100 km, como un bólido) llevada a su distancia real, en su color, con una estela de los últimos trainS segundos de su camino. Su luz es propia: se ve tanto si el Sol la alcanza como si no. object nombra lo que cayó (name, cosparId, norad). Nada se propaga desde elementos orbitales, errados en minutos en la última órbita: el camino es lo que establecen las fuentes, con su procedencia |
launches | En la propia interpretación: los lanzamientos de cohete cuyo escape afirma que se vio, iluminado por un Sol que se puso para el suelo pero no para la estela, la «medusa espacial». Situados sobre la Tierra como una reentrada: su track da la etapa en instantes de la grabación, { t, lat, lng, altitudeKm } (puede empezar antes que la grabación), y burnFromT y burnUntilT los segundos en que el motor ardió. La estela es una fila de bocanadas soltadas a lo largo de ese camino, cada una expandiéndose con la edad; lo que se ve de cada una es la luz del Sol que difunde hacia el observador. La sombra de la Tierra (dónde el Sol ilumina o no a la altura de la bocanada, y cuánto aire rozó su luz, lo que la enrojece o azulea), el ángulo de difusión y la expansión se calculan con el Sol real en la fecha real: nada se declara de ellos. Un plume opcional sustituye los valores por defecto: exhaustKgPerS (273, un Merlin Vacuum), condensedShare (0,1, el único número que nadie ha medido), particleRadiusUm, expansionKmPerS, initialRadiusKm, lifetimeS, y para el collar (el escape recién soltado, ancho y pronto desaparecido, junto a la estela estrecha que queda) collarShare (0,85), collarExpansionKmPerS (2,5), collarLifetimeS (20). vehicle nombra lo que voló y, en engine, el motor cuyo escape es: thrustKN y specificImpulseS (de los que se deducen el caudal de escape y su velocidad, y con ellos lo ancho del collar) y propellant (rp1-lox, methane-lox, hydrogen-lox, hypergolic o solid, que dice qué parte se vuelve partículas y de qué tamaño). Lo que dice plume prevalece sobre lo que dice el motor. La estela necesita la fecha de la grabación: sin ella no hay Sol que la ilumine vehicle.mission nombra la misión que cumplía ("Starlink Group 10-49"). |
Otra lectura: una interpretación es otra observación#
La lectura que otro hace de un relato (la de un analista, de un investigador, una comparación hecha para
ponerla a prueba) no forma parte del relato: es otra observación, la que ocurrió tal como la sostiene su autor.
Por eso se lista en el caso como el original, como un evento de tipo sighting, marcado como lectura
con interpretationOf, y tiene una grabación propia en url:
{
"id": "McMinnville1950",
"events": [
{ "type": "event", "eventType": "sighting", "id": "trent", "title": "Paul Trent", "url": "observer-mcminnville.json" },
{ "type": "event", "eventType": "sighting",
"interpretationOf": "trent",
"time": "2013-06",
"by": [{ "people": "CousynAntoine" }, { "people": "LouangeFrancois" }],
"title": "A model on a thread under the line",
"url": "interpretation-mcminnville-2.json" }
]
}
| Campo | Significado |
|---|---|
interpretationOf | El id del evento del caso del que es lectura ("trent"), o una lista de ids cuando una lectura sirve a varios relatos (las fotografías y un primer plano). Lo que la distingue de un relato: los eventos sin este campo son los observadores del caso |
time | Cuándo se elaboró la interpretación, como RR0 escribe un tiempo ("2013-06"): no cuándo ocurrió la observación |
by | Quién la sostiene: { "people": id } o { "org": id }, que nombran una entrada que vive en otro sitio (en RR0, un directorio de personas u organizaciones), o una persona descrita en el valor. Ausente en una comparación que nadie sostiene |
title | Cómo se llama la lectura en el menú del reproductor y el selector del editor: unas palabras, una cadena o una por idioma |
url | Su grabación, leída relativa a la dirección del archivo del caso, como la de un observador |
La grabación en url es una grabación como las demás. Comparte el lugar, la hora y la pose del observador
del relato que lee, de modo que un cuerpo situado desde el observador, o en metros desde donde estaba, significa lo
mismo en ambas; no dibuja ninguna forma (una timeline vacía); y guarda los cuerpos en su propia
interpretation, descrita arriba. El explains de un cuerpo nombra las formas del relato.
{
"version": 1,
"id": "1950-05-11-TrentPaul-interpretation-2",
"time": { "year": 1950, "month": 5, "day": 11, "hour": 19, "minute": 45 },
"utcOffsetHours": -7,
"place": [{ "value": { "lat": 45.104167, "lng": -123.330556 } }],
"observerTrack": { "keyframes": [{ "t": 0, "pose": { "lat": 45.104167, "lng": -123.330556, "headingDeg": 41.3, "pitchDeg": 14.85, "fovDeg": 33.4 } }] },
"tags": ["interpretation"],
"timeline": { "keyframes": [], "order": [], "groups": [] },
"interpretation": {
"title": "A model on a thread under the line",
"bodies": [{
"id": "model",
"explains": ["ufo-1"],
"model": { "id": "disc" },
"track": [
{ "t": 0, "eastM": -52, "northM": 118, "altitudeAboveGroundM": 7.5,
"sizeM": { "widthM": 0.3, "lengthM": 0.3, "heightM": 0.1 } }
]
}]
}
}
El reproductor lista los observadores del caso a partir de los eventos sin interpretationOf y ofrece
cada lectura junto al relato que nombra, una cada vez (el botón ◌ la mide contra el relato). Una grabación sola no
tiene más lectura que su propia interpretation. La forma antigua, un evento de tipo
interpretation que nombra la grabación en sighting con sus cuerpos en línea o en un
archivo en url, se sigue leyendo. El editor abre un caso: su selector sobre el render lista los
relatos y las lecturas, cada uno abriéndose como la grabación que es, con un botón para añadir una lectura (una
grabación nueva que comparte el lugar, la hora y la pose del relato, y un evento para ella), otro para eliminarla,
y otro para exportar el caso y cada grabación añadida o modificada en un zip. Pruébalo con
case-mcminnville.json
(reproducirlo,
editarlo).
El tiempo, y sus nubes#
Un fotograma clave weather expresa las condiciones del cielo en un momento del reloj
de la grabación; entre dos fotogramas clave cada número se interpola, y el tipo de precipitación y la
tormenta se mantienen. Contiene:
| Campo | Significado |
|---|---|
cloudLayers | Las nubes, como una lista de capas — véase más abajo. Si falta, las describen los campos antiguos de las filas vecinas, adaptados a una capa de agua y un velo de cirros; una lista vacía significa un cielo despejado que alguien miró |
cloudCover, lowerCloudCover, highCloudCover | Fracciones de cielo (0–1): el total, solo las capas de agua, y solo el velo helado. Escritas por grabaciones hechas antes de que hubiera capas, y que el editor sigue manteniendo al día como resumen de ellas |
cloudBaseM, cloudDarkness | La base única de esa misma época, en metros sobre el suelo de referencia, y un tono único (0 blanco, 1 muy oscuro) |
iceCrystalAlignment | 0–1, con qué regularidad caían los cristales de hielo — lo que convierte un simple anillo en parhelios, arcos y un pilar. Ningún registro lo mide; una capa de cirros lleva el suyo |
relativeHumidity | 0–1, cerca del suelo. Decide lo lechoso que es el cielo despejado: la bruma se hincha de agua a medida que el aire se acerca a la saturación. Un registro consultado la trae (a partir de la temperatura y el punto de rocío de ERA5); si falta, una bruma típica |
precipitationType, precipitationIntensity | none/rain/snow/hail, y 0–1. Indicada en un fotograma clave, reproducida como cae: un chubasco empieza en el fotograma clave que lo inicia con sus primeras gotas, y no alcanza la intensidad indicada más deprisa que una lluvia real (de nada a lo más fuerte en veinte segundos); se detiene del mismo modo. Un cambio que los fotogramas clave reparten en más tiempo se sigue tal cual precipitationAmount (0–1, ausente significa toda) dice qué parte de esa precipitación cae ya. |
windDirectionDeg, windSpeed | El viento general: el rumbo HACIA el que sopla, en sentido horario desde el norte, y metros por segundo. Es lo que arrastra las nubes — desde el instante cero, de modo que buscar y volver a reproducir dan el mismo cielo |
storm | Relámpagos y truenos, con el retraso correcto |
Cada capa de cloudLayers es un manto de nubes a una altura real,
y sigue siendo ella misma de un fotograma clave al siguiente:
| Campo | Significado |
|---|---|
id | Estable entre fotogramas clave — las capas se emparejan por él, nunca por su posición en la lista. Una capa presente en un fotograma clave y ausente del siguiente se desvanece; reordenarlas no cambia nada |
type | cumulus, stratus, stratocumulus, cirrus o unknown. Decide la forma de las cimas y lo fino que es el velo; un cirro es además el que refracta los halos. Cambia en el fotograma clave, no se interpola |
baseM, thicknessM | Metros. La base está sobre el suelo de REFERENCIA de la grabación, no sobre un observador que sube; un observador por encima de la base está dentro del manto o sobre él, y el cielo se dibuja en consecuencia |
coverage | 0–1, y significa lo que dice: la fracción del cielo que cubre esta capa, sea cual sea el tamaño de sus nubes |
sizeM | La anchura característica de una nube, en metros. Independiente de la cobertura: la misma fracción de cielo puede ser muchas nubes pequeñas o unas pocas grandes |
density | 0–2, lo opaca que es la materia de la nube; 0 es transparente. También independiente de la cobertura |
darkness | De 0 blanco a 1 muy oscuro. Si falta, el cloudDarkness del fotograma clave |
seed | Qué patrón, de entre los infinitos que los mismos números pueden dibujar. Si falta, uno derivado del id, y por eso el id no debe cambiar |
windDirectionDeg, windSpeed | El viento propio de esta capa, cuando difiere del general — la capa alta suele hacerlo. Si falta, el viento general |
iceCrystalAlignment | Solo para un cirro |
instances | Nubes individuales dentro de esta capa — véase más abajo |
Una nube individual en instances es una nube de su capa que el
archivo sitúa con exactitud, porque el relato lo hizo: aquella tras la que pasó el fenómeno, la que
estaba allí y en ningún otro sitio. Se dibuja como una más de su capa — la misma textura, el mismo
umbral —, sin distinguirse de sus vecinas más que por dónde está y lo grande que es,
y está ahí incluso cuando la coverage de la capa es nula. Se desplaza con el viento de
la capa como las demás, y oculta un fenómeno ante el que pasa.
| Campo | Significado |
|---|---|
id | Estable entre fotogramas clave, misma regla que para una capa |
eastM, northM | Dónde estaba su centro en el instante cero, en metros desde el punto de partida del observador. El viento la arrastra desde allí |
baseM, thicknessM | Su propia base y su propia altura, en metros — una nube puede estar más baja o alzarse más que su manto |
widthM, depthM, rotationDeg | Su huella, en metros, y el rumbo hacia el que está girada esa huella |
density, darkness | Las suyas propias; si falta la oscuridad, la de la capa |
{
"weather": {
"cloudLayers": [
{
"id": "low", "type": "cumulus",
"baseM": 1500, "thicknessM": 800,
"coverage": 0.55, "sizeM": 1400, "density": 1, "darkness": 0.15,
"instances": [
{ "id": "the-one", "eastM": 0, "northM": 4200,
"baseM": 1500, "thicknessM": 800,
"widthM": 1900, "depthM": 1300, "rotationDeg": 12, "density": 1 }
]
},
{ "id": "high", "type": "cirrus", "baseM": 8000, "thicknessM": 400,
"coverage": 0.2, "sizeM": 2200, "density": 0.35, "iceCrystalAlignment": 0.65 }
],
"precipitationType": "none", "precipitationIntensity": 0,
"windDirectionDeg": 90, "windSpeed": 5, "storm": false
}
}
Una grabación cuyo tiempo fue consultado (tiene un weatherSource)
guarda la respuesta del registro, no un enlace a él: ERA5 da las bandas baja, media y alta como tres
capas llamadas record-low, record-mid y record-high, la
base baja estimada a partir de la diferencia entre temperatura y punto de rocío, las otras dos a 3 500 m
y 8 000 m. Su tipo es unknown (cirro para la alta), su tamaño y su densidad
son supuestos de dibujo: un reanálisis sabe qué parte de cada banda estaba cubierta, no qué aspecto
tenían las nubes. Vuelve a pedir el registro desde el editor y las capas se reescriben; edita
una capa a mano y la grabación pasa a ser del autor, y la fuente se elimina.
De dónde viene cada valor#
Cualquier valor de una grabación puede escribirse tal cual, o envuelto con su procedencia:
{
"durationSeconds": {
"value": 15,
"basis": "derived",
"rationale": "De 13 a 18 s en la síntesis del investigador; se toma el punto medio"
}
}
basis es stated (lo dijo el observador, y es lo que significa un valor
sin envolver), derived (deducido de lo que dijo más algo comprobable: la anchura de una
carretera, un mapa, un dibujo medido; rationale da el razonamiento) o
assumed (elegido para que la reconstrucción tenga un valor, sin base en nada de lo que
dijo el observador). La lista de valores assumed es la lista de lo que hay que volver a
preguntar al observador o buscar en el expediente, y por eso vale la pena escribirla incluso cuando no se escribe nada más.
Comprobar un archivo#
El formato se publica también como JSON Schema, generado a partir de los mismos tipos que el reproductor: todas las claves que conoce, lo que puede contener cada una, y las palabras que acepta una lista cerrada. Una clave mal escrita o un valor desconocido no lo superan. No dice nada de lo que puede omitirse, que es una cuestión de sentido que responde esta página. Para ver el resultado, abre el archivo en el reproductor, desde un enlace, o desde tu disco con las imágenes y los modelos que nombra. El reproductor lo comprueba del mismo modo al cargar, e indica tras un ⚠ sobre la imagen lo que no pudo reproducir tal como está escrito: una clave que nada lee, una palabra fuera de su lista, y lo que tuvo que inventar porque el primer fotograma clave de una forma lo omitía (un campo mantenido desde el fotograma clave anterior es la regla de arriba, no un problema).
Un archivo completo#
La grabación más pequeña que aún expresa algo — un óvalo silencioso que cruza el cielo en doce segundos, en una fecha real y en un lugar real. Todo lo demás del formato es opcional, y todo lo que sigue cumple una función:
{
"version": 1,
"description": "The smallest recording that still states something: one silent orange oval, a degree and a half wide, crossing the south-western sky from left to right over twelve seconds.",
"time": { "year": 2024, "month": 8, "day": 12, "hour": 22, "minute": 30 },
"durationSeconds": 12,
"utcOffsetHours": 2,
"place": [{ "lat": 45.19, "lng": 5.72, "name": "Grenoble, Isère, France" }],
"timeline": {
"keyframes": [
{
"t": 0,
"shapes": [
{
"sourceId": "ufo-1",
"shape": {
"kind": "oval",
"bounds": { "x": 150, "y": 150, "width": 10, "height": 3 },
"angular": { "widthDeg": 1.6, "heightDeg": 0.5 },
"color": "#ff8c1a",
"angle": 0,
"transparency": 0,
"haloScale": 1.2,
"selected": false
}
}
]
},
{
"t": 12000,
"shapes": [
{
"sourceId": "ufo-1",
"shape": {
"kind": "oval",
"bounds": { "x": 480, "y": 130, "width": 10, "height": 3 },
"angular": { "widthDeg": 1.6, "heightDeg": 0.5 },
"color": "#ff8c1a",
"angle": 0,
"transparency": 0,
"haloScale": 1.2,
"selected": false
}
}
]
}
]
},
"observerTrack": {
"keyframes": [
{
"t": 0,
"pose": { "lat": 45.19, "lng": 5.72, "elevationM": 0, "headingDeg": 215, "pitchDeg": 20, "fovDeg": 60 }
}
]
},
"soundTrack": { "keyframes": [{ "t": 0, "sound": { "kind": "none", "volume": 0, "pitchHz": 100 } }] }
}
Para modificarlo y verlo reproducirse, pégalo en el editor, que completa cada clave que tiene el formato, ofrece las palabras que acepta cada una, y dice lo que el modelo dice de ella.
Es /demo-data/example-minimal.json
en este sitio, así que puedes descargarlo, y
reproducirlo antes de cambiar
nada. Observa que aparecen tanto angular como bounds: el ángulo es lo que
el archivo SIGNIFICA, y los píxeles se vuelven a derivar de él al cargar — escribe el ángulo, y deja
que se te corrija una estimación errónea de los píxeles.
Otros más grandes para leer#
Cada demo de este sitio es un simple archivo que puedes abrir. Estos cuatro son los que vale la pena leer para ver cómo se construye una grabación real:
| Archivo | Qué mirar en él |
|---|---|
observer-chiles.json | Un caso real: un observador, un id de caso compartido con una segunda grabación, diez fotogramas clave, un weatherTrack consultado con su weatherSource |
sky-test-halos.json | Ningún fenómeno — un cielo preparado por un weatherTrack cuyos fotogramas clave cambian la alineación de los cristales, la cobertura de cirros y un manto de cúmulos, contemplado a través de un observerTrack que recorre el conjunto y luego se detiene |
sky-test-clouds.json | Tres capas de nubes con altitud, espesor, tamaño, densidad y viento en metros, evolucionando en la línea de tiempo meteorológica — y en la primera una entrada instances: una nube del campo, situada y dimensionada en metros, que crece y se oscurece a lo largo de los dos minutos |
sky-test-aircraft.json | Un instrument, un exposureSeconds y un iso, y una aeronave de decor con una track y nueve lights a sus cadencias de destello reales, luces de aterrizaje incluidas |
sky-test-reentry.json | Ningún fenómeno: una interpretation sin cuerpos y con una reentries, el lanzador de Zond 4 desintegrándose sobre Kentucky en 1968, su camino derivado y su horario, alturas y brillo supuestos, cada valor con su procedencia |
sky-test-launch-plume.json | Ningún fenómeno: una interpretation sin cuerpos y con una launches, el escape de Starlink Grupo 10-49 (Falcon 9, 25 de agosto de 2026, 05:33 EDT) iluminado en el crepúsculo y visto desde Hoboken (Nueva Jersey), el camino de la etapa supuesto con su procedencia y la sombra, la expansión y la luz calculadas |
instrument-instamatic.json | El mismo avistamiento que observer-socorro.json, cambiado en un solo campo. Compara los dos |
Cuatro reglas que deciden lo que significa un archivo#
- Los campos discretos se mantienen, los continuos se interpolan. Una forma omitida en
un fotograma clave posterior se queda como estaba, y lo mismo cualquier campo que un fotograma clave omita en una forma
que sí vuelve a indicar: un fotograma clave que solo da un nuevo
aimmueve la forma y conserva todo lo demás (volver a indicarboundssinaimniangularse entiende como moverla por sus píxeles); una cuyo primer fotograma clave está a los cinco segundos ya está pintada, en ese estado, desde cero. Para que algo deje de ser visible, ponle un fotograma clave contransparency: 1. - Solo ángulos. No se guarda en ninguna parte ningún tamaño real ni ninguna distancia real. Los metros
se deducen, como desigualdades, de aquello por detrás o por delante de lo cual se dijo que pasó el fenómeno
(
decor[].occludesSourceIds). - Lo declarado prevalece sobre lo deducido.
occludesSourceIdsregistra afirmaciones del observador. Nada en este formato puede deducirlas: describe una apariencia en un campo de visión, no una posición en el espacio. - Ausente no es cero. Que no haya pista de sonido significa que nadie preguntó;
kind: "none"significa que el observador declaró no haber oído nada. La misma distinción recorre el tiempo y la nube de hielo.
Esta página es la referencia del formato. El razonamiento detrás de cada campo está en los comentarios de documentación de su tipo, con los que completan los extractos de arriba, y en el código fuente.