Les observations
Une observation est ce qu'un témoin rapporte de ce qu'il a vu : quand, où, à quoi cela ressemblait, comment cela bougeait, et ce qu'étaient le ciel et la météo. C'est l'événement qu'UFO@home rejoue. Un dossier en contient au moins une, et peut en contenir d'autres : d'autres témoins du même événement, chacun avec son propre compte rendu, et des explications alternatives, qui sont aussi des observations. Une observation peut être désignée par une interview menée avec le témoin, et y renvoyer en retour.
Partie technique : le fichier d'observation#
Ce qui suit est pour qui écrit ces fichiers à la main, les génère ou les lit en code. Dans l'éditeur, rien de cela n'a besoin d'être connu.
Un enregistrement est un simple fichier JSON. Rien dedans n'est un blob binaire, un identifiant dans une base de données, ni une référence à ce site — vous pouvez en écrire un à la main, en engendrer depuis vos propres archives, ou en comparer deux dans une relecture de code.
Chaque extrait ci-dessous est en lecture seule, et chacun connaît le format : placez le curseur dans un objet et faites Ctrl+Espace (⌥+I sur Mac) pour lister toutes les clés qui pourraient y figurer, avec ce que le modèle dit de chacune.
L'observation#
| Champ | Sens |
|---|---|
version | La version du format : 2 (voir Versions du format) |
id | Quel compte rendu c'est, unique parmi tous les enregistrements : le jour, puis qui l'a vu ("1964-04-24-ZamoraLonnie"), ou le lieu pour un observateur anonyme ("1964-04-24-Socorro"). Ce par quoi un dossier le désigne n'est pas cet id mais celui de son événement (voir plus bas). |
time, endTime | La date écrite en EDTF, à l'heure légale de utcOffsetHours, comme l'écrivent les événements de RR0 : "1964-04-24T17:50", "1954", "1948-07-24T02:45~" (approximative), "2025-06?" (incertaine), "1965-07-01%" (les deux), "19XX" (une année masquée), "2022-21" (le printemps 2022), ou "05:00" seul pour une heure dont on a oublié la date. Chaque partie est facultative en partant de la droite : c'est ainsi que le format énonce « 1954 » ou « vers 05:00 ». C'est un sous-ensemble d'EDTF (niveau 0, ces qualificatifs sur la date entière, années masquées, saisons) ; @rr0/time est le modèle EDTF complet de RR0, dans lequel l'outillage d'UFO@home convertit les dates d'un enregistrement |
durationSeconds | Une alternative à endTime, et c'est elle qui l'emporte si les deux sont là |
durationText | La durée telle qu'elle a été énoncée quand elle n'était pas exacte : une durée ISO 8601 avec un doute (PT10M~) ou une plage (PT5M/PT10M). durationSeconds est alors l'unique durée à laquelle on joue, choisie à partir d'elle |
utcOffsetHours | L'heure LÉGALE de la montre de l'observateur (+1 pour la France en 1965). Absent, elle est approchée depuis la longitude, qui ne peut connaître ni l'heure légale ni un changement d'heure |
timeZone | Le fuseau IANA dont le décalage a été dérivé ("Europe/Paris") : la règle, là où utcOffsetHours est le nombre qu'elle donnait à cette date. Seul le nombre sert à placer le ciel ; le fuseau permet de dériver à nouveau le décalage quand la date change |
place | Où cela s'est passé, comme les événements de RR0 écrivent un lieu (le PlaceJson de @rr0/place) : { name, locations: [{ lat, lng }] }, name étant le nom qualifié depuis lequel les coordonnées ont été résolues |
observer | { id, title, lastName, firstNames }, tous facultatifs ; à omettre entièrement pour un observateur anonyme. id est une référence à la personne (sur RR0, son répertoire : "ZamoraLonnie") ; les autres champs la décrivent quand personne ne lui en a encore donné |
description | Le récit en prose — une chaîne, ou une par langue (voir plus bas) |
image, summary, summaryTime | Ce qui tient lieu de l'observation là où elle n'est que citée, jamais jouée : la carte qu'affiche un lien partagé (voir Partager). image est une image, une adresse (absolue, relative au fichier, ou un chemin RR0 depuis la racine du site) ; summary une phrase ou deux, une chaîne ou une par langue. Absents, la carte montre le logo et dit qui l'a vue, dans quel dossier et quand, pour autant que le fichier le dise. summaryTime est la seconde de l'enregistrement où l'on photographie l'image de la carte (0 par défaut : la première image), pour un enregistrement dont la première image ne montre pas le phénomène ; seul l'outil de capture du projet le lit, jamais le lecteur |
tags | Une liste de chaînes, écrites en anglais : ce sont des termes techniques, et deux enregistrements qui en partagent un doivent s'y égaler. Chaque lecteur les voit dans sa langue lorsqu'une traduction est connue, ce qui est le cas aujourd'hui de landing, trace, aerial observation, project sign, paralysis, contact, occupants, close encounter, photograph, radar, electromagnetic effect. La liste n'est pas fermée : tout autre tag est affiché tel qu'écrit, et les codes de classement ("RR3", "NL") ou les références de dossier ("Blue Book 8729") s'écrivent tels quels. Un seul change le rejeu : paralysis immobilise la vue de l'observateur |
account | Qui l'a vu et comment le récit a circulé : observerAgeYears (à l'époque), observerBirth (date de naissance, tenue en phase avec lui), observerPerception (vision des couleurs, alcool, fatigue : seulement ce qui diffère d'un observateur typique), observerOccupation, source (comment il est parvenu à qui a écrit l'enregistrement : on-site, interview, telephone, questionnaire, letter, social-media, press) et followedUp (si l'observateur a été revu ensuite) |
sources | Où lire le récit tel qu'il a été donné, sous la forme d'une source RR0 : [{ type, title, authors, url, publication: { publisher, time }, index }], type valant book ou article, ou rien pour une page web ou un post, qui n'est alors que son url. Affichées dans le panneau ?du lecteur, en lien quand elles ont une adresse ; reprises telles quelles dans un dossier RR0 |
milestones | Les moments nommés du récit, affichés sur la barre de lecture : [{ t, label, note }], label étant la lettre ou le numéro qu'utilise le récit lui-même ("A", "B") ou deux ou trois mots, note ce qui s'est passé alors, dans les mots du récit si possible (une chaîne, ou une par langue) |
roads | Les routes ou chemins que dessine le plan du récit, quand la carte ne les a pas : [{ id, title, surface, widthM, path, source }], surface valant paved, gravel ou dirt, path étant l'axe en [{ eastM, northM }] depuis le lieu de l'observateur au départ, et source le plan ou le relevé d'où il est tiré |
Plusieurs observateurs : le dossier#
Chaque observateur a son propre enregistrement, et un enregistrement ne dit pas à quel dossier il
appartient : un compte rendu se suffit à lui-même. Ce qui les montre ensemble est le
dossier, qui les désigne :
le case.json d'un dossier RR0, qui énonce le titre,
la date et la classification du dossier, et liste tout ce qui lui est arrivé en
events. Ses événements de type sighting sont ses comptes rendus, chacun
pointant vers l'enregistrement d'un observateur :
{
"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" }
]
}
| Champ | Sens |
|---|---|
id | L'identifiant du dossier lui-même. Sur rr0.org c'est le répertoire du dossier, et il peut être omis ; un fichier de dossier isolé l'énonce |
title, time | Le nom du dossier, et sa date comme RR0 l'écrit ("1948-07-24 02:45", "1954"). Le lecteur nomme un dossier qu'il ouvre par son titre |
events | La chronologie du dossier. Seuls les sighting sont rejoués, chacun par son url, lue relativement à l'adresse du fichier de dossier (si bien que le même dossier marche depuis la page de son dossier comme depuis n'importe où) ; ceux marqués interpretationOf sont des lectures de l'un d'eux (voir plus bas) ; les autres (un article, un film, un aveu) sont ceux de RR0 Un événement porte un id quand une lecture le désigne, et seulement alors : il appartient au dossier, donc il doit être unique parmi les événements du dossier et nulle part ailleurs, et une référence se lit dans le fichier qui l'écrit. Un interpretationOf qu'aucun événement ne porte est lu, comme avant, comme l'id que déclare un enregistrement que le dossier liste ; celui qui ne correspond à aucun des deux est une faute du dossier, que le lecteur signale sur sa console, l'éditeur au-dessus de ses enregistrements, et le validate.py du skill quand on lui donne le fichier du dossier. |
image, summary | Ce que montre un lien partagé vers le dossier, comme pour un enregistrement (voir Partager) : une image, et une phrase ou deux, une chaîne ou une par langue |
Donnez-le à <rr0-sighting src> ou au lecteur, et chaque observateur se choisit
dans une liste. Un enregistrement peut être donné directement, sans dossier, mais un dossier à
un seul compte rendu marche de la même façon et nomme ce qu'il montre. Essayez avec
case-chiles-whitted.json
(le jouer).
Le dire en plusieurs langues#
Un enregistrement se transmet d'un lecteur à un autre : chaque champ écrit par un auteur peut
donc porter une chaîne par langue au lieu d'une seule — description, le
title d'une forme ou d'un élément de décor, le label et la
note d'un repère.
{
"description": {
"fr": "Tout le compte rendu de Lonnie Zamora, d'un seul tenant…",
"en": "Lonnie Zamora's whole account, of a piece…"
}
}
Les clés sont des étiquettes de langue telles qu'un navigateur les donne (fr,
en, pt-BR), et aucune n'est obligatoire. Une chaîne simple reste
parfaitement valide et signifie « dans la langue où cela a été écrit » — ce qu'est tout
enregistrement antérieur. Un lecteur dont aucune langue n'est présente reçoit ce que le
fichier A, plutôt qu'un champ vide : une traduction manquante ne doit jamais transformer ce
qu'un observateur a dit en ce qu'il n'a pas dit.
La langue reçue est celle du navigateur, sauf si la page en dit autre chose : un
lang sur l'élément lui-même, ou sur ce qui l'entoure, est pris d'abord — un
article qui déclare sa langue a déjà énoncé dans quelle langue son lecteur le lit. La liste du
navigateur vient ensuite : déclarer une langue force donc un choix sans jeter les autres.
L'éditeur montre une langue, celle du lecteur, et n'écrit que dans celle-là — ouvrir le fichier dans l'autre langue et taper est donc la façon d'ajouter une traduction, et un auteur ne peut pas effacer celle d'un autre.
Ce qui a été vu#
timeline.keyframes est une liste de { t, shapes }, t en
millisecondes depuis le début. Chaque forme porte un sourceId — plusieurs formes
peuvent partager une chronologie (le phénomène, une flamme qui traîne, une seconde lumière) — et
une 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": "le phénomène",
"angular": { "widthDeg": 1.2, "heightDeg": 0.4 },
"aim": { "azimuthDeg": 353.6, "altitudeDeg": 0.6 }
}
| Champ | Sens |
|---|---|
kind | oval, ou polygon, qui prend alors aussi points : [{ x, y }] en pixels depuis le coin haut gauche de bounds, couvrant sa largeur et sa hauteur, pour que le contour s'étire avec lui quand l'angle redimensionne la boîte. Quand bounds est omis (le cas courant : il est déduit de aim et angular), écrire points en FRACTIONS de la boîte, de 0 à 1, et non en pixels |
title | Son nom, affiché au survol ; une chaîne, ou une par langue |
color | N'importe quelle couleur CSS |
angle | Son inclinaison, en radians autour de son propre centre, positive dans le sens horaire à l'écran |
transparency | De 0 opaque à 1 invisible |
haloScale | La lueur autour ; 0 pour aucune |
brightness | L'éblouissement : un voile, les aigrettes du diaphragme, un cœur saturé au blanc |
blur | À quel point l'observateur a dit les contours indistincts |
angular | Sa taille apparente en degrés — voir plus bas |
aim | Où il était dans le ciel de l'observateur : la direction de son centre, azimuthDeg dans le sens horaire depuis le nord vrai et altitudeDeg au-dessus de l'horizon. Pas la direction où regardait l'observateur, qui est le headingDeg et le pitchDeg de la pose — voir plus bas |
aim le place, angular le dimensionne.
bounds est la projection des deux sur le canevas fixe de 640×360, au cap et au
champ de la pose, à travers l'instrument de l'enregistrement ; il est redérivé au chargement, si
bien qu'un fichier survit à un changement de canevas, de champ, d'instrument, ou de direction
du regard. Si les pixels et les angles divergent, les angles gagnent : déplacer
bounds dans un fichier ne fait rien tant que aim est là. Un fichier
écrit à la main peut omettre bounds entièrement.
timeline.order est l'ordre de tracé de l'arrière vers l'avant,
timeline.groups les identifiants groupés. Les deux sont facultatifs.
Tout ce qu'il y a autour#
| Champ | Sens |
|---|---|
observerTrack | { keyframes: [{ t, pose }] } — pose porte lat, lng, elevationM (au-dessus du sol local), headingDeg, pitchDeg, rollDeg, fovDeg, et pour un appareil fNumber et focusDistanceM. Joué comme une personne bouge : exactement la pose énoncée à chaque keyframe, et entre elles un mouvement qui prend de la vitesse, la garde à travers les keyframes qui continuent de bouger, et ralentit avant une pause — deux keyframes au même endroit, ou au même cap. Un regard part et s'arrête immobile ; une marche ou un trajet déjà engagés à la première keyframe continuent. S'arrêter et repartir à pied ajoutent leur secousse, un hochement de tête amorti en une seconde et demie, qui passe dans l'image autant que l'instrument le laisse passer (à peine pour un œil, entièrement pour un appareil tenu à la main). Et un corps au repos n'est jamais tout à fait immobile : debout ou en attente, la vue oscille de quelques millimètres et dérive d'un dixième de degré, lentement, de la même façon au même instant — sauf pour un observateur que le compte rendu dit paralysé (tag paralysis). Le pitchDeg énoncé est la façon dont l'observateur regardait dans le repère de ce qui le portait : tant qu'il se déplace, le lecteur ajoute la pente de la route sous la trace (lue sur le relief, positive en montée, atténuée quand le regard s'écarte de sa route), si bien qu'une côte relève la vue et que le chip Inclinaisonénonce la somme filter est ce qui était tenu devant l'instrument, un id de FILTERS comme solar-visual pour une éclipse. Il est tenu entre deux images clés, non fondu (personne ne porte la moitié de lunettes), et on l'ôte en énonçant "none". |
events | Ce qu'a fait l'observateur, énoncé en événements avec leurs paramètres plutôt qu'en poses qu'ils impliquent : [{ type: "event", eventType, t, until, params }], t et until en ms de l'enregistrement. Le lecteur en calcule les poses en lisant l'enregistrement, par la même loi pour tous (une rotation de la tête part de l'immobilité et se pose, la ligne d'un véhicule est une courbe), et ne réécrit que les événements tant que rien n'a changé ces poses ; un observerTrack qui a ses propres images clés l'emporte sur eux. Un paramètre porte sa provenance comme toute valeur. À pied : look (un regard tenu à partir de t, headingDeg, pitchDeg), walk (de from à to, deux { lat, lng }, entre t et until, comme marche et s'arrête une personne) et follow (un corps de l'interprétation, target, regardé à chacune de ses images clés, au centre de ce qu'il voit, le regard tournant entre elles comme tourne une tête ; tenu là où il le perd, à until ; observer-valensole.json). En véhicule : drive (le véhicule où est l'observateur, un objet du décor nommé par vehicle, suit path, une liste de { lat, lng }, aux vitesses speeds [{ t, kmh }], éventuellement divisées par speedDivisors [{ t, divisor }], placé par le seul lieu par lequel il est passé, through { t, lat, lng } ; l'eye du conducteur est { x, y, z } dans le modèle du véhicule), lookAhead (il regarde la route et garde la cible target { lat, lng } à environ keepDeg, puis lui jette des coups d'œil de glanceS suivis de roadS sur la route quand elle est à plus de glanceBeyondDeg ; pitchShare dit jusqu'à quelle part de sa hauteur il lève les yeux), lean (vers le rétroviseur : l'œil se déplace de offsetM en turnS, pendant holdS) et watch (dans le rétroviseur mirror, un point du modèle du véhicule : firstS, puis mirrorS entre deux regards ailleurs, un coup d'œil direct de glanceS une fois sur deux jusqu'à glancesUntil, la route pendant roadS sinon). Un événement d'un objet du décor le nomme dans who : fly (un avion le long d'une ligne droite menant à from { lat, lng }, au cap headingDeg, aux vitesses speeds, à at.metresBefore de ce lieu à l'instant at.t, à heights [{ t, altitudeM }] au-dessus de l'œil de l'observateur). Ceux du phénomène (who: "phenomenon") donnent les formes du compte rendu, tel que l'observateur l'a décrit : stand (au lieu place qu'il a énoncé, { lat, lng }, ses metres [{ t, widthM, heightM }] sa largeur et sa hauteur au-dessus de l'œil, d'où suivent à chaque instant sa direction et sa taille dans son ciel), appearance (son aspect à partir de t, ses parts : des formes placées et dimensionnées en parts de sa largeur apparente, sourceId, kind, points, color, brightness, halo, widthShare, heightShare, alongShare, upShare ; une partie qu'un autre aspect a et que celui-ci n'a pas n'est pas vue), blink (des parts allumées pendant onS, éteintes pendant offS, prenant off une fois éteintes) et vanish (il n'est plus vu). Ceux d'un corps de l'interprétation (who son id) s'ajoutent aux images clés qu'il énonce : motion (un mouvement de son modèle joué une fois, motion jusqu'à to, le tube central qui rentre), spin (un mouvement qui tourne en continu, turnsPerS, les pieds), rise (distanceM le long d'une droite à angleDeg de la verticale, 0 tout droit, vers headingDeg, depuis l'arrêt, ralentissant jusqu'à s'arrêter ou, stops: false, de plus en plus vite en partant), turn (se tourner vers headingDeg), ride (porté par le corps in, aboveM plus haut) et vanish ; une posture est aussi un mouvement du modèle (motion sur crouch, que porte une silhouette exportée avec ses postures : 0 debout, 1 accroupi) ; l'engin et les êtres de observer-valensole.json. observer-silly-le-long.json énonce ainsi son observateur, son avion et son phénomène |
weatherTrack | { keyframes: [{ t, weather }] } — l'état du ciel le long de l'enregistrement : précipitation, vent, orage, et les nuages en couches à hauteur réelle, chacune pouvant porter des nuages individuels placés en mètres. Chaque champ d'un weather est dans la section suivante |
weatherSource | { id, name, url } du relevé d'où vient la météo. Sa présence signifie que l'enregistrement est rejoué tel qu'il a été composé et n'est jamais reconsulté. Absent : le récit de l'observateur lui-même |
lightPollution | La brillance du ciel nocturne du lieu, villes comprises : le zénith d'une nuit sans Lune en magnitudes par seconde d'arc carrée, tel qu'un Sky Quality Meter le lit ou que l'atlas mondial de la brillance artificielle du ciel nocturne le donne (son chiffre « SQM », Falchi et al. 2016, que lightpollutionmap.info affiche pour tout lieu). 22 est un ciel naturel, une banlieue vers 19, un centre-ville 17. Absent : un ciel naturel. La part des villes, ce qui reste une fois ôtés les 22 naturels, s'ajoute au ciel comme de la lumière : plus forte vers l'horizon, où l'air bas en renvoie davantage, et dessinée du blanc chaud d'une lampe à 3000 K. Elle noie la Voie lactée et la lumière zodiacale, et retire des étoiles, de l'écart entre les étoiles les plus faibles qu'un œil distingue (Crumey 2014) : environ deux magnitudes à 19. La Lune en fait désormais autant. "derived" quand la valeur vient de l'atlas, "stated" quand l'observateur l'a mesurée. L'éditeur la remplit d'après l'atlas pour une observation de 2015 ou après, en "derived" avec l'atlas nommé, et ne remplace jamais une valeur saisie à la main ; avant 2015 il ne demande rien, le ciel ayant été plus sombre que celui de l'atlas |
observerMap | Si la carte d'où se tenait l'observateur s'ouvre d'emblée quand l'enregistrement est joué ou édité : true ou false. Absent : le lecteur décide, ouverte pour un observateur qui s'est déplacé, fermée pour un qui est resté sur place. Une page qui intègre le lecteur a le dernier mot (son attribut show-observer-map). L'éditeur l'écrit quand la carte y est ouverte ou fermée, pour qu'un lecteur voie ce que l'auteur a laissé |
frozen | Où sont gardées, dans des fichiers à côté de l'enregistrement (des annexes), les données que la scène demanderait sinon à des tiers à chaque lecture, pour qu'un enregistrement terminé se rejoue à l'identique dans dix ans sans rien demander à personne : relief (la hauteur du sol, telle que la source d'altitude l'a donnée pour chaque morceau de terrain que construit la scène, un zip), imagery (la photo du sol, sous la forme des tuiles servies par la source d'imagerie, un zip), roads, water, railways (les routes, l'eau et les voies de chaque morceau, en JSON), upperAir (l'air à l'altitude des avions, en JSON) et map (la photo sous la carte de l'observateur, sous la forme des tuiles servies par la source d'imagerie pour le terrain auquel la carte est ajustée, un zip : une carte figée montre cette photo et n'en demande aucune autre, agrandie quand on zoome dedans, vide au-delà quand on dézoome). Chacun vaut { src, takenOn, attribution }, src étant lu par rapport à l'adresse de l'enregistrement, ou une URL data: pour une annexe gardée dans l'enregistrement même. Un groupe lu dans son annexe ne demande rien à personne ; un groupe sans annexe est demandé en direct, comme tout l'était avant. "live": true sur un groupe le fait demander en direct à chaque lecture et ne le fige jamais (ce que dit le choix de sa source en direct plutôt que Fichier), et sur frozen lui-même tous les groupes ; "refresh": true sur un groupe le fait demander en direct une fois, et l'éditeur le relève à la sauvegarde suivante. L'éditeur relève ce qui manque à la sauvegarde, et sauve l'enregistrement et ses annexes en un seul zip à décompresser là où il est publié. weather, place, lightPollution et decor disent que la météo (weatherTrack, weatherSource), le nom du lieu, le chiffre du ciel nocturne et le décor sont lus dans le fichier plutôt que redemandés par l'éditeur (au relevé météo quand la date ou le lieu changent, au géocodeur, à l'atlas et au relevé du décor quand l'observateur se déplace) : {} s'ils sont dans l'enregistrement, { src } pour une annexe tenant leurs clés, que les lecteurs remettent dans l'enregistrement en le chargeant. Absents, ils sont dans l'enregistrement et l'éditeur les redemande. Le fuseau horaire n'y est pas : il est figé dans l'enregistrement lui-même |
soundTrack | { keyframes: [{ t, sound }] } — kind (none/hum/whistle/rumble/crackle), volume, pitchHz, et un src facultatif vers un vrai enregistrement. volume et pitchHz glissent d'une image clé à l'autre, kind et src changent à l'image clé. Un src sur un autre site doit être servi à toute origine (CORS) |
references | Photos des lieux posées sur la scène : src (une adresse, ou une URL data: pour une photo ajoutée depuis un disque), kind (photo/panorama), registration (headingDeg, pitchDeg, rollDeg, fovDeg), opacity, credit/creditUrl, t et drawing facultatifs, from ({ lat, lng }, d'où elle a été prise : le lecteur l'efface en fondu quand l'observateur s'éloigne de ce point ; absent, elle ne s'efface jamais), et les landmarks sur lesquels elle a été recalée (id, label, picture en { u, v } depuis le coin haut gauche, scene en { azimuthDeg, altitudeDeg }) |
traces | Ce qu'un enquêteur a dessiné sur les lieux, importé de son fichier Google Earth (KML ou KMZ) et affiché sur la scène comme étant le sien, jamais comme une partie de la reconstitution : [{ id, title, kind, points, altitude, color, source }], kind valant point, line ou polygon, points les sommets en [{ lat, lng, altM }] tels que le fichier les portait, altitude la façon de lire altM (ground, par défaut, relative au sol sous chaque point, ou absolute au-dessus du niveau de la mer), color un #rrggbb et source à qui il appartient |
instrument, exposureSeconds | À travers quoi l'observation a été faite, et combien de temps l'obturateur est resté ouvert. Absent : l'œil nu. instrument vaut eye, rectilinear-lens (un appareil de modèle inconnu), roamer-1-120, instamatic-126, slr-35mm-50, slr-35mm-zoom, phone-landscape, phone-portrait, ou un reflex numérique (eos-5d-iii, nikon-d7000… les capteurs du catalogue de Stellarium), des jumelles (binoculars-nikon-10x42-edg…) ou un télescope (telescope-celestron-c8…) ; exposureSeconds est une valeur pour tout l'enregistrement, tenue dans la plage de l'appareil ; un appareil qui enregistre une image (un appareil photo, un téléphone) y pose les reflets fantômes de son objectif sur chaque lumière, comme le font le verre et le capteur : une copie plus faible et floue sur la droite qui passe par le centre de l'image, symétrique par rapport à lui pour le reflet principal d'un téléphone, le disque rouge à l'opposé d'un feu tricolore. Un téléphone s'expose lui-même d'après ce qu'il voit, jusqu'à ISO 3200 : une nuit qu'il filme reste sombre autour de ses lampes |
lens | Ce à travers quoi l'image a été prise en plus de l'objectif, et ce qu'il y avait sur ce verre, pour un appareil qui en enregistre une : glass (filter, window ou windscreen : un filtre ajoute un reflet symétrique par rapport au centre, une vitre un double plus faible de chaque lumière juste à côté, plus loin pour un pare-brise incliné), drops, condensation et dirt (de 0 à 1, chacun diffusant autour de chaque lumière un halo qu'elle perd) et sheltered. Sans drops, les gouttes suivent la pluie ou la neige qui tombe à chaque instant, sauf si sheltered est vrai : de nouvelles se posent d'autant plus souvent que la pluie frappe le verre de face (un objectif levé, une vitre face au vent, un pare-brise incliné en reçoivent plus), fusionnent avec leurs voisines ; les petites restent accrochées des minutes, les grosses coulent au bout de quelques secondes en laissant une traînée de perles et en essuyant ce qu'elles croisent, et continuent une fois la pluie arrêtée. Les reflets de l'objectif lui-même suivent son ouverture : plus larges objectif ouvert, et au polygone de ses lamelles une fois diaphragmé |
iso | La sensibilité du film ou du capteur de la photo, quand on la connaît : 400 pour un film 400 ISO. Absent : celle de l'appareil (100 pour le négatif couleur d'un reflex, 64 pour celui d'un Instamatic). La photo d'un appareil ne répond pas comme un œil : un film ne s'adapte pas au ciel, il reçoit une exposition (la lumière, fois le temps de pose, divisée par le carré de l'ouverture) et y répond selon sa propre courbe (douce pour un négatif, plus raide pour une diapositive, droite puis arrêtée net au blanc pour un capteur). Une pose de nuit sort donc avec un ciel noir, et ce qui y brillait ressort. Indiquée pour un appareil qui règle lui-même son exposition (un téléphone), c'est cet appareil réglé à la main, comme en mode manuel |
metering | Comment un appareil qui règle lui-même son exposition a lu la lumière, quand on le sait : "average", la moyenne de toute l'image, comme les caméscopes et les anciens téléphones, qui brûle en blanc une lumière vive dans une image sombre ; ou "highlights", comme les téléphones récents, en se retenant pour qu'une lumière qui occupe une part notable de l'image garde sa couleur (une lanterne à vingt mètres sort orange, blanche seulement près de sa flamme), le reste de la nuit plus sombre. Absent : celle de l'appareil (un téléphone protège ses hautes lumières) |
sway | Combien le corps qui tient l'instrument fait bouger la vue hors de la marche : 1 pour une personne debout ou assise, 0 pour un appareil sur trépied, entre les deux ou au-delà pour moins ou plus. Absent, c'est 1 — sauf pour un observateur que le compte rendu dit paralysé (tag paralysis), pour qui c'est 0, et pour une pose de plus d'une demi-seconde, qu'aucune main ne tient immobile : c'est un trépied, et 0 aussi |
vehicle | Le véhicule où se trouvait l'observateur, quand le décor ne le dessine pas : { kind, windowsOpen, noise }, kind valant car, van, truck, motorcycle ou generic. Entendu de l'intérieur : son moteur suit le trajet de l'observateur — le rapport selon la vitesse, le régime selon le rapport, l'effort selon qu'il accélère ou ralentit — avec le roulement et le vent, étouffés par un habitacle fermé, entrant par des vitres ouvertes ; noise est son niveau face à un véhicule ordinaire de son genre (1 par défaut). C'est aussi ce qui garde actif le bouton de son du lecteur quand le fichier n'a pas de soundTrack : le bouton répond de tout ce que joue la scène — ce moteur, un engine du décor, la pluie et le vent — et pas seulement de la piste Ses feux : headlights est un réglage comme pour un véhicule de décor (off, position, dipped, main, fog) ou auto, par défaut : les feux de croisement à partir du crépuscule et rien le jour, ce que fait un conducteur. headlightKeyframes est [{ t, mode }] pour un changement pendant l'enregistrement. Le faisceau éclaire la route devant l'observateur, dans la direction où va le véhicule. |
decor | Le décor, à une vraie distance eastM/northM de l'observateur : bâtiments (avec floors, windows), arbres, buissons, lampadaires, véhicules, ponts, lignes aériennes, autres observateurs, aéronefs — éventuellement avec une track et des lights dont le pattern porte une vraie cadence d'éclats. Voir ci-dessous |
Un objet du décor s'énonce en mètres, comme tout ce qui n'est pas le phénomène :
| Champ | Sens |
|---|---|
eastM, northM, headingDeg | Où il se tient par rapport à l'observateur, et vers où regarde son avant, en degrés depuis le nord vrai dans le sens horaire |
sizeM | { widthM, lengthM, heightM } selon ses propres axes, la longueur étant le sens où il regarde. Chaque axe est facultatif : celui que personne n'a mesuré garde la proportion de la forme intégrée |
model | Un vrai modèle 3D à la place de la forme intégrée : une entrée du catalogue par id, ou un fichier glTF/GLB à url (qui l'emporte, doit être lisible depuis toute origine, et exige alors son credit ; une adresse relative se lit depuis le fichier qui l'énonce). Il ne décide jamais de la taille : il est mis à l'échelle, proportions gardées, sur le premier axe mesuré parmi longueur, hauteur et largeur, ou sur la taille réelle que lui donne le catalogue. Vu de l'intérieur, et chaque fois que le modèle ne peut être obtenu, c'est la forme intégrée qui est dessinée. Un observer ou une entity qui n'en nomme aucun n'est jamais dessiné en forme intégrée : c'est une des personnes réalistes du catalogue, choisie par son id (un enfant, ou un être qu'une déposition décrit, nomme son propre modèle) headingOffsetDeg tourne le modèle chargé autour de son axe vertical pour que son nez pointe où la scène l'attend (0 regarde le nord pour un cap de 0) ; une entrée du catalogue apporte le sien. credit est { title, author, license, sourceUrl } : license telle que son auteur l'énonce ("CC BY 4.0") et sourceUrl d'où il vient, pour que l'affirmation soit vérifiable. |
bridge | Pour un "bridge" : comment il est construit. sizeM.lengthM est toute sa longueur le long de la route, remblais compris, widthM la largeur du tablier et heightM la hauteur de la chaussée sur le tablier au-dessus du sol ; spanM est la portée libre sous le tablier, la route courant de chaque côté sur un remblai de terre qui descend jusqu'au sol ; deckThicknessM l'épaisseur de la dalle (1,2 par défaut) ; railing { heightM, postSpacingM, rails } le garde-corps des deux rives, poteaux et lisses dont les ouvertures sont des rectangles (1,05 m, 1,5 m et 2 lisses par défaut). Dessiné à ces cotes, jamais étiré |
wire | Pour un "wire" (une ligne électrique ou téléphonique) : sizeM.lengthM est la portée entre ses poteaux, le long de son headingDeg, et heightM la hauteur du fil le plus bas ; strands [{ heightM, acrossM }] en suspend plusieurs (des fils superposés partagent un acrossM, ceux d'une traverse diffèrent) ; poles vaut both (par défaut), start ou end (l'extrémité dont le cap s'éloigne ou vers laquelle il pointe : l'autre est ancrée sur un bâtiment) ou none ; diameterM (8 mm par défaut) et poleHeightM (un demi-mètre au-dessus du fil le plus haut). Droite, sans flèche, et dessinée à ces mesures, jamais étirée |
track | [{ t, eastM, northM, altitudeM, headingDeg }] quand il se déplace, altitudeM au-dessus du sol sous lui (l'œil est à elevationM + 1,6 m : un corps à hauteur d'œil a cet altitudeM). La position est interpolée entre les images clés ; le cap est tenu de l'une à la suivante |
lights | Ses feux : id, offsetM { x, y, z } depuis son centre (droite, haut, avant), color, intensity (1 pour un feu de navigation ordinaire) et un pattern : { "kind": "steady" }, ou { "kind": "flash", perMinute, dutyCycle, phase }, la cadence telle que l'énoncent les règlements, la part allumée de chaque cycle (environ 0,5 pour un clignotant à filament, 0,01 pour un stroboscope) et un décalage de 0 à 1 entre feux. L'éditeur les remplit depuis des modèles : avion de ligne, hélicoptère, phares de voiture, feux de détresse, gyrophares, lampadaire |
engine | Un véhicule qu'on entend tourner : { kind, noise }, comme vehicle plus haut. Son moteur suit sa propre track, entendu depuis l'observateur, plus faible et plus sourd avec la distance |
aircraftSound | Un aéronef (kind aircraft) qu'on entend en vol, c'est-à-dire quand sa track quitte le sol : le genre de bruit qu'il fait, un type d'aéronef (airliner-narrow par défaut, airliner-wide, regional-jet, helicopter-light, light-piston…) ou silent pour un appareil qui n'en fait pas. Ce que dit son modèle s'applique quand le champ est absent (les maquettes d'un phénomène sont silencieuses). Il s'entend comme les aéronefs d'un relevé de trafic : plus faible et plus sourd avec la distance, en retard du temps que met le son à venir (environ trois secondes par kilomètre) donc entendu là où il était, plus aigu quand il approche et plus grave quand il s'éloigne, et masqué par le bruit du lieu |
occludesSourceIds | Les phénomènes devant lesquels l'observateur a dit qu'il se tenait — voir les règles plus bas |
facade | Genre building seulement : { color?, plain? }. color est le mur, "#rrggbb" ; sauf si plain vaut true, des fenêtres sont dessinées à chaque étage et une porte au rez-de-chaussée de la face avant. Dessinée à la sizeM énoncée (les trois côtés doivent l'être), jamais étirée, et pas pour un bâtiment qui a un observateur dedans. L'éditeur prend la couleur dans la matière que la carte énonce pour les murs (pierre, brique, béton, parpaing, bois), ou un enduit là où elle n'en énonce pas. Absent : la simple boîte. |
roof | Genre building seulement : { shape, riseM, color?, ridge? }. shape vaut "flat" (la boîte), "gable" (deux pentes jusqu'à un faîte le long du grand côté, ou de la profondeur avec ridge: "depth") ou "hip" (quatre pentes) ; riseM est la hauteur du faîte au-dessus de l'égout, donc les murs font sizeM.heightM moins cela ; color est le toit vu d'en haut, "#rrggbb". L'éditeur les lit dans le laser et la photo aérienne du relevé. Absent : toit plat de la couleur des murs. |
origin | Le relevé dont cet objet a été tiré, par l'id de son fournisseur ("ign-lidar-topo"), quand l'éditeur l'a pris du relevé du lieu et que l'auteur ne l'a pas placé à la main : un arbre, un bâtiment, un pont ou une portée de ligne. Choisir un autre relevé, ou aucun, ou un autre lieu, remplace ou retire ce qui porte une origin, et jamais ce qui n'en porte pas |
surveyedOn | Le jour (AAAA-MM-JJ) du relevé le plus récent dont cet objet est tiré, quand il vient d'un relevé (voir origin) : l'éditeur avertit quand il est postérieur à l'observation. |
lit, litKeyframes | Si la lampe d'un lampadaire ou les phares d'un véhicule sont allumés. litKeyframes est [{ t, lit }], trié par t, pour un éclairage allumé ou éteint pendant l'enregistrement ; sans lui, lit vaut pour toute la durée. Ignoré pour un bâtiment, un arbre ou un observateur |
headlights, headlightKeyframes | Comment les feux d'un véhicule sont réglés, car tout le monde ne les met pas, ni comme il faut : off, position (les feux de position, qui montrent le véhicule et n'éclairent rien), dipped (les feux de croisement), main (les feux de route : loin, étroits, éblouissants) ou fog (les antibrouillards : bas et larges). Un faisceau éclaire la route, les bas-côtés, les arbres et les murs devant le véhicule, quelle que soit la façon dont il est dessiné. headlightKeyframes est [{ t, mode }], trié par t, pour un réglage qui change pendant l'enregistrement. Sans l'un ni l'autre, lit le dit : allumé, ce sont les feux de croisement. Ignoré pour tout autre qu'un véhicule. Seuls quatre véhicules (celui de l'observateur, puis les plus proches du décor) ont un vrai faisceau. Les phares de l'observateur projettent des ombres (un talus, un poteau ou une pile de pont retient la lumière de ce qui est derrière), et le faisceau se voit dans l'air en proportion de ce que l'air en diffuse : une trace discrète par air clair, un cône de lumière dans le brouillard |
observerSide, observerFacing, observerKeyframes, occupiedFloor | L'observateur à l'intérieur de l'objet, pour un building ou un véhicule (un seul objet à la fois le contient). observerSide dit où il est : front, behind, left, right, front-left, front-right, behind-left ou behind-right, l'occupant d'un véhicule étant à l'une de ses quatre portières. observerFacing est la vitre par laquelle il regarde quand ce n'est pas celle de sa place : un conducteur est assis en front-left et regarde par le pare-brise, front. observerKeyframes, [{ t, side, facing }], dit où il est assis au fil du temps, chacune tenue jusqu'à la suivante, et une image clé sans side veut dire dehors à partir de là, comme un conducteur qui descend. occupiedFloor est l'étage d'un bâtiment où il se trouve, de 0 (rez-de-chaussée) à floors |
modelParameters | Les réglages du modèle dont l'objet est dessiné, par la clé sous laquelle l'entrée du catalogue publie chacun : { "costumeColor": "#5a6b3a" } pour les vêtements d'une personne, foliageColor pour un arbre, hullColor pour un engin, gearUp pour un avion de ligne en vol. Un modèle apporte les siens (l'éditeur dessine un champ pour chacun) ; un objet dessiné comme une forme intégrée n'en a pas, il est peint par color |
sightingUrl | Pour un observer : l'adresse de l'enregistrement propre à cet observateur, quand elle est connue, afin que le menu de la scène puisse proposer de voir son témoignage |
Ce que c'était : les interprétations#
Un enregistrement énonce des angles, et un corps en mètres ne fait jamais partie de ce qui
a été vu. C'est une affirmation à son sujet, et elle se met à l'épreuve en la posant dans la
scène et en la regardant depuis l'endroit où se tenait l'observateur : elle projette son ombre,
le sol peut la cacher, et son contour est confronté à chaque instant à ce que l'observateur a
dit. Une interprétation s'affiche seule, comme le monde qu'elle affirme ; quand on demande
la comparaison (le bouton ◌, ou compare-account sur
<rr0-sighting>), le lecteur dessine à côté tout ce que l'observateur a vu, en
contours pointillés, et indique l'écart de direction et combien de fois plus large et plus
haut chaque corps paraît, en rouge quand un observateur n'aurait pas pu se tromper d'autant.
La lecture de l'observateur lui-même va dans l'enregistrement, en interpretation.
Celle d'un autre n'est pas dans le compte rendu : c'est une autre observation, listée dans le dossier (voir plus bas). Un
compte rendu dont l'observateur a dit ce que c'était se dessine en volume, comme il l'a dit ;
celui qui ne dit rien en mètres se dessine avec les angles qu'il énonce. Le lecteur le
propose, ainsi que chaque interprétation d'analyste, une à la fois.
{
"interpretation": {
"title": "Un engin posé sur ses pieds",
"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 }
]
}]
}
}
| Champ | Sens |
|---|---|
explains | Les sourceId des phénomènes que ce corps prétend être |
model | Une forme construite ici (ellipsoid, sphere, disc, cylinder, cone, box, torus, figure), un modèle du catalogue par son id, ou un fichier glTF à url avec son credit ; une url relative se lit depuis le fichier qui la donne, pas depuis la page. Étiré à sizeM dans tous les cas headingOffsetDeg et credit ({ title, author, license, sourceUrl }) sont ceux du modèle d'un objet du décor. |
track | Où il est et à quoi il ressemble à chaque t. Une position s'énonce soit dans le monde (eastM/northM depuis l'endroit où se tenait l'observateur au début, comme le décor, avec onGround ou altitudeAboveGroundM), soit depuis l'observateur à cet instant (azimuthDeg, altitudeDeg, distanceM). Un corps onGround est posé sur le relief ; une direction sans distance rencontre alors le sol là où cette ligne le rencontre. sizeM, attitude (headingDeg, pitchDeg, rollDeg) et appearance (color, albedo, luminanceCdM2, transparency de 0 à 1, haloScale en multiple de l'éblouissement de sa lumière propre) valent jusqu'à ce qu'une keyframe suivante les énonce à nouveau, et se mélangent entre deux keyframes. present: false retire le corps de la scène à partir de cette keyframe, et present: true l'y ramène. Une flame (lengthM, widthM, color à la sortie, tipColor, luminanceCdM2) s'allume à la keyframe qui l'énonce, sort du nœud du modèle nommé exhaust (ou de celui que nomme son node), éclaire ce qui l'entoure, soulève de la poussière là où elle touche le sol si raisesDust le dit, et s'éteint avec une luminanceCdM2 de 0 |
motions | Dans une keyframe : où en est chacun des mouvements propres de son modèle, par le nom du mouvement — les animations du fichier glTF. 0 est le début d'un mouvement, 1 sa fin, et un mouvement qui se répète continue au-delà de 1 : { "legs-turn": 7 }, c'est sept tours. Le modèle dit ce qui bouge et comment ; la piste dit quand. Chaque mouvement se mélange entre les keyframes qui l'énoncent, quelles que soient les keyframes qui déplacent le corps entre-temps, se maintient après la dernière et vaut 0 avant la première. Le départ de Valensole s'écrit ainsi : { "t": 246000, "motions": { "pivot-retract": 0 } }, { "t": 248000, "motions": { "pivot-retract": 1, "legs-turn": 0 } }, … { "t": 262000, "motions": { "legs-turn": 7 } } |
lights | Dans une keyframe : la luminance, en cd/m², de chacun des feux propres de son modèle, par le nom du matériau du feu dans le fichier glTF, pour qu'un même corps porte des feux qui font chacun autre chose, un blanc fixe à chaque bout et un rouge qui clignote entre les deux. Le modèle dit où est chaque feu, sa taille et sa couleur ; la piste dit quelle luminance et quand. Chaque feu se mélange entre les keyframes qui le nomment et se maintient après la dernière : une bascule, ce sont donc deux keyframes à une milliseconde d'écart. Un feu qu'aucune keyframe ne nomme brille à sa part de appearance.luminanceCdM2. Un feu trop petit pour se voir se voit par son éblouissement, et ce qui se trouve entre lui et l'œil, la coque du corps lui-même ou un pont, le cache. Le feu rouge de Silly-le-Long : { "t": 499, "lights": { "front-red": 1500 } }, { "t": 500, "lights": { "front-red": 0 } } |
outlineNode | Le nœud du modèle qui est ce que l'observateur a dessiné ("hull" pour un engin dont les pieds ne figurent pas dans le dessin) : ce sur quoi son contour est mesuré |
modelParameters, flicker | Les réglages de son modèle, par la clé sous laquelle son entrée du catalogue publie chacun ({ "paperColor": "#ff0000" } pour le papier d'une lanterne céleste, qui filtre aussi ce que ce papier émet) ; et la part dont sa lumière vacille, comme celle d'une flamme (0.15 : quelque 15 % au-dessus et en dessous, plusieurs fois par seconde, à l'identique à chaque lecture). Stable si absent |
smoke | Sur l'interprétation elle-même : ce qu'elle met à brûler au sol, en { eastM, northM, fromT, untilT? }, vu par sa fumée qu'emporte le vent de l'enregistrement halfLifeS dit à quelle vitesse elle retombe, en secondes pour perdre la moitié de son épaisseur (20 par défaut) : un feu de broussailles flambe puis couve. Elle ne s'arrête jamais tout à fait avant untilT. |
lanterns | Sur l'interprétation elle-même : des lanternes célestes lâchées du sol, chacune calculée en un corps lumineux. Un lâcher indique son site ({ eastM, northM, altitudeM?, originElevationM? }), le vent au sol wind et, au besoin, windAloft ({ towardDeg, speedMS, atM }), la température airTemperatureC, et ses lanternes : une à une dans releases ({ t, explains?, eastM?, northM?, altitudeM?, burnedS?, lantern? }, où altitudeM et burnedS font partir une lanterne de là où elle a été vue la première fois, déjà en l'air et en partie consumée), ou en group ({ count, fromT, untilT, radiusM?, burnS?: { min, max }, insideExcessK?: { min, max }, burnedS?, explains?, seed? }), dont les lanternes sont tirées au hasard dans ces bornes, les mêmes pour la même seed. Chacune monte tant que son air chaud la porte plus qu'elle ne pèse, suit le vent de la hauteur atteinte, chacune prise dans ses propres rafales (turbulence : { horizontalMS, verticalMS, timescaleS }, l'écart de la vitesse de l'air autour de ce vent et la durée d'une rafale ; 0,8, 0,3 et 30 s, ceux d'une brise légère, par défaut, tout à zéro pour un air immobile), si bien qu'un groupe lâché ensemble s'étire et se déforme en montant, et disparaît quand son combustible est épuisé : 8 à 15 minutes selon les vendeurs, 480 à 900 s tirées par défaut. lantern remplace la lanterne courante d'un mètre : envelopeVolumeM3 (0,19), massKg (0,065), fuelKg, burnS (600), insideExcessK (150), dragAreaM2, luminousIntensityCd (10, supposé : une étoile brillante à 2 km), widthM, heightM, color (la lumière de sa flamme à travers un papier blanc), shape ("classic", ronde à la base et carrée au sommet plat, ou "balloon", étroite à la base et au sommet large en lobes) et paperColor (blanc par défaut : son aspect de jour, et ce qui filtre sa lumière de nuit). Chacune penche du côté où l'air qui la dépasse la pousse, de quelques degrés dans une rafale. |
Événements du ciel#
Ce qui s'est passé dans le ciel pendant l'enregistrement, en tant que faits : un tir laser, un lancement de fusée, une rentrée atmosphérique. Chacun a eu lieu que quelqu'un l'ait vu ou non : ce n'est donc ni l'interprétation, qui lit le compte rendu, ni le décor, qui dure plus longtemps que l'observation (une maison, un arbre). Ils sont déclarés sous skyEvents, au premier niveau de l'enregistrement ; un enregistrement qui les mettait dans son interpretation, comme le faisaient les versions précédentes, est encore lu.
{
"skyEvents": {
"beams": [{
"id": "meudon-paris",
"path": [
{ "lat": 48.805055, "lng": 2.231171, "altitudeM": 172.5 },
{ "lat": 48.83632, "lng": 2.33702, "altitudeM": 88 }
],
"wavelengthNm": 532,
"powerW": 10
}]
}
}
| Champ | Signification |
|---|---|
reentries | Les rentrées atmosphériques qui ont eu lieu, un satellite ou un étage de fusée se désagrégeant en morceaux qui brûlent. Pas des corps : une rentrée brûle entre 70 et 100 km d'altitude et se voit à des centaines de kilomètres, elle est donc placée sur la Terre et vue à travers sa courbure depuis l'endroit où se tenait l'observateur. Sa track donne le point de tête à des instants de l'enregistrement, { t, lat, lng, altitudeKm }, reliés par des grands cercles ; chacun de ses fragments suit le même chemin lagS secondes derrière, se voit de fromT jusqu'à s'éteindre à untilT, brille de sa absoluteMagnitude (à 100 km, comme pour un bolide) ramenée à sa distance réelle, de sa couleur color, avec une traînée des trainS dernières secondes de son chemin (4 en son absence : la traînée d'une rentrée est longue). Chaque morceau se désagrège comme le font les morceaux qui brûlent (sheds) : un émiettement lent en fragments faibles, chacun avec sa strie, qui prennent du retard, s'écartent et descendent en un éventail étroit, et une salve d'une trentaine à chaque pic de sa lightCurve, un pic étant une rupture (Zander & Löhle, CEAS Space Journal 2025). Une liste de phases l'énonce à la place, { fromT, untilT, perS, lifeS, magnitudeDrop, dropBack, spreadKmS, sinkKmS, trainS }, et une liste vide un morceau qui ne sème rien. Un pic plus brillant que la magnitude −12 sous 50 km s'entend comme une détonation, après le temps que met le son à parcourir la distance (Tcheliabinsk : deux minutes et demie). Sa lumière est la sienne : elle se voit que le Soleil l'atteigne ou non. object nomme ce qui est retombé (name, cosparId, norad). Rien n'est propagé depuis des éléments orbitaux, faux de plusieurs minutes sur la dernière orbite : le chemin est ce que les sources établissent, avec sa provenance |
launches | Les lancements de fusée qui ont eu lieu, éclairé par un Soleil couché pour le sol mais pas pour le panache, la « méduse spatiale ». Placés sur la Terre comme une rentrée : leur track donne l'étage à des instants de l'enregistrement, { t, lat, lng, altitudeKm } (elle peut commencer avant l'enregistrement), et burnFromT et burnUntilT les secondes où le moteur a brûlé. Le panache est une file de bouffées lâchées le long de ce chemin, chacune s'étalant avec l'âge ; ce qui se voit de chacune est la lumière du Soleil qu'elle diffuse vers l'observateur. L'ombre de la Terre (où le Soleil éclaire ou non à la hauteur de la bouffée, et combien d'air sa lumière a frôlé, ce qui la rougit ou la bleuit), l'angle de diffusion et l'étalement sont calculés depuis le vrai Soleil à la vraie date : rien n'en est déclaré. Un plume facultatif remplace les valeurs par défaut : exhaustKgPerS (273, un Merlin Vacuum), condensedShare (0,065, le seul nombre que personne n'a mesuré), particleRadiusUm, expansionKmPerS, initialRadiusKm, lifetimeS, et pour la collerette (le gaz fraîchement éjecté, large et vite disparu, à côté de la traînée étroite qui reste) collarShare (0,85), collarExpansionKmPerS (2,5), collarLifetimeS (20). vehicle nomme ce qui a volé et, dans engine, le moteur dont c'est l'échappement : thrustKN et specificImpulseS (dont se déduisent le débit d'échappement et sa vitesse, donc la largeur de la collerette) et propellant (rp1-lox, methane-lox, hydrogen-lox, hypergolic ou solid, qui dit quelle part devient des particules et de quelle taille). Ce que dit plume l'emporte sur ce que dit le moteur. Le panache a besoin de la date de l'enregistrement : sans elle il n'y a pas de Soleil pour l'éclairer vehicle.mission nomme la mission qu'il effectuait ("Starlink Group 10-49"). Chaque bouffée vole seule une fois lâchée, à la vitesse de l'étage plus celle à laquelle elle a été lancée, tirée par la Terre et freinée par l'air seulement là où il est assez dense pour s'écouler autour d'elle (sous 200 à 300 km) : le panache est la même chose dans l'espace vu de tous les côtés, une traînée vue dans l'axe est un disque, une spirale vue par la tranche une ligne. Sa couleur est celle de la taille de ses particules : la glace grossière diffuse du blanc, la glace plus fine que la longueur d'onde du bleu. jets liste ce que l'étage lâche d'autre, chacun { kind, fromT, untilT, angleDeg, azimuthDeg, spinPeriodS, speedKmPerS, massKgPerS, condensedShare, particleRadiusUm, expansionKmPerS, initialRadiusKm, lifetimeS } : kind burn (un autre allumage du moteur, avec les valeurs du panache ; un freinage de désorbitation est angleDeg 180, l'échappement partant devant l'étage) ou vent (des ergols vidangés des réservoirs, plus lents, plus fins et plus froids : 0,7 km/s, 20 kg/s, la moitié gelant, par défaut) ; angleDeg depuis l'arrière du mouvement (0) jusqu'au côté (90) ; azimuthDeg le côté par lequel il part autour du mouvement (0 à l'opposé de la Terre) ; spinPeriodS le tour de l'étage autour de son mouvement, qui fait tourner le jet avec lui et dessiner une spirale aux ergols vidangés. Quand il y a des jets, l'allumage de l'ascension n'est dessiné que si burnFromT ou burnUntilT est donné. |
beams | Les faisceaux de lumière envoyés dans l'air depuis le sol, un tir laser ou un projecteur. Chacun a un path d'au moins deux points { lat, lng, altitudeM } (altitudes au-dessus de la mer) : où il quitte l'émetteur, où un miroir le renvoie s'il y en a un, et où il finit. Entre deux points c'est une droite à travers l'espace, pas le long du sol, qui s'abaisse sous elle. wavelengthNm est sa couleur (532 pour un laser vert), powerW sa puissance optique moyenne, divergenceMrad la vitesse à laquelle il s'élargit (0,1 par défaut) et apertureM sa largeur au départ (0,01 m par défaut) ; fromT et untilT disent quand il est allumé. Rien de sa luminosité n'est déclaré : ce qui se voit de chaque mètre est ce que l'air à cet endroit (molécules et brume, à sa longueur d'onde) diffuse vers l'œil de la puissance qui lui reste, selon l'angle dont la lumière doit tourner ; il est donc bien plus vif vu en remontant vers lui qu'en le regardant s'éloigner. Il est caché par ce qui se trouve devant lui et s'arrête où il rencontre le sol. |
Une autre lecture : une interprétation est une autre observation#
La lecture qu'un autre fait d'un compte rendu (celle d'un analyste, d'un enquêteur, une comparaison faite pour
la mettre à l'épreuve) n'est pas dans le compte rendu : c'est une autre observation, celle qui a eu lieu telle que
son auteur la tient. Elle est donc listée dans le dossier comme l'original, en événement de type
sighting, marqué comme lecture par interpretationOf, et a un enregistrement à elle à
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" }
]
}
| Champ | Sens |
|---|---|
interpretationOf | L'id de l'événement du dossier dont c'est une lecture ("trent"), ou une liste d'ids quand une lecture sert plusieurs comptes rendus (les photographies et un gros plan). Ce qui la distingue d'un compte rendu : les événements sans ce champ sont les observateurs du dossier |
time | Quand l'interprétation a été élaborée, comme RR0 écrit un temps ("2013-06") : pas quand l'observation a eu lieu |
by | Qui l'avance : { "people": id } ou { "org": id }, qui désignent une entrée qui vit ailleurs (sur RR0, un répertoire de personnes ou d'organisations), ou une personne décrite en valeur. Absent pour une comparaison que personne n'avance |
title | Comment la lecture s'appelle dans le menu du lecteur et le sélecteur de l'éditeur : quelques mots, une chaîne ou une par langue |
url | Son enregistrement, lu relativement à l'adresse du fichier du dossier, comme celui d'un observateur |
L'enregistrement à url est un enregistrement comme les autres. Il partage le lieu, l'heure et la pose
de l'observateur du compte rendu qu'il lit, si bien qu'un corps placé depuis l'observateur, ou en mètres depuis
l'endroit où il se tenait, veut dire la même chose dans les deux ; il ne dessine aucune forme (une
timeline vide) ; et il porte les corps dans son propre interpretation, décrit plus haut.
Les explains d'un corps désignent les formes du compte rendu.
{
"version": 2,
"id": "1950-05-11-TrentPaul-interpretation-2",
"time": "1950-05-11T19:45",
"utcOffsetHours": -7,
"place": { "locations": [{ "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 } }
]
}]
}
}
Le lecteur liste les observateurs du dossier d'après les événements sans interpretationOf et propose
chaque lecture à côté du compte rendu qu'elle désigne, une à la fois (le bouton ◌ la mesure contre le compte
rendu). Un enregistrement seul n'a d'autre lecture que son propre interpretation. L'ancienne forme, un
événement de type interpretation qui désigne l'enregistrement dans sighting avec ses corps
sur place ou dans un fichier à url, est encore lue. L'éditeur ouvre un dossier : son sélecteur
au-dessus du rendu liste les comptes rendus et les lectures, chacun s'ouvrant comme l'enregistrement qu'il est, avec
un bouton pour ajouter une lecture (un nouvel enregistrement qui partage le lieu, l'heure et la pose du compte
rendu, et un événement pour lui), un pour la supprimer, et un pour exporter le dossier et chaque enregistrement
ajouté ou modifié en zip. Essayez avec
case-mcminnville.json
(le jouer,
l'éditer).
La météo, et ses nuages#
Un point weather énonce l'état du ciel à un instant de l'horloge de
l'enregistrement ; entre deux points chaque nombre est interpolé, le type de précipitation et
l'orage sont maintenus. Il porte :
| Champ | Sens |
|---|---|
cloudLayers | Les nuages, en liste de couches — voir plus bas. Absent : ce sont les anciens champs des lignes voisines qui les décrivent, adaptés en une couche d'eau et un voile de cirrus ; une liste vide : un ciel dégagé que quelqu'un a regardé |
cloudCover, lowerCloudCover, highCloudCover | Fractions de ciel (0–1) : le total, les couches d'eau seules, le voile glacé seul. Écrits par les enregistrements d'avant les couches, et encore tenus à jour par l'éditeur comme résumé de celles-ci |
cloudBaseM, cloudDarkness | La base unique de la même époque, en mètres au-dessus du sol de référence, et une teinte unique (0 blanc, 1 très sombre) |
iceCrystalAlignment | 0–1, la régularité de la chute des cristaux de glace — ce qui fait d'un anneau nu des parhélies, des arcs et un pilier. Aucun relevé ne le mesure ; une couche de cirrus porte le sien |
rareIceCrystals | 0–1, la part des cristaux d'un voile de cirrus qui sont de types rares : colonnes à bouts pyramidaux (les halos à rayon impair, à 9°, 20° et 35°) et plaquettes libres de tourner autour d'un axe horizontal (les arcs de Lowitz). Absent signifie 5 %, un voile ordinaire. Comme l'alignement, aucun relevé ne les compte : il est déclaré. La simulation qui en découle a été vérifiée cohérente avec Atmospheric Optics |
relativeHumidity | 0–1, près du sol. Elle décide de la blancheur du ciel clair : la brume gonfle d'eau à mesure que l'air approche de la saturation. Un relevé consulté la porte (tirée de la température et du point de rosée d'ERA5) ; absente, une brume ordinaire |
precipitationType, precipitationIntensity | none/rain/snow/hail, et 0–1. Énoncée à une keyframe, jouée comme elle tombe : une averse commence à la keyframe qui la déclenche par ses premières gouttes, et n'atteint l'intensité énoncée pas plus vite qu'une vraie pluie (de rien au plus fort en vingt secondes) ; elle s'arrête de même. Un changement que les keyframes étalent davantage est suivi tel quel precipitationAmount (0–1, absent veut dire tout) dit quelle part de cette précipitation tombe déjà. |
windDirectionDeg, windSpeed | Le vent général : le cap VERS lequel il souffle, dans le sens horaire depuis le nord, et des mètres par seconde. C'est lui qui porte les nuages — depuis l'instant zéro, si bien qu'une recherche et une relecture donnent le même ciel |
storm | Éclairs et tonnerre, au bon retard |
Chaque couche de cloudLayers est une nappe de nuages à une
hauteur réelle, et reste elle-même d'un point à l'autre :
| Champ | Sens |
|---|---|
id | Stable d'un point à l'autre — les couches s'apparient par lui, jamais par leur rang dans la liste. Une couche présente à un point et absente au suivant s'estompe ; les réordonner ne change rien |
type | cumulus, stratus, stratocumulus, cirrus ou unknown. Il décide de la forme des sommets et de la finesse du voile ; un cirrus est aussi celui qui réfracte les halos. Il bascule au point, il n'est pas interpolé |
baseM, thicknessM | En mètres. La base est au-dessus du sol de RÉFÉRENCE de l'enregistrement, pas au-dessus d'un observateur qui grimpe ; un observateur plus haut que la base est dans la nappe ou au-dessus, et le ciel est dessiné en conséquence |
coverage | 0–1, et cela veut dire ce que cela dit : la fraction du ciel que cette couche couvre, quelle que soit la taille de ses nuages |
sizeM | La largeur caractéristique d'un nuage, en mètres. Indépendante de la couverture : une même fraction de ciel peut être beaucoup de petits nuages ou quelques gros |
density | 0–2, l'opacité de la matière nuageuse ; 0 est transparent. Indépendante de la couverture elle aussi |
darkness | 0 blanc à 1 très sombre. Absent : le cloudDarkness du point |
seed | Lequel des motifs, parmi les innombrables que les mêmes nombres peuvent dessiner. Absent : un motif dérivé de l'id, ce qui est la raison pour laquelle l'id ne doit pas changer |
windDirectionDeg, windSpeed | Le vent propre à cette couche, lorsqu'il diffère du vent général — c'est le cas de la couche haute d'ordinaire. Absent : le vent général |
iceCrystalAlignment | Pour un cirrus seulement |
instances | Les nuages individuels de cette couche — voir plus bas |
Un nuage individuel dans instances est un nuage de sa couche que
le fichier place exactement, parce que le récit le fait : celui derrière lequel le phénomène
est passé, celui qui était là et nulle part ailleurs. Il est dessiné comme un nuage de sa
couche — même texture, même seuil — et ne se distingue de ses voisins que par sa position et sa
taille ; il est là même quand la coverage de la couche est nulle. Il suit le vent
de la couche comme les autres, et il masque un phénomène devant lequel il passe.
| Champ | Sens |
|---|---|
id | Stable d'un point à l'autre, même règle que pour une couche |
eastM, northM | Où était son centre à l'instant zéro, en mètres depuis le point de départ de l'observateur. Le vent l'emporte de là |
baseM, thicknessM | Sa propre base et sa propre hauteur, en mètres — un nuage peut être plus bas ou plus haut que sa nappe |
widthM, depthM, rotationDeg | Son emprise, en mètres, et le cap vers lequel cette emprise est tournée |
density, darkness | Les siens ; une obscurité absente est celle de la couche |
{
"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
}
}
Un enregistrement dont la météo a été relevée (il a un
weatherSource) garde la réponse du relevé, pas un lien vers lui : ERA5 donne les
bandes basse, moyenne et haute en trois couches nommées record-low,
record-mid et record-high, la base basse estimée depuis l'écart entre
température et point de rosée, les deux autres à 3 500 m et 8 000 m. Leur type est
unknown (cirrus pour la haute), leur taille et leur densité sont des hypothèses de
dessin : une réanalyse sait quelle part de chaque bande était couverte, pas à quoi les nuages
ressemblaient. Redemandez le relevé depuis l'éditeur et les couches sont réécrites ; modifiez
une couche à la main et l'enregistrement devient celui de l'auteur, la source retirée.
D'où vient chaque valeur#
Toute valeur d'un enregistrement peut s'écrire nue, ou enveloppée de sa provenance :
{
"durationSeconds": {
"value": 15,
"basis": "derived",
"rationale": "13 à 18 s dans la synthèse de l'enquêteur ; le milieu retenu"
}
}
basis vaut stated (l'observateur l'a dit, et c'est ce que signifie
une valeur nue), derived (déduit de ce qu'il a dit et de quelque chose de
vérifiable : la largeur d'une route, une carte, un dessin mesuré ; rationale donne
le calcul) ou assumed (choisi pour que la reconstitution ait une valeur, sur rien
que l'observateur ait dit). La liste des valeurs assumed est la liste de ce qu'il
faut retourner demander à l'observateur ou au dossier : c'est pourquoi elle vaut d'être écrite
même quand rien d'autre ne l'est.
Vérifier un fichier#
Le format est aussi publié en JSON Schema, engendré depuis les mêmes types que le lecteur : toutes les clés qu'il connaît, ce que chacune peut contenir, et les mots qu'accepte une liste fermée. Une clé mal orthographiée ou une valeur inconnue y échoue. Il ne dit rien de ce qui peut être omis, question de sens à laquelle répond cette page. Pour voir le résultat, ouvrez le fichier dans le lecteur, depuis un lien, ou depuis votre disque avec les images et modèles qu'il nomme. Le lecteur le vérifie de la même façon au chargement, et dit derrière un ⚠ sur l'image ce qu'il n'a pas pu jouer comme écrit : une clé que rien ne lit, un mot hors de sa liste, et ce qu'il a dû inventer parce que la première keyframe d'une forme l'omettait (un champ tenu depuis la keyframe précédente relève de la règle ci-dessus, pas d'un problème).
Versions du format#
Un fichier indique la version de son format dans version : 2 depuis novembre 2026. C'est la version du FORMAT, pas celle d'UFO@home : ajouter un champ ne la
change pas, puisqu'un lecteur plus ancien ignore ce qu'il ne connaît pas. Elle ne change que le jour où un
champ change de sens ou de forme, et le lecteur lit alors les deux, l'ancienne par une conversion. La version 2 écrit
time et endTime en texte EDTF plutôt qu'en champs d'une date ({ "year": 1964, "month": 4, … }),
et place comme un lieu plutôt que comme une liste de positions portant chacune son nom, pour qu'un
enregistrement et un événement de RR0 disent « quand » et « où » de la même façon ; tout fichier de version 1 se joue
encore, converti à la lecture, ce qu'il disait de l'origine de ses valeurs conservé. Un fichier d'une version plus récente
que le lecteur est refusé avec un message qui le dit, plutôt que joué comme ce qu'il ne dit pas.
Chaque version a son schéma, à une adresse qui la nomme :
https://ufoathome.org/schema/2/sighting.schema.json (et
case.schema.json, interview.schema.json à côté).
/sighting.schema.json est toujours la version courante. Un fichier peut nommer
celle d'après laquelle il a été écrit dans "$schema", dont se servent des
éditeurs comme VS Code pour le vérifier pendant la frappe ; le lecteur ne le lit pas.
Un fichier entier#
Le plus petit enregistrement qui énonce encore quelque chose — un ovale silencieux traversant le ciel en douze secondes, à une date réelle et en un lieu réel. Tout le reste du format est facultatif, et tout ce qui suit sert à quelque chose :
{
"version": 2,
"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": "2024-08-12T22:30",
"durationSeconds": 12,
"utcOffsetHours": 2,
"place": {"name": "Grenoble, Isère, France", "locations": [{"lat": 45.19, "lng": 5.72}]},
"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 } }] }
}
Pour le modifier et le voir jouer, collez-le dans l'éditeur, qui complète sur chaque clé du format, propose les mots que chacune accepte, et dit ce que le modèle en dit.
C'est /demo-data/example-minimal.json
sur ce site : vous pouvez le récupérer, et
le jouer avant d'y toucher.
Remarquez que angular et bounds y figurent tous deux : l'angle est ce
que le fichier SIGNIFIE, et les pixels en sont redérivés au chargement — écrivez l'angle, et
laissez corriger une mauvaise estimation des pixels.
De plus gros, à lire#
Chaque démo de ce site est un simple fichier que vous pouvez ouvrir. Ces quatre-là valent la lecture pour voir comment un vrai enregistrement est bâti :
| Fichier | Ce qu'il faut y regarder |
|---|---|
observer-chiles.json | Un vrai dossier : un observateur, un identifiant de dossier partagé avec un second enregistrement, dix keyframes, un weatherTrack relevé avec son weatherSource |
sky-test-halos.json | Aucun phénomène : un ciel réglé une fois (une seule image clé de weatherTrack, un voile de cirrostratus et l'alignement de ses cristaux), photographié par un instrument, un téléphone, dont l'observerTrack tourne, s'incline, roule et zoome, et déplace avec lui les reflets de l'objectif |
sky-test-clouds.json | Trois couches nuageuses avec altitude, épaisseur, taille, densité et vent en mètres, évoluant sur la timeline météo — et dans la première une entrée instances : un nuage du champ, placé et dimensionné en mètres, qui grossit et s'assombrit sur les deux minutes |
sky-test-aircraft.json | Un instrument, un exposureSeconds et un iso, et un décor d'aéronef avec sa track et neuf lights à leurs cadences réelles, phares d'atterrissage compris |
sky-test-reentry.json | Aucun phénomène : des skyEvents avec une reentries, le lanceur de Zond 4 se désagrégeant au-dessus du Kentucky en 1968, son chemin dérivé, son horaire, ses hauteurs et son éclat supposés, chaque valeur avec sa provenance |
observer-csg2-falcon.json | Le compte rendu de Ron Lee (SeeSat-L) du deuxième étage qui a lancé CSG-2 (Falcon 9, 31 janvier 2022), vu depuis Falcon (Colorado) freinant pour quitter son orbite et vidangeant ses réservoirs en tournant : des skyEvents avec une launches munie de jets, l'orbite tirée des éléments Space-Track de CSG-2, le freinage, les vidanges et la rotation supposés avec leur provenance ; l'une des trois vues de case-csg2.json, les autres sa montée vue de Nassau et sa fin vue d'Oklahoma City, observateurs supposés |
sky-test-laser-meudon.json | Aucun phénomène : des skyEvents avec un beams, le laser vert de 10 W que l'Observatoire de Paris a tiré de sa coupole de Meudon à sa coupole de Paris le 9 octobre 2026, vu du parc de Meudon, la hauteur de l'émetteur et l'ouverture supposées avec leur provenance, la lumière calculée |
instrument-instamatic.json | La même observation que observer-socorro.json, à un champ près. Comparez les deux |
Quatre règles qui décident du sens d'un fichier#
- Les champs discrets sont tenus, les continus sont interpolés. Une forme
absente d'un keyframe ultérieur reste dans son état, et de même tout champ qu'un keyframe
omet dans une forme qu'il énonce : un keyframe qui ne donne qu'un nouvel
aimdéplace la forme et garde tout le reste (énoncerboundssansaimniangularest lu comme la déplacer par ses pixels) ; une forme dont le premier keyframe est à cinq secondes est déjà peinte, dans cet état, dès zéro. Pour qu'une chose cesse d'être visible, posez-lui un keyframe àtransparency: 1. - Des angles, rien d'autre. Aucune taille ni distance réelle n'est stockée
où que ce soit. Les mètres sont déduits, en inégalités, de ce que le phénomène a été déclaré
passer derrière ou devant (
decor[].occludesSourceIds). - L'énoncé l'emporte sur le déduit.
occludesSourceIdscontient des affirmations de l'observateur. Rien dans ce format ne peut les déduire : il décrit une apparence dans un champ de vision, pas une position dans l'espace. - Absent n'est pas zéro. Pas de piste sonore signifie que personne n'a posé
la question ;
kind: "none"signifie que l'observateur a déclaré n'avoir rien entendu. La même distinction traverse la météo et les nuages de glace.
Cette page est la référence du format. Le raisonnement derrière chaque champ est dans les commentaires de documentation de son type, que les extraits ci-dessus proposent à la complétion, et dans le code source.
Les composants#
Trois des éléments standards concernent une observation : la scène où elle est rejouée, le lecteur qui la montre, et l'éditeur qui la décrit. L'éditeur de dossier et l'éditeur d'interview ont leurs sections, sur les pages qui en parlent.
Standards, et c'est toute la conception#
Ce sont cinq composants web — le standard du navigateur pour un élément personnalisé, et non le composant du framework de quelqu'un. Ce qui en découle mérite d'être dit, car c'est ce qui permet de vous le remettre :
- Ils fonctionnent dans n'importe quelle page. Un site statique, WordPress,
une application React ou Vue, un wiki, un fichier HTML écrit à la main. Ce sont des
éléments : une page qui peut contenir une
<video>peut les contenir. - Rien à construire. Ni bundler, ni étape de compilation, ni configuration dans votre projet. Le module enregistre son élément à l'import et le navigateur fait le reste.
- Rien à suivre. Il n'y a pas de version de framework à faire correspondre : la version majeure de quelqu'un d'autre ne peut pas les périmer.
- Leur intérieur est à eux. Chacun porte son balisage et ses styles dans un shadow root : le CSS de votre page ne peut pas les casser, et eux ne peuvent pas casser votre page.
Ils se composent en ligne : <rr0-sighting> comme
<rr0-sighting-editor> contiennent un <rr0-scene>, et la
scène contient la couche de lecture — la chronologie, les commandes, le canevas du pointeur.
Tout ce à quoi la scène répond est donc disponible dans les trois — via .scene
et .scene.ufoElement depuis le plus extérieur, la composition vivant dans un
shadow root.
À quoi sert chacun#
<rr0-scene>— le phénomène dans le monde autour. La forme dessinée par un observateur, sa couleur, son halo, son mouvement, debout dans le ciel, l'horizon, la météo et le sol réels d'une date, d'une heure et d'un lieu énoncés — cachée par ce qui se tenait devant. Utile seul aussi, pour un ciel où il n'y a rien du tout.<rr0-sighting>— le compte rendu, à regarder. Une scène, plus qui témoigne, les métadonnées de l'observation, ses crédits, et les lignes qui permettent à un lecteur de l'emporter ailleurs. C'est à cela que ressemble une observation publiée.<rr0-sighting-editor>— le compte rendu, à reconstruire. Tout ce qui précède, plus la barre d'outils de saisie : décrire une observation, ou en corriger une.<rr0-case-editor>— un dossier, à assembler. Contient un<rr0-sighting-editor>et lui présente un enregistrement d'uncase.jsonà la fois : les comptes rendus des observateurs et les lectures qu'on en fait. Il les ajoute, les sélectionne et les supprime, et exporte le dossier.<rr0-date-input>— une date, avec sa précision. Un sélecteur pour un instant complet, un texte pour moins (EDTF), et le degré de certitude. Les éditeurs s'en servent pour le début et la fin d'une observation et pour la date d'un dossier ; il dit ce qu'il contient par un événementdatechange.
Comment ils s'emboîtent#
Vous n'écrivez jamais l'imbrication. Chaque élément construit celui du dessous dans son propre shadow root : ce que votre page contient, c'est une seule balise.
<rr0-sighting> qui témoigne, le panneau de métadonnées, les lignes d'intégration
└─ <rr0-scene> le ciel, l'horizon, la météo et le décor réels, le phénomène, la lecture
<rr0-sighting-editor> les huit panneaux de saisie
└─ <rr0-scene> une scène, pas une observation : un éditeur a sa propre barre d'outils
C'est pourquoi une seule balise de script embarque ceux du dessous :
| Charger ceci | enregistre |
|---|---|
/lib/rr0-scene.mjs | <rr0-scene> |
/lib/rr0-sighting.mjs | <rr0-sighting>, <rr0-scene> |
/lib/rr0-sighting-editor.mjs | <rr0-sighting-editor>, <rr0-scene> |
Une page qui montre une observation puis, plus bas, un ciel seul, n'a donc besoin que d'un script et de deux balises : le second élément est déjà enregistré.
On peut entrer dans une composition, une propriété à la fois :
const sighting = document.querySelector("rr0-sighting")
sighting.scene // le <rr0-scene> qu'il compose
sighting.scene.ufoElement // et la couche de lecture en dessous
sighting.scene.ufoElement.play() // la lecture est donc à deux propriétés
<rr0-sighting-editor> garde sa composition pour lui : ce qu'il offre à une
page, c'est l'enregistrement — sightingData — et l'événement qui dit qu'il a
changé.
Celui qu'il vous faut#
Ce ne sont pas des variantes d'un même bundle : chacun est autonome, ne chargez donc que celui dont vous avez besoin. Tous trois embarquent Three.js et un catalogue d'étoiles — c'est ce que coûte un vrai ciel.
| Ce que vous faites | Composant | Module | gzip |
|---|---|---|---|
| Montrer une observation d'ovni — un dossier, un article, un rapport | <rr0-sighting> | /lib/rr0-sighting.mjs | 249 Ko |
| Laisser quelqu'un en décrire ou en corriger une | <rr0-sighting-editor> | /lib/rr0-sighting-editor.mjs | 293 Ko |
| Montrer un ciel sans rien dedans — ce qu'un halo, une comète ou un passage satellite donnaient cette nuit-là | <rr0-scene> | /lib/rr0-scene.mjs | 238 Ko |
| Montrer une observation dans une scène à vous, sans barre d'outils par-dessus | <rr0-scene> | /lib/rr0-scene.mjs | 238 Ko |
| Vous ne savez pas | <rr0-sighting> | /lib/rr0-sighting.mjs | 249 Ko |
En poser un sur une page, c'est deux lignes.
Intégrer dans votre application#
Après npm install @rr0/ufoathome :
import "@rr0/ufoathome/scene" // enregistre <rr0-scene>
import "@rr0/ufoathome/sighting" // enregistre <rr0-sighting>
import "@rr0/ufoathome/editor" // enregistre <rr0-sighting-editor>
Ou recopiez le contenu des répertoires dist-embed* du paquet sur votre serveur et
pointez le <script src> dessus. Chaque module référence ses ressources —
catalogue d'étoiles, sons de météo — relativement à lui-même : il fonctionne donc
depuis n'importe quel chemin, il suffit de garder ensemble les fichiers d'un même
bundle. Plus rien ne dépend alors de ce site.
Langue#
Chaque libellé est traduit par détection, sans sélecteur : la langue déclarée par la page
d'abord — l'attribut lang le plus proche, donc <html lang="fr">
donne des libellés français — puis les préférences du navigateur, puis l'anglais. Une page qui
ne déclare rien retombe sur le navigateur, exactement comme avant.
<rr0-sighting>#
La vue standard d'une observation
Le choix par défaut pour une observation réelle, à un observateur ou plusieurs. Il compose un
<rr0-scene> et ajoute la barre d'outils : qui témoigne, et le panneau
i
avec les métadonnées de l'observation et ses crédits, et un bouton de partage : le lien qui la rejoue, et ses lignes d'intégration.
<rr0-sighting src="sighting.json"></rr0-sighting>
<rr0-sighting src="case.json"></rr0-sighting> <!-- un dossier, et tous ses observateurs -->
| Membre | Nature | Rôle |
|---|---|---|
src | attribut | Un enregistrement, ou un dossier dont les événements sighting en listent plusieurs — reconnus à leur forme. Un simple tableau d'enregistrements est refusé : listez-les comme événements sighting d'un dossier |
observerUrls | propriété | Les enregistrements à montrer, comme simple tableau d'URLs, au lieu de src. Le reposer garde l'observateur affiché si la nouvelle liste le contient encore |
sightingData | propriété | Un enregistrement posé directement — pour une page qui en tient un en mémoire plutôt qu'à une URL |
scene | propriété (lecture) | Le <rr0-scene> composé, et par scene.ufoElement les membres de lecture |
loadFromSrc(url) | méthode (async) | Ce que déclenche l'attribut |
show-labels | attribut | Le bandeau de chips qui énoncent l'enregistrement sous l'image, rangés par groupe (résumé, observation, position, moment, météo, son, observateur) : la date dite en toutes lettres avec son jour de la semaine, et un chip Descriptionqui montre les premiers mots du récit et ouvre le texte entier, défilant au-delà d'une hauteur maximale, à la place des chips. Absent par défaut sur l'élément — la page du lecteur l'active — et un lecteur peut l'ouvrir ou le fermer depuis le panneau i |
show-observer-map / hide-milestones | attribut | Transmis à travers le <rr0-scene> composé jusqu'au lecteur qui les porte |
start-time | attribut | Où l'enregistrement s'ouvre, comme une durée depuis son début : des secondes (125), 1:30, 1m30s ou une durée ISO 8601 (PT1M30S). Appliqué une fois, à l'enregistrement que l'élément charge ensuite ; une valeur au-delà de la fin ouvre à la fin |
start-clock | attribut | Où l'enregistrement s'ouvre, comme une heure dite pendant l'observation, à son heure locale : 02:33:15, ou avec le jour 2026-08-11T02:33:15. Le début de l'enregistrement la place ; elle l'emporte sur start-time quand elle le peut, et est ignorée pour un enregistrement qui ne dit pas son heure |
compare-account | attribut | Démarre avec le récit de l'observateur montré à côté de l'interprétation choisie, et mesuré contre elle |
Un enregistrement qui ne nomme aucun observateur n'affiche aucune ligne « compte rendu de » — ce qui est exact pour un ciel réglé pour montrer un halo.
L'enregistrement de chaque observateur est chargé dès que la liste est connue : en choisir
un autre est immédiat. La liste nomme chacun par son title, sinon ses prénoms et
son nom, sinon son id ; celui qui ne nomme personne est numéroté selon sa place
dans la liste.
Le panneau i
s'ouvre en popover, que ferment Échap ou un clic à
l'extérieur (seulement un clic à l'extérieur, sur un navigateur sans popover).
Il énonce le dossier, la date, le lieu, le compte rendu et les tags ; date, lieu et tags le
quittent tant que le bandeau show-labels les énonce déjà. La date est à l'heure de
l'observateur (utcOffsetHours, ou une heure approchée depuis la longitude), pas à
celle du lecteur. La version en pied de panneau ouvre cette observation dans l'éditeur. La description le
quitte aussi tant que les chips sont affichés : elle est dans leur boîte Résumé
, qu'un clic ouvre.
Le bouton Partager
, parmi ceux du lecteur, ouvre une seule fenêtre qui donne le lien ou le code d'intégration
(le code dans un éditeur qui passe à la ligne et qu'on peut modifier), pour le lecteur ou pour l'éditeur, avec
les options de la page de partage, chacune proposée telle que le lecteur est. Le code d'intégration charge l'élément depuis l'endroit d'où cette copie a elle-même été
chargée : un extrait copié depuis une copie locale ou de recette renvoie à cette copie.
Ce qu'il émet
| Événement | Quand | Où l'écouter |
|---|---|---|
observerchange | Quand l'enregistrement affiché change : chargé, posé par sightingData, ou un autre observateur choisi dans la liste. detail.src est son adresse, vide pour un enregistrement posé par script | Sur cet élément. Il n'est pas bubbling : écoutez sur le <rr0-sighting> lui-même, puis relisez son sightingData (sa description, son identifiant) |
recordingissues | Une fois un enregistrement chargé vérifié contre le format : detail.issues liste ce qui n'a pas été joué comme écrit (une clé que rien ne lit, une valeur du mauvais type ou hors de sa liste, une valeur inventée parce que le fichier l'omettait), chacun avec son kind et son path. Vide quand il n'y a rien à dire. La même liste s'affiche sur l'image derrière un ⚠, et en console | N'importe où au-dessus de l'élément : il traverse toutes les racines fantômes |
L'intégrer
<script type="module" src="https://ufoathome.org/lib/rr0-sighting.mjs"></script>
<rr0-sighting src="sighting.json"></rr0-sighting>
sighting.json est un fichier d'observation. Ou, après npm install @rr0/ufoathome : import "@rr0/ufoathome/sighting".
Le bundle pèse 249 Ko compressé et enregistre le tag lui-même — rien d'autre à appeler.
La présentation plus haut dit ce que cela suppose par ailleurs,
et partager une observation a l'exemple complet, à essayer et à copier.
<rr0-scene>#
Le phénomène, le ciel et le sol
La forme dessinée par un observateur, debout dans le ciel, l'horizon, la météo et le sol réels de la date, de l'heure et du lieu de l'enregistrement, cachée par ce qui se tenait devant — avec les commandes de lecture en dessous. C'est l'élément sur lequel les deux autres se construisent.
<rr0-scene src="sighting.json"></rr0-scene>
| Membre | Nature | Rôle |
|---|---|---|
src | attribut | URL d'un enregistrement, chargée à la connexion et à chaque changement |
sightingData | propriété | L'enregistrement comme objet simple (voir le format) — à relire après modification, ou à poser au lieu d'utiliser src |
loadFromSrc(url) | méthode (async) | Ce que déclenche l'attribut. À attendre quand l'enregistrement doit être arrivé avant toute autre chose |
ufoElement | propriété (lecture) | La couche de lecture qu'il compose — la chronologie, les commandes, le canevas du pointeur — et par elle tous les membres de lecture ci-dessous |
sceneRenderer | propriété (lecture) | Le moteur de rendu 3D, pour ce que rien d'autre n'expose |
show-compass | attribut | Les repères N/NE/E/… sur l'horizon. Absent par défaut : utile pour régler un cap, du bruit pour regarder |
star-catalog-src / deep-star-catalog-src | attribut | D'où charger le catalogue d'étoiles, quand vous en hébergez votre propre copie plutôt que celle posée à côté du bundle : le niveau de base (jusqu'à la magnitude 7,5, chargé par toute scène) et le niveau profond (de 7,5 à 9, chargé seulement par un enregistrement dont l'instrument va au-delà de 7,5) |
max-pixel-ratio | attribut | Le nombre maximal de pixels de l'écran par pixel CSS auquel la scène peut dessiner ; celui de l'écran, jusqu'à 2, s'il est absent. La scène le baisse d'elle-même tant que ses images sont en retard |
show-observer-map / hide-milestones | attribut | Transmis tels quels à la couche de lecture ci-dessous — à écrire sur la balise que votre page contient réellement |
Le survol nomme ce qui est sous le curseur — une étoile avec sa magnitude et sa hauteur, une planète, une comète, un bâtiment, un autre observateur — et ne dit rien là où le sol cache ce que vous pointez.
Le bouton ©
dans son coin liste les crédits de ce qu'il montre — l'imagerie du sol et
de la carte, les modèles, les photos du lieu, les sons. Dans <rr0-sighting>,
ce bouton est masqué : ils sont dans son panneau i
.
La lecture, sur ufoElement
Tout ce qui rejoue l'enregistrement vit une propriété plus bas, sur la couche de lecture —
scene.ufoElement.play() — la même que les deux autres composants atteignent par
leur propre scene.
| Membre | Nature | Rôle |
|---|---|---|
src | attribut | URL d'un enregistrement, chargée à la connexion et à chaque changement |
sightingData | propriété | L'enregistrement comme objet simple (voir le format) — à relire après modification, ou à poser au lieu d'utiliser src |
sighting | propriété (lecture) | Le modèle vivant : date et lieu réels, plus la chronologie de l'enregistrement |
loadFromSrc(url) | méthode (async) | Ce que déclenche l'attribut. À attendre quand l'enregistrement doit être arrivé avant toute autre chose — jouer avant sa résolution trouve une chronologie de longueur nulle |
play() / pause() | méthode | Dire quel état on veut, plutôt que basculer l'état courant |
togglePlayPause() | méthode | Ce que font le bouton et le clic |
playbackState | propriété (lecture) | "stopped", "playing" ou "paused" |
currentTime | propriété | La tête de lecture, dans les unités de la chronologie — pas des millisecondes réelles, voir positionLabel |
seekableDuration | propriété (lecture) | L'étendue que currentTime peut prendre |
autoReplayEnabled | propriété | La lecture en boucle, désactivée par défaut : une lecture se joue une fois puis émet ended. À mettre à true pour boucler |
positionLabel / durationLabel | propriété (lecture) | Position et durée déjà mises en forme : l'heure quand l'observation énonce une date et que sa durée est connue, le temps écoulé sinon. Un clic sur l'un des compteurs sous la barre (ou Entrée) bascule de l'un à l'autre, et émet timedisplaychange |
refresh() | méthode | Relit la durée et repeint — à appeler après avoir modifié sighting.timeline de l'extérieur |
canvasElement / renderer | propriété (lecture) | Le <canvas>, et ce qui peint dessus |
enableClickToPlay | propriété | Si un clic bascule la lecture et un double-clic le plein écran (les deux, ou aucun). Le double-clic remet aussi la lecture dans l'état où elle était avant son premier clic. À mettre à false là où le canevas vous sert à autre chose |
fullscreenTarget | propriété | Quel élément le bouton plein écran agrandit. <rr0-scene> y met sa propre scène, pour que ce soit le ciel qui s'agrandisse et non la seule surcouche. Là où le navigateur n'offre pas de plein écran (un iPhone, une iframe sans allow="fullscreen"), l'élément remplit la fenêtre à la place, et Échap en sort de même |
show-observer-map | attribut | Si la carte d'où se tenait l'observateur s'ouvre d'emblée : présent, il l'ouvre, "false" la garde fermée. Absent, l'enregistrement décide : son propre observerMap s'il en énonce un, sinon ouverte quand l'observateur s'est déplacé (une marche à travers champ, un trajet en voiture, un vol), fermée quand il est resté sur place. Il décide de l'état de départ de la carte, pas de son existence : le bouton est là pour tout enregistrement qui énonce un lieu |
toggleObserverMap() | méthode | Ce que fait ce bouton. Sur la carte elle-même, la molette zoome autour du pointeur, un glisser déplace le terrain, et ses propres boutons zooment et reviennent au trajet entier. Zoomée, elle se recentre sur l'observateur dès qu'il en atteint le bord, pour qu'il n'en sorte jamais |
observerPlacing | propriété | Si un clic sur le sol de la carte émet observerplace avec { lat, lng } — désactivé par défaut, car où se tenait l'observateur, c'est à l'enregistrement de le dire. L'éditeur l'active et écrit la position à la tête de lecture |
hide-milestones | attribut | Retirer les moments nommés du récit — les repères sur la barre, la légende qui nomme celui qu'on joue, et les points lettrés sur la carte. Ils sont là partout où un enregistrement en nomme, donc c'est la seule façon de dire le contraire |
toggleMilestones() | méthode | Ce que fait ce bouton |
Ces deux-là sont les seuls défauts positif et négatif de cet élément, et la différence est voulue. Les moments nommés d'un enregistrement sont ses propres mots sur lui-même : ils s'affichent partout où ils existent. La carte, elle, coûte des requêtes de tuiles à un tiers dès la première ouverture, et ce n'est pas à une page de les dépenser au nom d'un lecteur sans le dire. Dans les deux cas le lecteur garde les deux boutons, à côté de celui du plein écran : une page qui pose un défaut n'interdit pas le contraire.
La barre d'outils et les boutons du coin n'apparaissent que tant que le pointeur survole l'image, en lecture comme en pause, ou quand le clavier y amène le focus. Un écran tactile, qui n'a pas de pointeur pour survoler, les garde affichés.
Quand la barre de temps a le focus, les touches font comme sur un site de vidéos : ← recule de 5 s, → avance de 5 s, et Espace lance ou met en pause. Lancer ou mettre en pause, au clavier, au bouton ou d'un clic sur l'image, en montre le signe un instant au milieu de l'image.
Ce qu'il émet
| Événement | Quand | Où l'écouter |
|---|---|---|
ended | Une fois, quand la lecture atteint la fin sans boucler. Ni à la pause, ni à un déplacement manuel jusqu'à la fin | N'importe où : il est bubbling et composed, donc il sort de <rr0-scene> et de <rr0-sighting> et atteint l'élément que vous avez posé sur la page. C'est ainsi qu'on enchaîne plusieurs enregistrements |
timedisplaychange | Quand les compteurs basculent entre heure et temps écoulé | N'importe où, comme ci-dessus |
timeupdate | À chaque image de lecture et à chaque déplacement, avec detail.time | Sur cet élément seulement. Il n'est ni bubbling ni composed : une page qui tient un <rr0-scene> doit passer par son ufoElement — il est destiné aux éléments qui composent celui-ci |
L'intégrer
<script type="module" src="https://ufoathome.org/lib/rr0-scene.mjs"></script>
<rr0-scene src="sighting.json"></rr0-scene>
sighting.json est un fichier d'observation. Ou, après npm install @rr0/ufoathome : import "@rr0/ufoathome/scene".
Le bundle pèse 238 Ko compressé et enregistre le tag lui-même — rien d'autre à appeler.
La présentation plus haut dit ce que cela suppose par ailleurs,
et partager une observation a l'exemple complet, à essayer et à copier.
<rr0-sighting-editor>#
L'éditeur
Tout ce qui précède, plus la barre d'outils de saisie. À poser sur une page où l'on doit pouvoir décrire ou corriger une observation soi-même.
<rr0-sighting-editor></rr0-sighting-editor>
<rr0-sighting-editor src="sighting.json"></rr0-sighting-editor>
Son canevas est une surface d'édition : enableClickToPlay y est désactivé, un
clic sélectionne et déplace une forme au lieu de basculer la lecture. Ce que font les huit
groupes de sa barre d'outils est sur la page de l'éditeur.
| Membre | Nature | Rôle |
|---|---|---|
ufoElement | propriété (lecture) | Donne accès au canevas, à la chronologie et au travail d'apparence |
appearance | propriété | L'allure de la prochaine forme dessinée : { presetId, color, transparency, haloScale, blur, brightness }, presetId valant "oval" ou "polygon" et les autres étant les champs de forme de même nom. La poser ne prend que les champs donnés |
sightingchange | événement | Émis après chaque modification — le signal unique que l'enregistrement a changé |
Ce qu'il émet
| Événement | Quand | Où l'écouter |
|---|---|---|
sightingchange | Après une modification : un champ écrit, un instrument choisi, un fuseau dérivé, une forme déplacée sur la timeline | Sur cet élément. Il n'est pas bubbling : écoutez sur le <rr0-sighting-editor> lui-même, puis relisez son sightingData |
L'intégrer
<script type="module" src="https://ufoathome.org/lib/rr0-sighting-editor.mjs"></script>
<rr0-sighting-editor></rr0-sighting-editor>
Ou, après npm install @rr0/ufoathome : import "@rr0/ufoathome/editor".
Le bundle pèse 293 Ko compressé et enregistre le tag lui-même — rien d'autre à appeler.
La présentation plus haut dit ce que cela suppose par ailleurs,
et partager une observation a l'exemple complet, à essayer et à copier.
Sources et choix#
Rien de ce que l'outil dessine n'est inventé. Chaque valeur vient d'une source nommée, lue à un moment dit, et là où aucun relevé n'existe l'interface le dit au lieu de combler le vide.
Les principes#
- Une source n'est lue que quand on en a besoin. Les catalogues sont construits une fois dans le dépôt ; les services ne sont appelés que pour un enregistrement qui en a besoin (un lieu, une date dans leur période, un bouton pressé), et jamais pour une date antérieure au début de leur relevé.
- Ce qui peut disparaître est hébergé ici. Les données qu'un tiers pourrait retirer ou qu'un navigateur ne peut pas lire (éléments orbitaux, modèles 3D) sont copiées, réduites, et servies depuis ufoathome.org avec leur crédit, pour toute page qui intègre une scène.
- Le mesuré passe avant le modélisé, et le modélisé avant le supposé. Une brillance est une observation publiée quand il en existe une ; une formule ne comble que ce que personne n'a mesuré, et un objet sans l'un ni l'autre est calculé mais pas dessiné.
- Chaque service est remplaçable. Météo, relief, imagerie, lieu, fuseau, modèles et rédaction passent par un même registre : la source est un choix visible, avec son crédit à côté, et une seconde peut s'ajouter sans toucher au reste.
- Les limites sont dites. Chaque source ci-dessous dit où elle s'arrête : avant 1940 pour la météo, avant 1957 pour les satellites, avant février 2021 pour les passages individuels.
Le ciel · L'air · Satellites · Avions et traînées · Météo · Le sol · Lieu et heure · Décor, photos et son
Le ciel
| Source | Ce qu'elle fournit | Quand elle est lue | Hébergement et crédit | Choix et limites |
|---|---|---|---|---|
| astronomy-engine | Positions et magnitudes du Soleil, de la Lune et des planètes ; phase de la Lune ; coordonnées célestes ; et, pour une éclipse, quelle part du Soleil la Lune cache de ce lieu à cet instant. | Dans la page, pour tout enregistrement daté. | Bibliothèque embarquée, MIT. | Une éphéméride complète plutôt que des formules approchées : reconstituer un ciel n'a d'intérêt que s'il est juste. Sa précession ramène aussi les catalogues de l'an 2000 (étoiles, Galaxie, radiants de météores, novae) à la date observée. |
| HYG Database | Positions, magnitudes et couleurs des étoiles ; noms des étoiles jusqu'à la magnitude 3. | Construit une fois (build:stars). La page charge les étoiles jusqu'à la magnitude 7,5, et jusqu'à 9 seulement pour un instrument qui va aussi loin. | Servi avec le bundle de la scène. CC BY-SA. | Coupé à 9 parce que le catalogue lui-même s'éclaircit au-delà : les comptes d'étoiles cessent de croître comme ils le devraient. |
| JPL Horizons | L'orbite de chaque comète visible à l'œil nu depuis 1910, telle qu'elle était au périhélie de cette apparition. | Construit une fois (build:comets) ; la page propage l'orbite elle-même, sans requête. | Engendré dans le code. NASA/JPL. | La brillance n'est PAS prise chez JPL : ses paramètres de magnitude rendent NEOWISE 4 magnitudes trop faible. Les magnitudes au pic observées à l'époque sont saisies à la main, avec leur date. Une queue n'est dessinée que si sa longueur a été relevée. |
| AAVSO, via Strope, Schaefer & Henden 2010 | La courbe de lumière mesurée de chaque nova depuis 1891 ayant atteint la magnitude 5, regroupée à partir des observations de l'AAVSO. | Construit une fois (build:novae) avec les supernovae ci-dessous ; la page interpole la courbe, sans requête. | Engendré dans le code. Catalogue VizieR J/AJ/140/34. | Une courbe relevée plutôt qu'une formule de déclin : les lois usuelles ratent la plupart des vraies novae, et dessineraient DQ Herculis brillante pendant un an alors que la poussière l'avait éteinte de dix magnitudes en quelques semaines. Rien n'est dessiné avant la première observation ni après la dernière. RS Oph 2021 et T CrB 1866 reprennent la courbe de leur éruption précédente, recalée sur leur pic relevé. |
| Historical supernovae | Les supernovae de 1006, 1054, 1181, 1572, 1604 et 1987A : où elles se tenaient, et quel était leur éclat chaque nuit. | Construit une fois (build:novae). | Engendré dans le code. Positions de SIMBAD ; 1572 et 1604 réduites par Ruiz-Lapuente (2004, 2017) à partir des estimations de Tycho, de Kepler et des astronomes coréens ; 1006, 1054 et 1181 d'après les chroniques (Stephenson & Green) ; 1987A de l'Open Supernova Catalog. | Chaque courbe dit de quelle sorte elle est, car leur qualité varie de deux ordres de grandeur : 1054 et 1181 se résument à un pic et au jour où on les a vues pour la dernière fois, et le déclin de 1006 est emprunté à 1572, le même genre d'explosion. Les dates du calendrier julien sont lues comme telles. V1369 Cen (2013), dont le relevé AAVSO n'est pas accessible à un script et dont aucune table n'est publiée, est lue dans les marqueurs vectoriels d'une figure publiée (Izzo 2017, arXiv:1704.07214), dans la partie que cette figure montre. |
| IMO meteor shower list | Radiant, période d'activité, taux horaire au pic et vitesse des pluies annuelles ; un fond sporadique. | Table dans le code, calculée pour toute date. | Dans le code. International Meteor Organization. | Le taux horaire est une moyenne sur plusieurs années, pas une prévision pour une nuit : les sursauts et tempêtes n'y sont pas. |
| Global Meteor Network, trajectories | Les bolides que ses caméras ont triangulés depuis décembre 2018 : où chacun a commencé et fini, à quelle hauteur, combien de temps, et quel éclat au plus fort. | Réduite une fois (build:fireballs). Une scène ne charge que le mois de son enregistrement, et rien pour une date antérieure. | Servie depuis ufoathome.org/fireballs/, créditée dans les crédits du lecteur. CC BY 4.0. | Sur trois millions et demi de météores, seuls ceux de magnitude absolue -3 ou plus brillants sont gardés : les plus faibles sont le fond sporadique que la scène calcule. Au-delà de -9 ils sont écartés : passé -8, leur nombre cesse de baisser comme celui des météores et forme une traîne jusqu'à -45, la photométrie d'une caméra saturée. Un même événement résolu deux fois n'est gardé qu'une fois. L'éclat dessiné est celui du pic tout le long du chemin, adouci aux deux bouts, puisque le registre donne le pic et non la courbe de lumière. Les détections de FRIPON sont archivées aussi mais pas utilisées : son site demande d'être contacté pour tout usage. |
| Milky Way, zodiacal light, sky brightness | La lueur de la Galaxie et de la poussière zodiacale, et la brillance du ciel au crépuscule et au clair de lune. | Calculé dans la page, aucune donnée chargée. | Modèles tirés de la littérature : Leinert et al. 1998 et Hong 1985 (lumière zodiacale), Patat et al. 2006 et Krisciunas & Schaefer 1991 (brillance du ciel à laquelle les lueurs sont comparées ; la lumière du ciel lui-même est sous l'air). | Aucune photographie de la Voie lactée : une Galaxie modèle intégrée le long de la ligne de visée, confrontée à trois mesures plutôt qu'ajustée sur une seule. |
| World Atlas of the artificial night sky brightness (Falchi et al. 2016) | La brillance du ciel nocturne d'un lieu avec ses villes, le zénith d'une nuit sans lune en magnitudes par seconde d'arc carrée ; ce qui fait d'un ciel clair un ciel pollué. | Découpé une fois en petites tuiles (build:light-pollution). L'éditeur charge une tuile, quelques kilo-octets, quand un lieu n'a pas de valeur énoncée ; le lecteur lit la valeur que porte l'enregistrement. | Tuiles servies à côté de la page, puis par ufoathome.org, avec le crédit gardé dans leur index. L'atlas est sous CC BY-NC 4.0, une licence non commerciale : son usage sur un site public reste à trancher. | Une mesure de 2015 vaut pour toute date : l'atlas ne dit pas comment une ville s'est éclairée ou éteinte depuis. Ce n'est que ce que propose l'éditeur : une valeur énoncée par le témoin ou l'enquêteur (une lecture de Sky Quality Meter) l'emporte, et un enregistrement qui n'en a pas est joué sous un ciel naturel. |
| NASA LOLA shape map of the Moon (LDEM_16) | Le relief du bord de la Lune, pour que le limbe ne soit pas un cercle parfait : les montagnes et les cratères qui laissent passer la dernière lumière du Soleil en grains de Baily. | Découpé une fois (build:lunar-limb) en un fichier chargé avec la scène, la première fois qu'une éclipse approche de la totalité. | Servi avec le bundle de la scène, environ 2 Mo. NASA, Planetary Data System. | 16 échantillons par degré, et seulement la bande où le limbe peut tomber (libration et parallaxe de l'observateur comprises), gardée en unités de 100 m : assez pour les grains, une fraction de la carte de 33 Mo. Quelle éclipse il y a, et quelle part du Soleil est couverte, n'est jamais listé : cela se calcule depuis les positions réelles des deux astres. |
L'air
La lumière du ciel est calculée, pas dessinée : lumière du Soleil et de la Lune suivie à travers une atmosphère sphérique d'air, de brume et d'ozone à quinze longueurs d'onde, puis montrée comme la verrait un œil adapté ou un appareil photo. Chaque entrée ci-dessous est une mesure ou un modèle publié ; les deux ancres d'affichage sont les seuls choix.
| Source | Ce qu'elle fournit | Quand elle est lue | Hébergement et crédit | Choix et limites |
|---|---|---|---|---|
| Hillaire 2020; Bruneton & Neyret 2008 | La méthode : diffusion simple le long de chaque ligne de visée, et tous les ordres supérieurs réunis dans une table de la lumière qui arrive à chaque altitude pour chaque hauteur du Soleil. | Tables construites sur la carte graphique une fois par page et par niveau de brume (environ une seconde de GPU, partagée par toutes les scènes de la page) ; la vue du ciel redessinée quand le Soleil, la Lune ou l'observateur bougent. | Implémenté dans le code, deux fois : une référence en TypeScript et son jumeau GPU. | Choisie parce qu'assez rapide pour une page web. Confrontée à un calcul de Monte Carlo de la même atmosphère : à 0,25 magnitude et 0,012 de couleur près d'un midi brumeux à un Soleil à -16°, sauf l'ombre de la Terre au crépuscule nautique, trop sombre de 0,7 magnitude. La résolution des tables a été mesurée, pas choisie : des tables plus grossières faussaient un zénith à -10° de plus d'une demi-magnitude. |
| Bodhaine et al. 1999 | La force avec laquelle l'air diffuse la lumière à chaque longueur d'onde. | Calculé dans la page. | Formule tirée de l'article. | Déduite de l'indice de réfraction de l'air, mesuré avec de nombreux chiffres : rien à ajuster. |
| Serdyuchenko-Gorshelev ozone cross-sections | L'absorption de l'ozone dans le visible (la bande de Chappuis), qui rend bleu un zénith crépusculaire. | Moyennées une fois dans le code. | IUP Brême, Gorshelev et al. 2014 et Serdyuchenko et al. 2014 (Atmos. Meas. Tech. 7). | Prises à 223 K, la température de la stratosphère ; la bande varie de 3 % au plus entre 193 et 293 K. Sans elle, un zénith six degrés après le coucher sort presque blanc (Hulburt, 1953), et un test vérifie que c'est le cas. |
| ASTM E 490-00a | La lumière du Soleil au-dessus de l'atmosphère, longueur d'onde par longueur d'onde. | Moyenné une fois dans le code. | Le tableau 3 de la norme. | Moyenné sur 20 nm, ce qui efface les raies de Fraunhofer : juste pour un ciel, faux pour un spectrographe. Il redonne l'éclairement mesuré du Soleil, 128 à 133 mille lux, ce qu'un test vérifie. Le ciel de la Lune utilise le même spectre, réduit selon la magnitude de la Lune. |
| Kasten 1969; Hänel 1976 | La blancheur du ciel clair : l'épaisseur optique de la brume, tirée de l'humidité relative du relevé météo. | Avec la météo : l'humidité vient de la température et du point de rosée d'ERA5 (formule de Magnus, Alduchov & Eskridge 1996). | Loi de croissance tirée de la littérature. | Les particules de brume gonflent d'eau à mesure que l'air approche de la saturation ; une charge continentale typique gonfle comme (1 - humidité) à la puissance -0,3, ce qui donne le 0,1 habituel à 50 %. Le nombre de particules (une ville, un feu, l'histoire du vent) n'est dans aucun relevé et n'est pas deviné. Plafonnée à 95 % : au-delà, c'est de la brume de rosée. |
| Patat et al. 2006 (Paranal) | La brillance mesurée du zénith pendant le crépuscule, la vérification qu'un vrai ciel apporte au modèle. | Dans les tests, et dans la page pour savoir si la Voie lactée et la lumière zodiacale pouvaient être vues. | L'ajustement en bande V de l'article, tableau 1. | Jamais ajustée : le modèle la rejoint à une demi-magnitude près de -6° à -16°. Lire l'ajustement publié a aussi corrigé une table de l'outil qui rendait le crépuscule civil dix fois trop sombre. |
| Krawczyk et al. 2005; Thompson et al. 2002 | Comment un œil adapté à ce ciel le montre : une réponse compressive qui suit la luminosité du ciel lui-même, et le passage à un gris-bleu sombre quand les bâtonnets prennent le relais. | Dans la page, pour chaque pixel du ciel. | Mélange des bâtonnets d'après Krawczyk, Myszkowski et Seidel ; bleu nocturne d'après Thompson, Shirley et Ferwerda, pris à mi-chemin du blanc. | Les seuls choix de la chaîne, dits comme tels : le zénith d'un jour clair et celui d'une nuit sans Lune sont fixés là où l'outil les montrait avant, et tout le reste suit. Un appareil photo (un support d'enregistrement) n'a pas de bâtonnets, et son gain sur l'œil éclaircit ce qu'il enregistre. |
Satellites
Deux niveaux. Pour toute date depuis Spoutnik, ce que permettait l'ombre de la Terre et combien d'objets étaient en orbite. Depuis février 2021, quels satellites ont réellement traversé le ciel, où, et avec quelle brillance.
| Source | Ce qu'elle fournit | Quand elle est lue | Hébergement et crédit | Choix et limites |
|---|---|---|---|---|
| CelesTrak SATCAT | Date de lancement et de rentrée de chaque objet suivi : le nombre en orbite chaque mois, et quand chaque classe a existé (Echo, flashs d'Iridium, ISS, Starlink). | Construit une fois (build:satellites) ; donne aussi les dates de lancement à l'archive d'éléments orbitaux. | Engendré dans le code. CC BY 4.0. | Seules les deux colonnes de dates sont lues ici (la liste des rentrées ci-dessous lit aussi l'inclinaison). Ses colonnes d'orbite décrivent le DERNIER état de chaque objet : Echo 1 y figure à 400 km alors qu'il volait vers 1 500. Les débris ne sont pas comptés. |
| CORDS, The Aerospace Corporation | Chaque rentrée qu'elle a suivie depuis 2000 : son heure prévue avec l'incertitude annoncée, et pour une centaine l'heure à laquelle on l'a vue retomber et d'où. | Réduite une fois (build:reentries), avec les jours de rentrée du SATCAT pour toutes les années depuis 1957 ; l'éditeur ne charge que l'année de l'enregistrement. | Servie depuis ufoathome.org/reentries/. | Archivée à la main, parce que le site n'est pas lisible par un script. Une rentrée est énoncée avec sa précision et rien de plus fin : une observation au registre à moins d'une heure et de 1 500 km, une prévision dont la fenêtre rencontre l'observation, ou un simple jour de rentrée. Seule la première dit qu'elle a pu traverser ce ciel. Une orbite dont l'inclinaison la tient hors de vue de la latitude de l'observateur n'est jamais listée : le freinage abaisse une orbite sans changer son plan, c'est pourquoi cette seule colonne d'orbite du SATCAT est lue. |
| Orbital element archive, Laurent Chabin (SCEAU) | Les jeux d'éléments publics sauvegardés une ou deux fois par jour depuis le 22 février 2021 : la liste visible à l'œil nu, tous les Starlink, et jusqu'en janvier 2025 le catalogue complet. | Réduite une fois (build:tle). La page ne charge que les deux semaines autour de l'observation, et seulement pour une date couverte par l'archive ; le propagateur lui-même n'est chargé qu'alors. | Servie depuis ufoathome.org/tle/, créditée dans les crédits du lecteur. | Hébergée ici parce que le serveur d'origine n'est pas lisible depuis un navigateur. 2,8 Go de relevés sont gardés en 113 Mo : chaque jour pour les objets visibles et les Starlink dans leurs 60 premiers jours (les trains), un jeu par semaine sinon. Les débris et les objets que personne n'a mesurés sont écartés. Un jeu n'est jamais utilisé à plus de 7 jours de son époque : un trou dans l'archive (trois mois fin 2025) est signalé comme un trou plutôt que comblé par une orbite périmée. |
| satellite.js (SGP4) | Le propagateur standard de ces éléments, et la position du Soleil ; l'ombre et la pénombre de la Terre sont calculées par-dessus. | Chargé à la demande, pour les dates couvertes seulement. | Bibliothèque embarquée, MIT. | Maintenu sur la version qui précède celle qui embarque une version WebAssembly qui casse le bundle, sans gain ici. |
| Satellite brightness: McCants, Stellarium, Mallama et al. | La brillance apparente de chaque objet : magnitudes standard (McCants, complétées par la liste de Stellarium pour les objets récents), et moyennes publiées pour les constellations absentes de ces catalogues (Starlink, OneWeb, BlueBird). | Fusionnées dans l'archive à la construction ; appliquées dans la page. | Starlink 5,93 puis 7,21 (arXiv:2006.08422, 2101.00374), 4,58 sous 357 km pendant la montée en orbite (2405.12007) ; OneWeb 7,18 (2012.05100) ; BlueBird 3,77 puis 4,32 (2608.23668). | Sans la valeur de montée en orbite, aucun train de Starlink ne serait jamais dessiné. Un étage de fusée non mesuré prend la médiane d'au moins trois étages identiques mesurés ; tout autre objet non mesuré est calculé mais pas dessiné. Les reflets et flashs ne sont pas modélisés : ils ne peuvent que rendre un satellite plus brillant. |
Avions et traînées
Depuis 2022, les avions qui étaient dans le ciel de l'observateur à l'heure d'un enregistrement, l'air dans lequel ils volaient, et la traînée que leurs moteurs y laissaient. Ce qui est dessiné est un candidat compatible, jamais une identification, et un ciel vide dans le relevé n'exclut rien.
| Source | Ce qu'elle fournit | Quand elle est lue | Hébergement et crédit | Choix et limites |
|---|---|---|---|---|
| adsb.lol open history | Où était chaque avion qui a émis sa position, depuis 2022 : sa trace, son type, son immatriculation et sa catégorie. Chacun est dessiné à sa vraie taille, avec ses feux (à la nuit tombée, selon le type d'appareil), le Soleil qui l'éclaire encore quand le sol l'a perdu, la brume entre lui et l'observateur, et le son qu'il fait s'il peut être entendu. | Réduit une fois par jour (build:aircraft) en un fichier compacté par heure et par tuile d'un degré. La page ne lit que les tuiles à moins de 150 km de l'observateur, pour l'heure de l'enregistrement et les cinq minutes qui la précèdent, et jamais pour une date antérieure à 2022. Le code qui dessine, étiquette et fait entendre les avions n'est chargé que si une scène en a. | Construit à partir des publications quotidiennes de l'historique d'adsb.lol (ODbL 1.0), crédité dans les crédits du lecteur. Pas encore hébergé : tant que l'archive n'est pas servie depuis ufoathome.org/aircraft/, les avions ne s'affichent qu'à partir d'une copie locale. | Une seule instance suffit : prod-0, avec staging-0 en repli, contiennent les mêmes vols à 0,02 % près. Seules les positions du jour UTC propre à une publication sont gardées, pour que le résultat ne dépende pas de l'ordre dans lequel les jours ont été lus ; les véhicules d'aéroport sont écartés. Ce qu'aucun récepteur n'a entendu est absent : avions légers, planeurs, ballons et militaires qui coupent leur transpondeur sont sous-représentés, et un avion sur sept n'indique aucun type, donc il est dessiné comme un avion de ligne générique. |
| amvlab aircraft models (A320, 737, A350, A380, 787) | La cellule d'un Airbus A320, A350 ou A380, ou d'un Boeing 737 ou 787, pour un avion de ces types assez proche pour que sa forme se voie : réacteurs, bouts d'ailes, empennage. | Chargé par la page seulement pour un avion de ces types à moins de 130 fois sa propre longueur de l'observateur (5 km pour un A320, 10 km pour un A380), une fois pour la scène (170 à 250 Ko chacun). Plus loin un avion fait quelques pixels, et la forme intégrée avec ses feux est dessinée. | Réhébergés sur ufoathome.org/models/ avec leur licence, CC BY 4.0, © 2026 amvlab, et crédités dans les crédits du lecteur. | Les variantes sans livrée, puisque la compagnie n'est pas connue. Un modèle pour toute la famille A320, un pour tous les 737, un pour l'A350 (-900 et -1000), un pour l'A380 et un pour le 787 (-8, -9 et -10), chacun mis à l'échelle de la longueur réelle du type (un A321 est le modèle A320 dessiné plus long). Quelle variante chacun représente, et avec quelle fidélité, leur auteur ne le documente pas. Tous les autres types gardent la forme intégrée : un modèle est une entrée de catalogue et une ligne d'un tableau, pas du code. |
| Open-Meteo, historical forecast API | Température, humidité et vent à 500, 400, 300, 250, 200 et 150 hPa, heure par heure, depuis 2022 : l'air dans lequel les avions volent. | Chargé par la page, une fois par enregistrement qui a des avions, pour le lieu de l'observateur et les heures de la fenêtre : jamais pour une date antérieure à 2022, ni pour une scène sans avion. | Open-Meteo.com, CC BY 4.0, sans clé, crédité dans les crédits du lecteur. | Pas la réanalyse qu'utilise la météo : son archive ne sert aucun niveau de pression. Ce sont les analyses propres aux modèles de prévision, connues pour sous-estimer la fréquence à laquelle l'air est sursaturé en glace à l'altitude de croisière : une traînée qui dure dans le ciel peut donc être une traînée que le relevé dit ne pas devoir durer. Lu au lieu de l'observateur seulement : un avion à cent kilomètres vole dans un air que le modèle peut décrire autrement. L'humidité est relative à l'eau (vérifié sur le plafond que font les données à la saturation par rapport à la glace, près de 60 % à -47 C). |
| Schmidt-Appleman criterion (Schumann 1996) | Si l'échappement d'un moteur laisse une traînée dans cet air, et si elle dure. L'échappement se refroidit le long d'une droite fixée par le rendement du moteur et la pression ; une traînée se forme si cette droite croise la saturation par rapport à l'eau, et elle ne dure que là où l'air est saturé par rapport à la glace. | Calculé dans la page pour chaque position de chaque avion, à la pression que donne son altitude barométrique (une altitude barométrique est une pression), et emporté par le vent de ce niveau. Une traînée qui dure vit tant que l'air à sa hauteur reste sursaturé, lu heure par heure dans le relevé, et s'étale de plus en plus vite sous le cisaillement du vent et la turbulence, s'amincissant en s'élargissant ; sa lumière est celle du Soleil diffusée par la glace, plus vive vers le Soleil. Les avions de l'heure qui précède l'enregistrement sont demandés pour leurs seules traînées, quand le relevé tient cette heure. | Formule et constantes dans le code, avec les pressions de saturation de Murphy et Koop (2005). | Le moteur est un moteur typique du type d'appareil, pas celui de cette cellule : rendement global 0,38 pour un gros-porteur, 0,34 pour un monocouloir, 0,30 pour un jet d'affaires, 0,22 pour un chasseur. Hélices, rotors, planeurs et ballons n'ont aucune traînée. La façon dont une traînée vieillit est une paramétrisation d'ordres de grandeur observés, pas une simulation : sa largeur croît avec le cisaillement du vent entre les deux niveaux encadrant l'avion (de combien le vent change avec la hauteur) et une diffusion turbulente fixe, sa profondeur est supposée, et elle est dessinée aussi large en travers de la ligne de visée quel que soit le sens du cisaillement ; son estompage et la durée d'une traînée courte sont supposés aussi. Une traînée dessinée est estimée, jamais un fait ; et celle d'un avion déjà parti avant les cinq minutes demandées au relevé manque. |
Météo
| Source | Ce qu'elle fournit | Quand elle est lue | Hébergement et crédit | Choix et limites |
|---|---|---|---|---|
| Open-Meteo: ERA5 (Copernicus/ECMWF), then its forecast model for the last days | Couverture nuageuse horaire par étage, précipitations, neige, code météo, vent, température et point de rosée, au lieu et à l'heure de l'observation. | Chargé par l'éditeur dès qu'une date et un lieu sont connus, à partir de 1940 seulement. Pour les cinq derniers jours, qu'ERA5 n'a pas encore rattrapés, c'est l'analyse du modèle de prévision qui est lue (le fichier dit laquelle a répondu). | API d'archive et de prévision d'Open-Meteo, sans clé. © Copernicus/ECMWF. | Une réanalyse sur une grille de ~28 km, pas une station : une averse locale peut manquer. Les bases des nuages sont déduites (température et point de rosée pour l'étage bas), pas mesurées. Chaque champ peut être déverrouillé et remplacé par le compte rendu. Aucun profil vertical n'est disponible en archive, ce qu'il faudrait pour les anomalies de propagation radar. |
Le sol
| Source | Ce qu'elle fournit | Quand elle est lue | Hébergement et crédit | Choix et limites |
|---|---|---|---|---|
| IGN LiDAR HD (bare-earth model, MNT) and RGE ALTI | Le relief autour de l'observateur en France, tel que le laser a mesuré la terre nue, un point par mètre : arbres et toits retirés. | Chargé avec le relief, une image du carré à quatre mètres le pixel (moins d'un mégaoctet), d'abord du laser puis, là où il n'a pas encore volé, du RGE ALTI, l'ancien modèle au mètre qui couvre tout le pays. | © IGN, Licence Ouverte 2.0, servi par le WMS de la Géoplateforme, qui répond aux navigateurs de partout. Hors de France, ou quand le service ne répond pas en douze secondes, le relief mondial ci-dessous est utilisé. | Le relief mondial est un modèle de la surface à quinze mètres le pixel : mesuré contre le laser, il s'écarte d'un mètre ou deux près de l'observateur, et de cinq à vingt mètres sous la forêt ou près d'une route en remblai, ce qui enfonce ou soulève tout bâtiment posé dessus. La grille n'est jamais mêlée de deux relevés sommet par sommet, ce qui dessinerait leur raccord en falaise. Là où il répond, le sol est un maillage d'un sommet tous les sept mètres, et non 28 : une route en remblai fait trente mètres de large, et un maillage plus gros enfonçait l'autoroute de Silly-le-Long de deux mètres et la faisait cahoter sur son parcours. Là où le laser a vu le tablier d'un pont, le sol est relevé jusqu'au tablier (le laser retire les ponts de la terre nue, si bien que la route plongerait sinon dans une tranchée à chaque passage supérieur) ; un viaduc au-dessus d'une large vallée y laisse une digue large d'un tablier. Pour un observateur immobile dont le décor s'étend au-delà des 900 premiers mètres (les silos à l'horizon de Maffliers), le patch de sol réel est élargi, à 3 km au plus, pour que ce qui s'y dresse repose sur le relief et non sur un disque plat ; les patchs d'un trajet le suivent et ne sont pas élargis. |
| AWS Terrain Tiles (SRTM, ETOPO1) | Le relief autour de l'observateur. | Chargé quand une scène a un lieu réel, hors de France ou partout où le relief de l'IGN ci-dessus ne répond pas. | Amazon S3, sans clé. © AWS Open Data. | Ni clé ni limite de débit, ce qu'exige un composant intégrable. Le modèle de relief est trop grossier pour les arbres et bâtiments : une photo des lieux recalée dans la scène est le moyen de les énoncer. |
| Esri World Imagery | L'imagerie aérienne posée sur le relief, et la carte de l'observateur. | Chargée avec le relief, et à l'ouverture de la carte. | Tuiles Esri, sans clé. © Esri, Maxar, Earthstar Geographics. | Une photographie actuelle du sol, quelle que soit l'année du récit ; la scène l'assombrit selon l'heure. EOX Sentinel-2 sans nuages peut être choisi à la place. |
Lieu et heure
| Source | Ce qu'elle fournit | Quand elle est lue | Hébergement et crédit | Choix et limites |
|---|---|---|---|---|
| Nominatim (OpenStreetMap) | Chercher un lieu par son nom, et nommer un point. | Seulement quand l'auteur valide ou presse le bouton de recherche, jamais à chaque frappe. | © les contributeurs d'OpenStreetMap. | Il connaît hameaux, fermes, routes et aérodromes, là où les récits se passent ; sa politique d'usage explique que rien ne parte pendant la frappe. |
| Open-Meteo time zones and the IANA database | Le fuseau horaire d'un lieu, puis son décalage légal à la date du récit. | Dès qu'un lieu est connu ; le décalage historique vient du navigateur. | © Open-Meteo ; base tz du navigateur. | Le décalage actuel n'est jamais utilisé pour une date ancienne : la France était à UTC+1 toute l'année en 1965. |
Décor, photos et son
| Source | Ce qu'elle fournit | Quand elle est lue | Hébergement et crédit | Choix et limites |
|---|---|---|---|---|
| IGN LiDAR HD (canopy height model and classification) and BD TOPO (map vectors) | Les arbres, bâtiments, ponts et lignes aériennes autour d'un lieu, à leur place, leur hauteur et leur largeur mesurées : du laser, la hauteur de tout ce qui dépasse du sol et ce que chaque point a été pris pour (plante, toit), sous forme d'images d'un carré de cent mètres ; de la carte (BD TOPO), l'axe de chaque pont, la largeur de la route qu'il porte, et chaque ligne électrique avec sa tension ; les noms de ce qu'elle nomme (une mairie, une poste, la route que porte un pont). En France les routes de la scène viennent de la même carte, avec leurs noms, et non d'OpenStreetMap, avec un trottoir de chaque côté de ses rues urbaines (la carte dit lesquelles le sont), et de la peinture sur les routes goudronnées assez larges pour deux sens : selon ce que la carte dit de chaque tronçon : une chaussée d'autoroute a ses rives continues (celle du terre-plein, et celle de la bande d'arrêt là où finissent ses voies) et une ligne discontinue entre ses voies ; une route à double sens a son milieu en tirets, continu dans les virages, et ses rives continues à partir de sept mètres ou 80 km/h, en tirets courts en dessous ; une route de quatre voies a une double ligne continue au milieu ; rien sur un rond-point, un chemin ou une piste. Là où la carte ne donne ni voies ni sens (les routes d'OpenStreetMap n'en ont souvent pas), la route est peinte comme toute route large, une ligne de rive de chaque côté et le milieu en tirets. La carte n'a pas de glissières : une est dessinée, à mi-chemin, entre deux chaussées d'autoroute qui vont en sens inverse côte à côte. Le tout sur un grain moucheté d'asphalte, à moins de 450 m du patch de sol, et son code n'est chargé que pour une scène qui a une telle route. | D'elle-même, du relevé que l'auteur a choisi avec le sélecteur à côté de la liste (le laser et la carte ensemble par défaut, l'un ou l'autre seul, ou aucun), quand l'auteur donne à l'enregistrement un lieu que le relevé couvre (la France, une boîte que le service resserre lui-même en ne répondant rien là où il n'a pas volé), un instant après le dernier changement de lieu ; jamais quand un enregistrement est seulement chargé. | © IGN, Licence Ouverte 2.0, servi par le WMS de la Géoplateforme, qui répond aux navigateurs de partout. La date du relevé n'est pas donnée par le service. Les ponts et les lignes viennent du WFS de la même Géoplateforme ; les pylônes sont aux sommets de la ligne tels que la carte la trace, de 22 m pour 90 kV là où le laser ne les a pas mesurés. | Le modèle de hauteur seul prend un toit comme un chêne (291 m à la tour Eiffel) : la classification est donc demandée aussi, et seules ses plantes et ses toits sont gardés. C'est un balayage d'un jour, et un enregistrement est d'un autre : ce qu'il apporte est marqué comme venant d'un relevé, remplacé quand le lieu change, et laissé tel quel là où l'auteur a placé des arbres ou des bâtiments. |
| IGN aerial photograph (ORTHOIMAGERY.ORTHOPHOTOS) | La couleur du toit de chaque bâtiment, vu d'en haut : la médiane de la photographie sous son contour, sans les verts, un peu relevée car la photographie est déjà éclairée par le soleil. | Avec le décor d'un relevé (voir ci-dessus), dans la même requête : un carré d'au plus mille pixels. | © IGN, Licence Ouverte 2.0, du WMS de la Géoplateforme. La photographie est du jour du vol, pas de l'enregistrement. | La forme d'un toit (plat, deux pentes, quatre pentes, sens du faîte) est lue dans les hauteurs du laser à l'intérieur du contour, dans 150 m seulement ; un toit qu'on ne sait pas lire reste une boîte plutôt qu'une supposition. |
| INSEE, Enquête Emploi du temps 2009-2010 (via Rauch, Économie et statistique 522-523, 2021) | Quand les gens d'une ville sont debout, pour le nombre de fenêtres allumées de ses bâtiments selon l'heure de l'horloge : la moitié dort à 22 h 40, la moitié est levée à 7 h, neuf sur dix dorment de 1 h à 6 h. | Intégrée aux fenêtres allumées de la scène ; rien n'est téléchargé. | Publiée par l'INSEE ; seuls les trois chiffres ci-dessus sont utilisés. | L'enquête donne des médianes et une borne, pas une courbe : la dispersion autour des médianes, les deux sur cent toujours debout et la moitié des fenêtres allumées quand tout le monde est debout sont des hypothèses, et l'emploi du temps de la France est pris pour n'importe quel lieu. |
| OpenStreetMap buildings (Overpass) | Les bâtiments autour d'un lieu partout dans le monde, tels que les bénévoles d'OpenStreetMap les ont dessinés : chaque contour en un rectangle (ou des rectangles), sa hauteur là où elle est donnée (height, building:levels), son toit (roof:shape, roof:height, roof:colour), la couleur et la matière de ses murs, son nom. Pas d'arbres. | D'elle-même, pour un lieu hors de portée des relevés de l'IGN quand aucun relevé n'a été choisi (ou quand le laser de l'IGN se révèle ne pas avoir volé là, comme sur la Belgique), ou quand l'auteur la choisit dans la liste des relevés. | © contributeurs d'OpenStreetMap (ODbL), par les instances publiques d'Overpass, une requête à la fois comme les routes. Elles sont chargées : les bâtiments d'une ville peuvent prendre une minute ou plus, et le spinner sur l'image peut être arrêté en choisissant « Aucun ». | La plupart des bâtiments ne portent que building=yes : ils sont dessinés aux mesures ordinaires (deux étages, un toit plat, un enduit clair). Seul ce qui est écrit est dessiné comme écrit. La couverture vaut celle des bénévoles : une ville belge compte 4 600 bâtiments dans un kilomètre carré et demi, un village de l'Ouest américain une poignée. |
| OpenStreetMap street lamps (Overpass) | Les lampadaires publics autour d'un lieu : chaque lampadaire cartographié (highway=street_lamp), et un lampadaire tous les 35 m, de part et d'autre en alternance, le long de chaque rue marquée lit=yes. Ils s'allument avec la nuit (le Soleil sous l'horizon), et les huit plus proches éclairent la scène. | Avec le décor d'un relevé (voir ci-dessus), au même moment. | © contributeurs d'OpenStreetMap (ODbL), par les instances publiques d'Overpass, une requête à la fois comme les routes. | Les bénévoles marquent une rue comme éclairée bien plus qu'ils ne placent ses lampadaires (trois lampadaires et huit rues éclairées au centre de Saint-Lô) : les lampadaires le long des rues éclairées sont donc dessinés, pas relevés. Une rue non marquée n'est pas forcément sombre. Beaucoup de villes françaises éteignent leur éclairage la nuit : un enregistrement d'une telle nuit doit avoir ses lampadaires retirés ou éteints. |
| 3D models (Kenney, Jagobo, Jungle Jim, Nicholas-3D, amvlab, Poly by Google, MakeHuman) | Voitures, une maison, des arbres, un lampadaire, des avions de ligne (A320, 737, A350, A380, 787), des personnes ; et les engins et êtres des dossiers, construits par le projet d'après leurs récits. | Quand un objet du décor ou un corps nomme un modèle ; le catalogue lui-même est lu une fois. | Réhébergés sur ufoathome.org, chacun avec son fichier de licence : CC0 (Kenney, MakeHuman et les modèles du projet), CC BY 4.0 (les arbres, les avions d'amvlab, le poste de pilotage d'A320 de davidmarton1987), CC BY 3.0 (Poly by Google). Le catalogue est lu d'abord dans /models/index.json à côté de la page, puis sur ufoathome.org : un site peut en servir sa propre copie. Chaque crédit est affiché dans les crédits du lecteur. | Hébergés ici parce que les kits libres sont sur des miroirs à la pérennité incertaine. Un modèle au crédit inconnu n'est pas dessiné ; les modèles de Google Earth ont été écartés pour leur licence, et l'arbre feuillu stylisé parce qu'il n'était pas assez réaliste. Les personnes sont construites avec les seuls assets système de MakeHuman, sous licence CC0 : les packs de la communauté ne sont pas utilisés, leurs licences diffèrent. Un engin ou un être est fait d'après les documents de son dossier par un script qui dit lesquels de ses détails sont supposés, et tout meilleur modèle le remplace en prenant son id. Chaque modèle est une doublure du bon genre, pas d'une marque ni d'une année précises, et le sélecteur le dit. Un modèle publie ses propres réglages (un costume, le feuillage, une coque, le train rentré, quels feux et quel bruit lui conviennent), que l'éditeur propose et qu'un enregistrement énonce dans modelParameters. Chaque fois qu'un modèle ne peut être obtenu, et quand l'observateur se tient dans l'objet, c'est la forme intégrée qui est dessinée. |
| Panoramax | Photos et panoramas au niveau de la rue près du lieu, chacun avec sa position et sa direction. | Seulement quand l'auteur cherche des photos dans l'éditeur. | API Panoramax, créditée avec l'auteur et la licence de chaque photo. | Ouverte et lisible depuis toute page. Google Street View a été écarté : ses conditions gardent les photos dans les visionneuses de Google. |
| Weather sounds (OpenGameArt) | Pluie, vent et tonnerre. | Chargés quand la météo de la scène en a besoin. | Embarqués. Pluie et vent CC0 ; tonnerre par Jerimee, CC BY 3.0, crédité dans le lecteur. | Le son du phénomène lui-même est synthétisé depuis sa description, pas tiré d'un enregistrement. |
Le détail de chaque choix, avec les mesures qui l'ont décidé, est dans les commentaires du code de chaque source.