Nouveau prototype de disque de Poincaré navigable avec Unity

Le proto nouveau est arrivé !

Enfin un nouveau prototype de disque de Poincaré, conçu avec Unity ! Le but est de pouvoir toujours plus s’immerger à l’intérieur du disque de Poincaré pour voir comment notre perception se fait dans un tel espace. Je sens que vous mourez d’envie d’essayer, alors j’ai mis à votre disposition quelques builds sur mon Drive, disponibles à l’adresse suivante :
https://drive.google.com/drive/folders/16g5AYBFBTsjp02tXX5SIMWKZ_SG-aM86?usp=sharing

S’il n’y a pas de version correspondant à votre système, n’hésitez pas à demander.
Par ailleurs, j’ai testé la version OSX, qui fonctionne bien malgré un ou deux petits bugs d’affichage, mais pas les autres… Vous aurez donc peut-être une mauvaise surprise (mais j’espère que vous en aurez plutôt une bonne!).

Alors, c’est fini ?

Je ne suis encore pas tout à fait satisfait du résultat (le contraire aurait été surprenant), mais c’est une étape de plus dans l’élaboration de ce que j’imagine. Dans l’idéal, il manque encore :

  • Que le disque entier change de géométrie et se construise au fil des déplacements sur celui-ci. Pour l’instant, seule la taille du mobile change, mais le moteur de jeu arrondit rapidement à zéro les différentes valeurs utiles (vitesse, échelle) lorsqu’on se rapproche du bord. Il faudrait donc n’afficher qu’une portion du disque, sans doute avec un vaisseau plus petit au départ, dont les proportions sont rééquilibrées par rapport au moteur de jeu (agrandissement de l’échelle globale quand on se rapproche du bord, et compensation de l’échelle locale du mobile en fonction de l’échelle globale).
  • Un système immersif sur le nez ! Pour sentir ce que c’est qu’être perdu dans un disque de Poincaré, sans repère, à la recherche du centre du disque 😉
  • Un pavage qui rend mieux compte du fait que les formes sont conservées, d’une certaine manière, en tout lieu. Le pavage actuel est généré par un script, mais il ne me convient pas très bien. Cependant, pour faire un pavage comme ceux de Escher, il va me falloir encore un peu de travail ^^’
Circle Limit III
1959 Woodcut, second state, in yellow, green, blue, brown and black, printed from 5 blocks.
https://www.mcescher.com/gallery/recognition-success/circle-limit-iii/

Mais comment t’as fait ? ‘Oo

Pour ce nouveau prototype, j’ai effectué la résolution géométrique, puis analytique, du problème. Je rappelle que le dernier prototype faisait une résolution physique du problème en calculant la déformation de trajectoire à partir de la différence de vitesse entre deux mobiles situés sur la gauche et la droite du mobile de référence comme sur un essieu ; comme la vitesse décroit avec la distance au centre, le mobile le plus près du centre va plus vite que celui le plus éloigné, ce qui induit la déviation du mobile de référence. C’est le mécanisme inverse de celui du différentiel qui équipe nos voitures.
Or cette résolution physique a deux inconvénients :

  • le modèle est peu stable et peu précis, puisque les deux « roues » du mobile sont à une certaine distance du mobile lui-même, même petite, et que les calculs sont effectués séquentiellement (d’abord les « roues » avancent, puis la position moyenne du mobile est calculée en tenant compte des contraintes mécaniques, ce qui induit des sursauts du mobile) ;
  • il ne permet pas de gérer d’autres phénomènes physiques qui interfèrent avec lui, tels que les collisions avec d’autres mobiles ;
  • il consomme beaucoup de ressources, puisqu’il utilise le moteur physique pour un calcul simple de trajectoire.

Le nouveau modèle, issu de la résolution analytique, n’a pas ces inconvénients, et permet en outre de tracer des lignes droites — c’est-à-dire des arcs de cercles dans le disque de Poincaré — pour paver le disque.

Cette résolution est assez simple, puisqu’on a 4 équations polynomiales d’ordre 2 (qui se simplifient en équations d’ordre 1 ^^) et 4 inconnues. Voici le problème graphique de départ :

Représentation du problème (GeoGebra)

Le cercle noir est le disque de Poincaré, le point M(x,y) est le mobile, avec son vecteur vitesse (dont on n’utilise que la direction, pas le module), le cercle rouge est la trajectoire du mobile. Le point C est le centre du cercle rouge, et le point P est le point d’intersection entre les deux cercles. On cherche les coordonnées du point C. Comme on a introduit le point P pour la résolution, on a aussi besoin d’éliminer ses coordonnées. En coordonnées cartésiennes, on a donc 4 inconnues.
Les 4 équations s’obtiennent grâce aux contraintes suivantes :
\vec{V} est orthogonal à \overrightarrow{MC} ;
(PO) est perpendiculaire à (PC) ;
PO est égal au rayon du disque ;
PO est égal à PC.
Le résultat à la fin des calculs est :

(1)   \begin{equation*} \left\lbrace \begin{array}{rcl} x_C & = & x - \dfrac{R^2 + x^2 + y^2}{2 (x - \dfrac{V_x}{V_y}y)}\\ y_C & = & y - \dfrac{R^2 + x^2 + y^2}{2 (y - \dfrac{V_y}{V_x}x)}\\ \end{array}\right. \end{equation*}

On peut rédiger cela plus élégamment en introduisant la distance OM et des produits scalaires et vectoriels, mais le but est de pouvoir l’utiliser dans Unity. D’ailleurs, voici ce que ça donne en C# :

var pos = hyperbolicObject.transform.position;
float dirRatio = hyperbolicObject.transform.forward.x / hyperbolicObject.transform.forward.z;
float num = pos.x * pos.x + pos.z * pos.z - DISCWORLD_RADIUS * DISCWORLD_RADIUS;
float xminxc = num / (2 * (pos.x - pos.z * dirRatio));
float zminzc = num / (2 * (pos.z - pos.x / dirRatio));
center.Set(pos.x - xminxc, pos.y, pos.z - zminzc);
radius = Mathf.Sqrt(xminxc * xminxc + zminzc * zminzc);

Et graphiquement ?

Le pavage est réalisé en créant par script des meshes qui correspondent aux trajectoires calculées depuis certains points. La ligne rouge que l’on voit devant le mobile est la trajectoire actuelle du mobile en ligne droite, qui rend compte aussi du changement d’échelle.

Ça vient d’où déjà ?

Pour rappel, voici l’extrait de La science et l’hypothèse de Henri Poincaré dont est issu ce disque :

La température n’y est pas uniforme ; elle est maxima au centre, et elle diminue à mesure qu’on s’en éloigne, pour se réduire au zéro absolu quand on atteint la sphère où ce monde est renfermé.
Je précise davantage la loi suivant laquelle varie cette température. Soit R le rayon de la sphère limite ; soit r la distance du point considéré au centre de cette sphère. La température absolue sera proportionnelle à R^2 - r^2.
Je supposerai de plus que, dans ce monde, tous les corps aient même coefficient de dilatation, de telle façon que la longueur d’une règle quelconque soit proportionnelle à sa température absolue.
Je supposerai enfin qu’un objet transporté d’un point à un autre, dont la température est différente, se met immédiate- ment en équilibre calorifique avec son nouveau milieu.
Rien dans ces hypothèses n’est contradictoire ou inimaginable.
Un objet mobile deviendra alors de plus en plus petit à mesure qu’on se rapprochera de la sphère limite.
Observons d’abord que, si ce monde est limité au point de vue de notre géométrie habituelle, il paraîtra infini à ses habitants.
Quand ceux-ci, en effet, veulent se rapprocher de la sphère limite, ils se refroidissent et deviennent de plus en plus petits. Les pas qu’ils font sont donc aussi de plus en plus petits, de sorte qu’ils ne peuvent jamais atteindre la sphère limite.

Henri POINCARÉ, La Science et l’hypothèse, éditions Ebooks libres et gratuits 2011, (édition originale : 1902)
Ce contenu a été publié dans Géométrie non euclidienne, avec comme mot(s)-clé(s) , , , . Vous pouvez le mettre en favoris avec ce permalien.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.