Le Coursier relativiste · Théorie
La physique derrière le jeu
Dans la ville du jeu, la lumière ne va qu’à 30 m/s, à peu près 108 km/h. Ton véhicule de livraison peut s’en approcher, et tout ce que tu vois change : les couleurs, les formes, le temps. Rien n’est truqué : c’est la relativité restreinte d’Einstein, calculée image par image. Choisis ton niveau.
Niveau 1Débutant : ce que tu vois, et pourquoi
Pas d’équations ici, seulement des idées et des images du jeu. Tout ce qui suit est vrai dans notre monde aussi. Chez nous, la lumière va dix millions de fois plus vite (300 000 km/s) : il faudrait foncer à une fraction notable de cette vitesse pour voir ces effets. Dans le jeu, une voiture suffit.
1. Une vitesse limite
Rien ne va plus vite que la lumière : ni ton véhicule, ni aucun message. Tu peux garder l’accélérateur enfoncé aussi longtemps que tu veux, ta vitesse s’approche de 30 m/s sans jamais l’atteindre.
Au début, chaque seconde de poussée ajoute 6 m/s, comme on s’y attend. Puis le gain fond : il faut 2,7 s pour atteindre 15 m/s (la moitié de c), 5 s pour 22,8 m/s (76 %), 7,4 s pour 27 m/s (90 %). Le jeu s’arrête à 99,5 % de c, soit 29,85 m/s.
Ce n’est pas le moteur qui faiblit : à bord, tu ressens toujours la même poussée. C’est la façon dont les vitesses s’additionnent qui change. Ajouter 6 m/s à une vitesse déjà proche de c donne un peu moins que la somme, et d’autant moins qu’on est près de c.
2. Deux horloges
Le jeu affiche deux horloges. Ta montre mesure ton temps à toi : c’est aussi ta batterie. L’horloge de la ville mesure le temps des habitants, des délais de livraison, des ponts et des feux.
À l’arrêt, elles avancent ensemble. Quand tu roules vite, ta montre avance moins vite que l’horloge de la ville. Toi, tu ne sens rien : ton cœur, ta montre et ton moteur ralentissent tous ensemble. Mais en comparant les deux horloges, l’écart se creuse.
Le paradoxe des jumeaux. Luc, ton jumeau, reste au dépôt. Toi, tu fais un aller-retour de 300 m dans chaque sens, le plus vite possible : tu accélères jusqu’à mi-chemin, tu freines, tu fais demi-tour et tu recommences. Pendant que tu roules, ta montre avance de 26,3 s et celle de Luc de 34,6 s. À ton retour, tu as 8,3 s de moins que lui.
Ce n’est pas symétrique : c’est toi qui as accéléré, freiné et fait demi-tour, pas Luc. Le paradoxe a été proposé par Paul Langevin en 1911.
3. Voir, c’est regarder le passé
La lumière met du temps pour venir jusqu’à toi. À 30 m/s, un bâtiment situé à 300 m t’apparaît tel qu’il était il y a 10 s. Tout ce que tu vois est une image du passé, d’autant plus ancienne que c’est loin.
Pour une maison immobile, cela ne change rien. Mais une porte qui s’ouvre, un pont qui se lève ou un feu qui change de couleur : tu le vois en retard. Un pont qui te paraît baissé peut être déjà levé. Il vaut mieux se fier aux horaires de la ville qu’à ses yeux.
Chez nous aussi : la lumière du Soleil met un peu plus de 8 minutes pour nous parvenir. Le Soleil que tu vois est celui d’il y a 8 minutes.
4. Le décor se resserre vers l’avant
Quand tu cours sous une pluie qui tombe bien droit, tu dois pencher ton parapluie vers l’avant : pour toi, la pluie arrive de face. La lumière fait la même chose. Quand tu roules vite, chaque objet semble plus en avant qu’il ne l’est vraiment.
Résultat : tout le décor se resserre vers le centre de l’écran. Ce qui est devant semble plus loin et plus petit. Ce qui était sur les côtés, et même un peu derrière toi, entre dans l’écran. Les lignes droites des façades se courbent. C’est l’aberration de la lumière.
5. Bleu devant, rouge derrière
Tu connais l’effet Doppler avec le son : la sirène d’une ambulance est plus aiguë quand elle vient vers toi, plus grave quand elle s’éloigne. Avec la lumière, c’est la couleur qui change. En fonçant vers une façade, tu reçois ses ondes plus serrées : elle paraît plus bleue. Derrière toi, plus rouge.
On note ce décalage D. Avec D = 2, les ondes arrivent deux fois plus serrées. Droit devant, D vaut 1,7 à 15 m/s, 2,7 à 22,8 m/s et 4,4 à 27 m/s. Droit derrière, c’est l’inverse : 0,58, 0,37 puis 0,23.
Une couleur décalée ne fait pas que « bleuir ». Une lampe rouge vue de face devient orange, puis jaune, puis verte, puis bleue. Au-delà, sa lumière part dans l’ultraviolet, que tu ne vois pas : la lampe s’éteint à tes yeux.
6. Des couleurs invisibles apparaissent
Ton œil ne voit qu’une tranche de la lumière, du violet (vers 360 nm) au rouge profond (vers 830 nm). Au-delà du rouge, il y a l’infrarouge : la chaleur, la lumière des télécommandes. En deçà du violet, l’ultraviolet, celui des coups de soleil. Les façades en renvoient aussi, mais tu ne les vois pas.
Quand tu fonces, l’infrarouge des objets de devant est décalé jusque dans le visible : tu le vois ! Et leur lumière visible, décalée elle aussi, part dans l’ultraviolet. Derrière toi, c’est l’inverse : tu vois leur ultraviolet.
Au-delà de D ≈ 2,3 (69 % de c, droit devant), tu ne vois plus du tout la lumière visible des façades qui sont devant toi : seulement leur infrarouge. Voilà pourquoi la ville, devant toi, devient d’un bleu pâle presque uniforme à grande vitesse : ce sont ses reflets infrarouges, décalés jusqu’au bleu.
7. L’effet projecteur
En plus de changer de couleur, la lumière de devant devient beaucoup plus intense, et celle de derrière s’éteint presque. Tu fonces dans le flot de lumière : tu reçois plus de lumière par seconde, chaque grain de lumière porte plus d’énergie, et l’aberration concentre devant toi la lumière de tout un côté. À 22,8 m/s, une façade droit devant t’envoie environ 55 fois plus de lumière qu’à l’arrêt.
Ton œil s’adapte, comme en sortant d’un tunnel : le jeu baisse l’exposition pour qu’une façade moyenne, vue de face, garde sa luminosité. Par contraste, les côtés et l’arrière paraissent sombres.
8. La vision classique, pour comparer
Maintiens la touche C (ou Maj, ou le bouton 👁 sur un écran tactile) : le jeu montre la même ville, au même instant de l’horloge de la ville, sans aucun effet. Pas de retard de la lumière, pas d’aberration, pas de Doppler, pas de projecteur : ce qu’on verrait si la lumière était infiniment rapide. Les horloges, elles, continuent de suivre la relativité. La vision classique ne change que ce que tu vois.
9. Ce qu’il faut retenir
- Rien ne dépasse c. Plus tu t’en approches, plus il est difficile d’accélérer.
- Quand tu vas vite, ta montre avance moins vite que l’horloge de la ville.
- Tu vois toujours le passé, avec un retard égal à la distance divisée par c.
- À grande vitesse, le décor se resserre vers l’avant, se teinte de bleu devant et de rouge derrière.
- L’infrarouge et l’ultraviolet, invisibles à l’arrêt, deviennent visibles.
- Devant, tout devient plus lumineux ; derrière, plus sombre.
Niveau 2Intermédiaire : les équations du jeu
Les mêmes effets, avec leurs équations, celles que le jeu calcule à chaque image. Notations : c est la vitesse de la lumière (30 m/s par défaut, réglable de 10 à 100 m/s), v ta vitesse dans la ville et β = v/c ; a = c/5 est la poussée du moteur (6 m/s² à c = 30) ; τ (tau) est le temps de ta montre, t celui de la ville.
1. Le facteur de Lorentz γ
Tout part d’un nombre, le facteur de Lorentz :
γ vaut 1 à l’arrêt, 1,15 à β = 0,5 (15 m/s), 1,54 à β = 0,76 (22,8 m/s), 2,29 à β = 0,9 (27 m/s) et 10 au plafond du jeu, β = 0,995. Il est commode d’introduire aussi la rapidité φ :
La rapidité, contrairement à la vitesse, n’a pas de plafond, et en ligne droite elle s’additionne simplement. Le jeu la limite à φ = 3.
2. Dilatation du temps
Pendant que ta montre avance de Δτ, les horloges de la ville que tu croises (synchronisées entre elles dans la ville) avancent de :
C’est l’écart affiché par le jeu entre « Ta montre » et « Horloge de la ville ». Ton temps, le temps propre, est la somme de ces petits morceaux le long de ton trajet :
À 27 m/s (γ = 2,29), 10 s de montre font 22,9 s de ville. Jumeaux : aller-retour de L = 300 m, en poussant jusqu’à mi-chemin puis en freinant, dans chaque sens. La rapidité culmine à arcosh 2 (β = 0,87) et :
soit 8,3 s d’écart au retour, pour tout c (le rythme du jeu, c/a = 5 s, ne dépend pas de c).
3. Accélérer à poussée constante
Le moteur fournit une accélération propre a constante : celle que tu ressens à bord. Ce n’est pas dv/dt dans la ville. Ce qui augmente régulièrement, c’est la rapidité : φ = aτ/c. D’où, depuis l’arrêt :
10 s de poussée depuis l’arrêt (φ = aτ/c = 2) : v = 30·tanh 2 = 28,92 m/s, t = 5·sinh 2 = 18,13 s, x = 150·(cosh 2 − 1) = 414,3 m. Les 5 premières secondes (φ = 1) suffisent pour 22,85 m/s, soit 0,76·c. Le test du cahier des charges, lui, injecte c = 100 m/s et a = 10 m/s² (φ = 1 après 10 s) : 76,16 m/s, 11,75 s et 543,1 m. Le jeu le vérifie à un millionième près, quel que soit le nombre d’images par seconde.
Freiner est le même mouvement à l’envers. Distance d’arrêt depuis le facteur γ :
Soit 23 m depuis 15 m/s, 81 m depuis 22,8 m/s, 194 m depuis 27 m/s. Le temps naturel du mouvement est c/a = 5 s et sa longueur naturelle c²/a = 150 m ; l’unité de longueur des niveaux, L = 10·c = 300 m, en vaut le double.
4. Additionner des vitesses
Deux vitesses dans la même direction ne s’ajoutent pas, elles se composent :
Exemple à c = 30 : 20 m/s « plus » 20 m/s font 40/(1 + 400/900) = 27,7 m/s, pas 40. Le résultat reste sous c. À chaque image, le jeu compose ta vitesse avec le petit gain c·tanh(aΔτ/c) ≈ aΔτ, avec la version en deux dimensions de cette loi (niveau expert). C’est pour cela que v = aτ est faux : chaque Δv = aΔτ est mesuré dans ton référentiel du moment, pas dans celui de la ville.
5. Le temps retardé
La lumière qui t’arrive à l’instant t d’un objet immobile situé à la distance d est partie à :
Pour un objet qui bouge, sa position dépend de l’instant d’émission, d’où une équation implicite :
Le pont du niveau 4, vu à 81 m (la distance qu’il faut pour s’arrêter depuis 22,8 m/s) : son image a 81/30 ≈ 2,7 s de retard. À c = 100, la même situation se joue à 272 m, avec le même retard. En roulant vers une horloge de la ville, tu la vois défiler D fois plus vite que ta montre (× 2,7 à 22,8 m/s), et non γ fois : tu vois ses images de plus en plus récentes.
6. L’aberration
Soit θ l’angle, mesuré dans la ville, entre ta vitesse et la direction d’un objet, et θ′ l’angle sous lequel tu le vois :
Un objet exactement sur le côté (θ = 90°) est vu à θ′ tel que cos θ′ = β : 60° à β = 0,5, 40,4° à β = 0,76, 25,8° à β = 0,9. L’écran montre 90° (θ′ ≤ 45°) : à β = 0,76, il contient tout ce qui est à moins de 97° de l’avant ; à β = 0,9, jusqu’à 122°.
Le jeu applique cette transformation à chaque sommet des bâtiments, en gardant leur distance. Les façades sont découpées en petits morceaux pour que leurs arêtes droites puissent se courber.
7. Le facteur Doppler D
Les fréquences reçues sont multipliées par :
Sur le côté dans la ville (θ = 90°), D = γ > 1 : c’est l’effet Doppler transverse, une pure dilatation du temps. Mais vu sur le côté de l’écran (θ′ = 90°), D = 1/γ < 1. À 22,8 m/s : D = 2,72 droit devant, 1,54 pour un objet réellement sur le côté, 0,37 droit derrière.
8. Couleurs : λ divisée par D
Autrement dit, ce que tu vois à la longueur d’onde λ a été émis à D·λ. L’œil voit de 360 à 830 nm : il reçoit donc la lumière émise entre 360·D et 830·D nm (voir le schéma du niveau débutant). Au-delà de D = 830/360 ≈ 2,31, soit β > 0,68 droit devant, il ne reste plus rien de la lumière visible émise : seul l’infrarouge.
Une lampe rouge à 640 nm paraît verte quand 640/D est entre 510 et 562 nm, soit D entre 1,14 et 1,25. Droit devant, D = √((1 + β)/(1 − β)) : β entre 0,13 et 0,22, c’est-à-dire de 3,9 à 6,7 m/s (de 13 à 22 m/s à c = 100).
9. L’effet projecteur en D⁴
La luminance d’une surface, toutes longueurs d’onde confondues, est multipliée par D⁴ :
Un facteur D pour l’énergie de chaque photon, un autre pour leur cadence d’arrivée, et D² parce que l’aberration resserre l’angle solide. Droit devant : × 55 à 22,8 m/s (D = e), × 361 à 27 m/s ; derrière, × 0,018 à 22,8 m/s. Le jeu applique D⁴ exactement jusqu’à D = 8, puis plafonne, et compense la luminosité d’ensemble par une exposition E, comme l’œil : E = 0,093 à 22,8 m/s, 0,039 à 27 m/s.
10. L’horizon de Rindler
Sous poussée constante depuis l’arrêt, ta ligne d’univers est une hyperbole :
Elle s’approche de la droite de lumière x = ct − c²/a sans jamais la toucher. Un éclair émis au départ à plus de c²/a derrière toi (150 m à c = 30) ne te rattrape jamais, tant que tu accélères : c’est un horizon, comme celui d’un trou noir, mais dû seulement à ton accélération.
11. Récapitulatif chiffré
Poussée constante depuis l’arrêt, c = 30 m/s, a = 6 m/s² (temps identiques pour tout c ; distances et vitesses × 10/3 à c = 100).
| β | v (m/s) | γ | τ (s) | t (s) | x (m) | D devant | D derrière | côté vu à |
|---|---|---|---|---|---|---|---|---|
| 0,3 | 9,00 | 1,048 | 1,55 | 1,57 | 7,2 | 1,36 | 0,734 | 72,5 ° |
| 0,5 | 15,00 | 1,155 | 2,75 | 2,89 | 23,2 | 1,73 | 0,577 | 60,0 ° |
| 0,6 | 18,00 | 1,250 | 3,47 | 3,75 | 37,5 | 2,00 | 0,500 | 53,1 ° |
| 0,762 | 22,85 | 1,543 | 5,00 | 5,88 | 81,5 | 2,72 | 0,368 | 40,4 ° |
| 0,8 | 24,00 | 1,667 | 5,49 | 6,67 | 100 | 3,00 | 0,333 | 36,9 ° |
| 0,9 | 27,00 | 2,294 | 7,36 | 10,32 | 194 | 4,36 | 0,229 | 25,8 ° |
| 0,95 | 28,50 | 3,203 | 9,16 | 15,21 | 330 | 6,24 | 0,160 | 18,2 ° |
| 0,995 | 29,85 | 10,068 | 15,00 | 50,09 | 1 360 | 20,09 | 0,050 | 5,7 ° |
« Côté vu à » : angle apparent, depuis l’avant, d’un objet situé exactement sur ton côté. Au plafond du jeu (φ = 3), D devant vaut 20 et le projecteur, plafonné à 8⁴, n’est plus exact.
Niveau 3Expert : le modèle, du quadrivecteur au pixel
Ce niveau détaille les choix du moteur : pourquoi telle forme exacte plutôt qu’une autre, ce qui est
physique, ce qui est une convention de rendu, et ce qui est laissé de côté. Métrique de signature
(−, +, +, +), c explicite. Les liens renvoient au code
source (branche main).
1. Quadrivecteurs et vitesse propre
L’état du véhicule est sa position, sa vitesse propre u = γv (partie spatiale de la quadrivitesse) et ses deux horloges, en double précision. On en déduit tout le reste :
Avec u comme état, |v| < c est garanti pour tout u fini, sans test ni renormalisation. En flottants
64 bits, v = c·tanh φ s’arrondirait à c vers φ ≈ 18 ; côté GPU, en 32 bits, β s’arrondit à 1 vers
φ ≈ 9. Le jeu plafonne φ à 3 (β = 0,995, γ = 10), borne fixée par la couverture de la table Doppler
(|log₂ D| ≤ 4,5). Code : relativity.js,
player.js.
2. Le segment hyperbolique exact
Sous une poussée propre α constante dans le référentiel comobile initial, pendant le temps propre h, la ligne d’univers est un arc d’hyperbole. Avec :
le pas exact s’écrit :
C’est exactement la composition v₁ = v₀ ⊕ c·tanh(ψ)·α̂ (à 4,5·10⁻¹⁴ près en pratique), avec la loi vectorielle, non commutative :
Pourquoi Δv = aΔτ n’est exact qu’à pas infinitésimal. a est l’accélération dans le référentiel comobile instantané, qui change au cours du pas ; Δv = aΔτ est la tangente de la solution, pas la solution. Appliquée telle quelle à chaque image, elle donne 542,10 m au lieu de 543,08 m à 60 images/s pour le test du cahier des charges (« 10 s de poussée », avec c = 100 m/s et a = 10 m/s² injectées), et 541,12 m à 30 images/s : le résultat dépend de la cadence. La forme hyperbolique, elle, est exacte pour n’importe quel découpage, y compris un pas unique de 10 s (écart mesuré ≤ 2·10⁻¹¹). Les sous-pas internes (≤ 1/60 s et ≤ 1 m) ne servent qu’aux collisions et au virage : en virage avec poussée, un schéma de Strang d’ordre 2 laisse moins d’un millimètre d’écart après 10 s.
3. Fermi-Walker et Thomas-Wigner
Pendant un segment, la direction de poussée est fixe dans le référentiel comobile initial : elle est transportée par Fermi-Walker, sans rotation propre. Ce n’est pas la même chose que des axes du monde « reboostés » à chaque instant : deux boosts non colinéaires se composent en un boost suivi d’une rotation (rotation de Wigner), d’où le caractère non commutatif de ⊕. Le long d’une trajectoire courbe, l’effet cumulé est la précession de Thomas :
En virage circulaire, un gyroscope embarqué tournerait de 2π(γ − 1) par tour : trois tours complets à γ = 4 sur l’anneau du niveau 6. Pourquoi le jeu l’ignore : la conduite est « arcade ». La route fournit la force latérale, hors du budget du moteur, et le cap du véhicule est collé à sa vitesse dans la ville ; la caméra regarde le long de v. Le jeu ne suit donc aucune orientation propre (pas de gyroscope), et la vue est obtenue par un boost pur depuis la ville, sans rotation. C’est un choix de modèle, documenté, pas une approximation numérique : la précession existe, mais rien dans le jeu ne la mesure.
4. Aberration et Doppler par un boost
Le boost de Lorentz de vitesse βc, sans rotation, s’écrit :
La lumière reçue d’un point immobile vu dans la direction monde n, à la distance r, relie deux événements séparés par un intervalle de genre lumière : l’émission précède la réception de r/c. En boostant cette séparation, on obtient en une ligne le facteur Doppler, la distance apparente et la direction apparente :
(On a utilisé (γ − 1)/β² = γ²/(γ + 1), qui évite la division par β à l’arrêt.) C’est le calcul que fait le shader pour chaque sommet. Le ciel, lui, part de la direction de chaque pixel et a besoin de l’inverse exacte :
5. Invariance de : d’où viennent D⁴ et D⁵
La luminance spectrale divisée par est proportionnelle à la densité des photons dans l’espace des phases, un invariant de Lorentz. Donc :
En intégrant sur , on gagne un facteur D : la luminance totale varie en D⁴. Par unité de longueur d’onde, on en gagne un de plus (dλ = −c ) : D⁵. Le jeu sépare ces facteurs : la matrice de couleur M(D) contient le seul jacobien D (dλémise/dλvue), et l’effet projecteur applique le reste, D⁴, plafonné à 8⁴ = 4 096 (exact jusqu’à D = 8, soit γ ≈ 4,1 de face ; la borne garde aussi les valeurs loin du maximum des flottants 16 bits, 65 504). OpenRelativity appliquait D² ; le jeu applique l’exposant physique, et un test le verrouille par l’invariance du corps noir (section 7).
6. Le modèle spectral
Trois canaux RVB ne suffisent pas : un décalage Doppler fait entrer l’infrarouge et l’ultraviolet dans le visible. Chaque surface porte donc cinq réflectances (r, g, b, ir, uv) sur des bases en créneaux qui partitionnent l’unité sur [0 ; ∞[ en longueur d’onde émise : uv sous 360 nm, b de 360 à 490, g de 490 à 590, r de 590 à 830, ir au-delà de 830 nm (plateau jusqu’à l’infini). La ville est éclairée par un soleil corps noir E à 5 800 K. Couleur de la base k vue avec D :
- x̄ (et ȳ, z̄) : ajustement analytique multi-lobes des fonctions colorimétriques CIE 1931 de Wyman, Sloan et Shirley (2013) ; intégration de Simpson par support, aux bornes exactes λ = frontière/D (erreur relative ≤ 2·10⁻⁶).
- RGB : passage de XYZ au sRGB linéaire (blanc D65, IEC 61966-2-1).
- 𝐍 : inverse du bloc 3×3 (r, g, b) à D = 1, appliquée aux cinq colonnes. C’est l’adaptation de l’œil au soleil : un blanc au soleil vaut (1, 1, 1), et M(1) = [I | 0]. Au repos, ir et uv sont exactement invisibles, puisque leurs bases n’ont aucun support entre 360 et 830 nm.
Exemples calculés : à D = 2, les colonnes g et b s’annulent, r ne laisse qu’un soupçon de violet (0,005 ; −0,003 ; 0,041) et ir vaut (0,49 ; 0,68 ; 1,03) : une façade vue de face est la couleur, bleu pâle, de son infrarouge. À D = 0,5, seule la colonne uv survit, (0,31 ; 0,16 ; 0,06) : brun orangé.
Chaîne complète d’un fragment, identique en JavaScript (tests, règles du jeu) et en GLSL :
- Table (LUT) : texture demi-flottante de 257 texels sur log₂ D ∈ [−4,5 ; 4,5], de taille impaire pour que D = 1 tombe au centre d’un texel (lecture u = (x(N − 1) + 0,5)/N, filtrage linéaire, sans mipmaps). Lignes : les cinq colonnes de M, deux corps noirs (2 700 K et 6 500 K) et le ciel dégagé.
- Gamut : une couleur hors gamut est désaturée vers le gris de même luminance, ce qui garde la teinte (elle porte l’information du jeu).
- Exposition E = 1/G(eφ), où G est le gain, projecteur compris, d’une façade de référence (gris 0,6 ; ir 0,3 ; uv 0,15) vue de face : elle garde sa luminance du repos, et les rapports de luminance dans l’image restent physiques. E = 0,31 à β = 0,3 ; 0,093 à β = 0,76 ; 0,039 à β = 0,9.
- Compression T : identité jusqu’au genou 0,75, puis compression exponentielle du maximum des trois canaux, appliquée en facteur commun (teinte conservée).
- Doppler par fragment (position relative à l’œil en varying highp) : calculé par sommet, il donnait des taches de teinte jusqu’à ΔE 30.
Pourquoi pas le modèle d’OpenRelativity (trois raies étroites à 615, 550 et 463 nm) ? Vue de face, la
luminance y tombe sous 10 % vers β = 0,28 et presque à zéro vers β = 0,5 : illisible dans la plage du jeu.
Il reste disponible en préréglage de comparaison. Le ciel dégagé a un spectre continu,
∝ (550/λ)⁴ + 0,35·(550/λ)1,3 (Rayleigh et aérosols), nul sous 295 nm (ozone) : décalé, il reste
lisse. Code : spectrum.js,
dopplerLut.js,
rel_doppler.glsl.
7. Corps noirs : T devient D·T
La loi de Planck a une propriété remarquable :
Un corps noir vu avec le facteur D est un corps noir de température D·T. Les lampadaires (2 700 K) utilisent la ligne de LUT 𝐍·RGB(B(λ, D·T))/D⁴, normalisée, multipliée par le projecteur D⁴ : on retrouve exactement le corps noir à D·T, sans compter deux fois D⁴. La même identité sert de test de l’exposant : pour un blanc plat (r + g + b + ir + uv ≡ 1) éclairé par le soleil, D⁴·M(D)·blanc = 𝐍·RGB(B(D·5 800 K)) à 10⁻⁴ près pour D ∈ {0,5 ; 2 ; 6 ; 20}. Les lampes à raie, elles, utilisent la couleur de la raie à λ₀/D, multipliée par le même projecteur.
8. Transformation par sommet
Pour le décor immobile, OpenRelativity tourne le repère, résout le temps d’émission puis applique la transformation de Lorentz. Pour un point fixe dans la ville, ces trois étapes se réduisent à la forme fermée de la section 4, sans rotation ni arc cosinus :
// rel = P − œil (monde), r = |rel| ; uG2 = γ²/(γ+1) vient du CPU (double précision)
highp vec3 relAberrate(highp vec3 rel) {
highp float r = length(rel);
highp float bn = dot(uBeta, rel) / max(r, 1e-6); // β·n
highp float D = uGamma * (1.0 + bn);
return (rel + (uG2 * bn + uGamma) * r * uBeta) / D; // n′·r
}
Conservation de r. Le sommet est placé en œil + n′·r, à sa distance monde r, et
non à r′ = D·r. L’image ne dépend que des directions : elle est inchangée. En revanche, near/far, le
brouillard et le tri restent indépendants de β, et le test de profondeur reste juste : deux points sur
un même rayon apparent ont la même direction monde, donc le même D, et leur ordre est conservé. highp
est obligatoire. En vision classique, le CPU passe βeff = kβ (k de 1 à 0) : aucun k dans le
GLSL. Code : rel_vertex.glsl.
9. Culling, subdivision, ciel
-
Culling : le culling par frustum de three.js teste les positions monde, avant le
shader. À β = 0,76, il supprimerait la moitié des îlots visibles, puisque l’aberration ramène devant ce
qui est sur le côté. Il est désactivé (
frustumCulled = false) et remplacé par une coupe à la distance de visibilité, exacte puisque r est conservé et que le brouillard, en distance monde, y est opaque. Un culling par « cône apparent » est prévu. - Subdivision et niveaux de détail : l’aberration courbe les droites, mais seulement entre sommets. Les façades sont subdivisées (pas de 1,5 / 5 / 15 m selon trois niveaux de détail) ; le niveau k est permis si son pas sk ≤ κ·dmin, avec , où ε est la tolérance angulaire (2 px CSS) et dmin la distance apparente du point le plus proche de l’îlot. Image propre à environ 3 px près jusqu’à γ ≈ 2,5.
-
Ciel, sol, brouillard : une passe plein écran. Pour chaque pixel, aberration inverse
exacte, intersection analytique avec le plan du sol (sans branchement avant la lecture de texture),
brouillard en distance monde mélangé avant le Doppler (correct pour un milieu immobile dans la ville),
puis la même chaîne de couleur. Code :
environment.frag.glsl,lod.js.
10. Temps retardé : Newton sécurisé
Pour un objet mobile de trajectoire p(t), on cherche le retard d = t − te ≥ 0, racine de :
G est strictement croissante et G(0) ≤ 0 : il y a au plus une racine, qui existe si la vitesse de l’objet reste sous c dans le passé. Le solveur tient un encadrement [lo ; hi] (bornes incluses), fait un pas de Newton, bascule en bissection si le pas sort de l’encadrement (ou en pas de point fixe tant qu’aucune borne haute n’est connue), et s’arrête dès que le résidu est nul. Amorce : la valeur de l’image précédente, ou la forme fermée du mouvement uniforme (l’équation du second degré d’OpenRelativity), écrite sans annulation, avec δ = xobs − p(t) :
(forme conjuguée |δ|²/(√… − δ·w) quand δ·w < 0). Deux à cinq itérations suffisent jusqu’à β = 0,99,
contre plus de mille pour le point fixe. Le solveur est livré et testé ; le rendu des objets mobiles
viendra avec les niveaux concernés. Les objets fixes qui changent d’état (portes, ponts) utilisent
t − d/c. Code : retarded.js.
11. Effet Terrell-Penrose
On ne « voit » pas la contraction des longueurs. Terrell et Penrose ont montré en 1959 que la contraction, combinée aux différences de temps de trajet de la lumière, fait paraître un objet lointain tourné plutôt qu’aplati, et qu’une sphère garde un contour circulaire. Pour le décor immobile, le jeu n’a rien à ajouter : l’image d’une scène statique vue par un observateur en mouvement est exactement l’image au repos, aberrée. La contraction de la ville dans ton référentiel et le retard de la lumière y sont déjà inclus. Pour les objets mobiles, une correction quadratique par sommet, exacte à vitesse constante, et un Doppler relatif D = γ(1 + n·β)/(γw(1 + n·βw)) sont prévus.
12. Ce que le jeu simplifie ou ne simule pas
- Conduite arcade : la route fournit la force latérale (jusqu’à 8 à 15·a sur l’anneau du niveau 6), seules la poussée et le frein sont limités à a. Pas de précession de Thomas (section 3).
- Temps simulé : Δτ est plafonné à 0,1 s par image (on ne simule pas un joueur absent), horloges gelées en pause.
- Spectres : cinq bandes en créneaux plutôt que des spectres de réflectance continus ; soleil corps noir sans absorption atmosphérique ; fonctions colorimétriques analytiques.
- Projecteur plafonné à D = 8 (au-delà, à partir de β ≈ 0,97 droit devant, la luminance est sous-estimée) ; adaptation de l’exposition : un choix perceptif, pas physique.
- Éclairage : couleurs plates et ombres cuites ; les lampadaires ne projettent pas de lumière ; pas de réflexions, pas de polarisation.
- Géométrie : les courbes restent polygonales entre sommets (au-delà de γ ≈ 2,5, quelques pixels d’écart) ; observateur ponctuel, champ de 90° en paysage.
- Objets mobiles : pas encore rendus (solveur prêt). Son : aucun, à dessein : à 343 m/s, il irait plus vite que la lumière de la ville.
- Gravité : aucune ; la ville est plate, l’horizon de Rindler est purement cinématique.
13. Références et code
- A. Einstein, « Zur Elektrodynamik bewegter Körper », Annalen der Physik 17, 891–921 (1905).
- P. Langevin, « L’évolution de l’espace et du temps », Scientia 10, 31–54 (1911).
- J. Terrell, « Invisibility of the Lorentz Contraction », Physical Review 116, 1041–1045 (1959).
- R. Penrose, « The apparent shape of a relativistically moving sphere », Proceedings of the Cambridge Philosophical Society 55, 137–139 (1959).
- W. Rindler, Relativity: Special, General, and Cosmological, 2ᵉ éd., Oxford University Press (2006) : mouvement hyperbolique et horizon.
- G. B. Rybicki et A. P. Lightman, Radiative Processes in Astrophysics, Wiley (1979), chap. 4 : invariance de .
- G. Kortemeyer, P. Tan et S. Schirra, « A Slower Speed of Light: Developing intuition about special relativity with games », Proceedings of Foundations of Digital Games (2013) ; MIT Game Lab, A Slower Speed of Light (2012) ; OpenRelativity (licence MIT).
- C. Wyman, P.-P. Sloan et P. Shirley, « Simple Analytic Approximations to the CIE XYZ Color Matching Functions », Journal of Computer Graphics Techniques 2(2), 1–11 (2013).
Code source : github.com/hugohismans/aSlower ; plan
détaillé et décisions dans
docs/conception.md ;
tests de la physique dans
tests/player.test.js et
tests/spectrum.test.js.