Aller au contenu
← Tous les articles
Présentation du projet

Dimension : relier les mathématiques Rust au rendu

Écouter en version balado

Dimension : des maths en Rust jusqu'au rendu · 2:33 · voix synthétiques, script rédigé avec l’IA

Transcription

Sylvie : Un moteur de rendu ne vaut que ce que valent les maths en dessous. Avant qu'un seul triangle s'affiche, il faut décider comment on stocke et on passe les matrices.

Thierry : Alors, par où Antoine commence dans son projet Rust, Dimension ?

Sylvie : Par une crate qui s'appelle mathlib. Elle expose le stockage dense, des formats creux comme CRS et CCS, des types de vecteurs et de matrices, des vues et des sous-matrices. On y trouve aussi les décompositions LU, Cholesky et SVD, la recherche de racines et l'intégration numérique.

Thierry : Beaucoup d'algèbre linéaire pour un projet de graphisme.

Sylvie : C'est un espace de travail d'expériences en mathématiques et en graphisme, donc les deux se rejoignent. La crate de rendu s'appuie sur mathlib pour les transformations CPU et les calculs de caméra, puis un moteur wgpu prépare le travail GPU.

Thierry : Et la scène, elle ressemble à quoi ?

Sylvie : À un arbre. Les entités ont des relations parent-enfant : une transformation locale vit dans une hiérarchie. Si on déplace un parent, on change le contexte dans lequel ses enfants sont dessinés. La crate exporte aussi des caméras et des cibles de rendu.

Thierry : Et ça tourne où ?

Sylvie : Dans une fenêtre native ou sur un canevas web, via WebAssembly. Antoine sépare le code de plateforme du code de scène et du code numérique, donc les deux cibles partagent les mêmes briques.

Thierry : Ça veut dire que ça se comporte pareil partout ?

Sylvie : Il reste prudent. Ça donne des briques communes, mais ça ne prouve pas un comportement identique sur tous les GPU ou navigateurs. Même précaution côté GPU : le schéma montre le chemin de rendu, pas une affirmation que tous les calculs numériques passent par là.

Thierry : Des chiffres de performance ?

Sylvie : Aucun, volontairement. Il y a une abstraction d'exécuteur et une option GPU, mais c'est un choix de conception, pas un gain mesuré. Pour comparer, il faudrait un benchmark reproductible, avec une taille d'entrée et un matériel précis.

Thierry : Il y a quoi d'autre dans le projet ?

Sylvie : Le manifeste racine liste des crates pour la géométrie, les collisions, la cinématique, la physique, le réseau, le parsing et le réseau de neurones. Le README parle surtout de la crate de maths, alors il lit le manifeste et les points d'entrée des modules.

Thierry : Donc on lit l'espace de travail, pas seulement le README.

Sylvie : Oui, et on garde en tête que c'est du code exploratoire. L'article complet a le schéma d'architecture et un lien vers la visite du code.

Table des matières

Dimension est mon workspace Rust pour mes expériences en mathématiques et en infographie. Le point de départ est mathlib : la bibliothèque expose le stockage matriciel, des solveurs numériques et les transformations utilisées côté CPU par le module de rendu.

Architecture du projet

Vue d’architecture du projet. Cliquer sur l’image pour examiner les détails.

1. Architecture

flowchart LR
  Geometry["Géométrie"] --> Math["Transformations CPU<br/>mathlib"]
  Math --> Scene["Scène et caméras"]
  Scene --> Render["Rendu wgpu"]
  Render --> Native["Fenêtre native"]
  Render --> Web["Canvas web"]

L’application fournit la géométrie et les transformations. La scène organise les entités et les caméras; le moteur prépare le travail GPU pour une fenêtre native ou un canevas web. Ce parcours de rendu ne signifie pas que tous les calculs numériques passent sur le GPU.

Lire le parcours du code, composant par composant.

2. Commencer par le stockage

mathlib/src/lib.rs[1] expose du stockage dense et des formats creux comme CRS et CCS. L’API comprend aussi des matrices, des vecteurs, des vues et des sous-matrices. Ces choix interviennent avant le premier dessin : ils déterminent comment le code représente et transmet ses données.

Le même point d’entrée expose les décompositions LU, Cholesky et SVD, ainsi que la recherche de racines et l’intégration numérique. Les fonctions GPU sont optionnelles. L’abstraction d’exécution représente un choix de conception ; elle ne constitue pas une mesure de gain de vitesse. Je ne présente pas de comparaison de performance ici.

3. Suivre une transformation dans la scène

render/src/lib.rs[2] décrit un moteur wgpu qui utilise mathlib pour les transformations CPU et les calculs de caméra. Il expose notamment World, EntityId, Transform, les caméras et les cibles de rendu.

La scène représente les relations parent-enfant dans un arbre. Une transformation locale s’inscrit donc dans une hiérarchie : déplacer un parent modifie le repère dans lequel ses enfants sont rendus. La sérialisation est optionnelle, sous la fonctionnalité serde.

La couche plateforme prend en charge les fenêtres natives et les cibles WebAssembly avec canvas. Séparer cette couche du code de scène et des calculs permet de partager des composants, sans pour autant prouver un comportement identique sur chaque GPU ou navigateur.

4. Lire le workspace au-delà du README

Le Cargo.toml[3] racine contient des crates de rendu, géométrie, collision, cinématique, physique, réseau, parsing et calcul neuronal, en plus de mathlib. Le README reste centré sur les mathématiques. Le manifeste et les points d’entrée des modules donnent une vue plus complète de la structure actuelle.

Ce code reste exploratoire. Pour justifier un résultat de performance, il faudrait un benchmark reproductible avec la taille des données et le matériel utilisé. Le dépôt montre pour l’instant comment je relie les calculs numériques à mes travaux d’infographie.

Voir Dimension sur GitHub[4].

Références

  1. antoinebou12. (). mathlib/src/lib.rs. [Source file or documentation] github.com.
  2. antoinebou12. (). render/src/lib.rs. [Source file or documentation] github.com.
  3. antoinebou12. (). Cargo.toml. [Source file or documentation] github.com.
  4. antoinebou12. (). Dimension. [Software repository] github.com.

Les références utilisent la date de publication de cet article.