Show HN : 3D Gaussian Splatting en temps réel avec WebGL
(antimatter15.com)- Un visualiseur WebGL permettant d’ouvrir et de manipuler directement dans le navigateur des scènes 3D Gaussian Splat, avec le code d’implémentation publié sur GitHub
- Prise en charge du clavier, de la souris, du trackpad, du tactile et même des manettes, couvrant largement les environnements de saisie desktop et mobile
- Les contrôles de caméra sont répartis entre déplacement, rotation orbitale, inclinaison et roulis, avec différentes façons d’explorer la même scène selon le périphérique d’entrée
- Les touches numériques ainsi que
-,+etppermettent de passer à des vues caméra préchargées, de parcourir les caméras et de reprendre l’animation par défaut - Il est possible de glisser-déposer des fichiers
.plypour les convertir en.splat, et de charger les réglages de caméra viacameras.json
WebGL 3D Gaussian Splat Viewer
- WebGL 3D Gaussian Splat Viewer est un visualiseur 3D Gaussian Splat créé par Kevin Kwok
- Le code est publié sur Github
Contrôles par périphérique d’entrée
-
Déplacement au clavier
- Flèche gauche/droite : déplacement latéral
- Flèche haut/bas : déplacement avant/arrière
- Space : saut
-
Angle de caméra
a/d: rotation gauche/droite de la caméraw/s: inclinaison haut/bas de la caméraq/e: roulis antihoraire/horaire de la camérai/k,j/l: rotation orbitale
-
Trackpad
- Défilement : rotation orbitale haut/bas/gauche/droite
- Pincement : déplacement avant/arrière
Ctrl+ défilement : déplacement avant/arrièreShift+ défilement : déplacement vertical ou latéral
-
Souris
- Cliquer puis faire glisser : rotation orbitale
- Clic droit, ou glissement vers le haut/bas avec la touche
Ctrl/Cmd: déplacement
-
Tactile
- Un doigt : rotation orbitale
- Pincement à deux doigts : déplacement avant/arrière
- Rotation à deux doigts : rotation horaire/antihoraire de la caméra
- Panoramique à deux doigts : déplacement latéral et vertical
-
Manette
- Fonctionne si une manette de jeu est connectée
Caméra et gestion des fichiers
-
Contrôle des vues caméra
0-9: passer à l’une des vues caméra préchargées-ou+: parcourir les caméras chargéesp: reprendre l’animation par défaut
-
Glisser-déposer
- Fichier
.ply: conversion en.splat cameras.json: chargement des caméras
- Fichier
1 commentaires
Commentaires sur Hacker News
C’est vraiment impressionnant, mais les contrôles prêtent à confusion
Au lieu du déplacement WASD classique avec rotation de la vue à la souris, le glisser de la souris sert à avancer/reculer et à orbiter autour d’un point donné, A/D déplacent à gauche/droite, et W/S font regarder vers le haut/bas
La liste complète des contrôles est dans le README : https://github.com/antimatter15/splat#controls
À l’origine, l’idée était de pouvoir se déplacer uniquement avec les flèches, en tournant sur place et en marchant en avant/arrière
Les flèches/le joystick servent au « déplacement principal » — avancer/reculer et tourner à gauche/droite — tandis que WASD/les boutons C servent au « déplacement secondaire » — translation gauche/droite et vue haut/bas
Vraiment impressionnant. Je travaille moi aussi sur un portage de gaussian-splatting [0] vers WebGPU
Comme d’autres implémentations que j’ai vues jusqu’ici, celle-ci semble faire la même erreur lorsqu’elle projette des ellipsoïdes en projection perspective. Elle calcule d’abord la covariance en 3D puis la projette en 2D [1], mais cette approche n’est correcte qu’en projection parallèle/orthographique ; appliquée à la perspective, elle donne des résultats erronés
En projection perspective, il y a trois effets supplémentaires. Le déplacement de parallaxe modifie la forme de l’ellipse projetée, la rotation de l’ellipsoïde peut changer sa position apparente en créant une translation supplémentaire, et une conique peut être non seulement une ellipse, mais aussi une parabole ou une hyperbole
Le premier effet semble être corrigé manuellement avec cette matrice [2], mais les deux autres effets n’étaient pris en compte dans aucune des implémentations que j’ai vues jusqu’ici. Pour faire les choses correctement, il ne faut pas calculer la covariance 3D : il faut déterminer le cône tangent à l’ellipsoïde dont le sommet est la position de la caméra, puis l’intersecter avec le plan de vue. La conique obtenue donne le contour exact de l’ellipsoïde projeté en perspective
[0] : https://github.com/graphdeco-inria/gaussian-splatting
[1] : https://github.com/antimatter15/splat/blob/3695c57e8828fedc2...
[2] : https://github.com/antimatter15/splat/blob/3695c57e8828fedc2...
Mais si la gaussienne est petite par rapport à la taille de l’image, on peut linéariser la fonction de projection pour l’approximer. C’est pourquoi l’article sur le Gaussian Splatting utilise le jacobien de la fonction de projection, comme dans l’équation 5 [0]
En pratique, cette approximation fonctionne très bien. La matrice mentionnée dans le troisième lien est précisément ce jacobien ; ce n’est pas une correction manuelle, mais quelque chose de mathématiquement valide. Voir [1] pour la dérivation
[0] https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/3d_...
[1] https://math.stackexchange.com/a/4716514/43771
Vu autrement, on approxime la projection en supposant que toute la gaussienne se trouve à une profondeur fixe ; si elle est suffisamment éloignée, ça devrait fonctionner
La transformation projective d’une gaussienne a l’air assez pénible, mais j’imagine que quelqu’un a déjà dû le faire. En coordonnées projectives, ça paraît possible, mais la dernière étape de projection en coordonnées cartésiennes est délicate
À noter que projeter seulement le contour est également faux. Toute la distribution de densité change, et cela influence aussi le contour
Je pensais que la projection de quadrilatères était déjà un problème résolu ; pourrais-tu expliquer davantage en quoi c’est différent d’un simple tableau de quadrilatères ?
Quand on dézoome, on voit beaucoup d’arêtes polygonales qui ne devraient pas vraiment être là
On dirait qu’on essaie de dessiner des « blobs » lisses, mais avec des coordonnées de texture légèrement décalées ; je me demande si c’est un bug ou un aspect voulu de la technique
À la base, c’est un nuage de points semi-dense [1], sauf qu’au lieu de points, il y a des blobs dont la couleur, l’angle et la taille sont ajustés pour correspondre aux photos d’entrée. C’est donc optimisé pour être regardé depuis une certaine distance
On peut voir ça comme du dessin vectoriel 3D. Si l’on zoome trop ou qu’on en isole une partie, l’ensemble commence à paraître un peu étrange
[1]https://www.researchgate.net/publication/326621750/figure/fi...
Jusqu’ici, je n’avais vu le gaussian splatting utilisé que pour des données photo
Est-ce qu’on pourrait l’utiliser aussi pour d’autres données graphiques ? Autrement dit, y a-t-il un potentiel pour les jeux ?
Elles ne stockent que la couleur en fonction de la position et de l’orientation géométriques, sans notions de surface, de matériau ni de transport de la lumière au sens général — émission, absorption, transmission, réflexion, diffusion, etc. Autrement dit, elles ne permettent que de l’éclairage précalculé et des scènes statiques, et l’animation est difficile
Le secteur semble plutôt aller vers des méthodes permettant un meilleur éclairage dynamique, comme le rendu physiquement réaliste (PBR) et le ray/path tracing
De plus, l’efficacité spatiale est pour l’instant extrêmement faible. Une scène qui prendrait quelques dizaines de Go avec un moteur de rendu traditionnel peut atteindre des téraoctets. Cela dit, cela pourrait s’améliorer avec davantage d’optimisations
Les cas où le gaussian splatting pourrait être particulièrement intéressant sont les contenus procéduraux/génératifs, éventuellement jusqu’à l’animation. Il pourrait notamment bien convenir aux effets volumétriques qui utilisent aujourd’hui des systèmes de particules, comme la fumée, le feu, les nuages ou l’eau qui s’écoule
On peut facilement imaginer un jeu open world façon Minecraft qui utiliserait ça comme moteur de base à la place des voxels
Cette technique fonctionnerait-elle aussi pour la vidéo ?
À en juger par le README du travail de l’INRIA[1], on dirait qu’un modèle est entraîné pour chaque scène statique ; est-ce que cela exclut donc la vidéo ?
[1] https://github.com/graphdeco-inria/gaussian-splatting
[1] https://arxiv.org/abs/2308.09713
[2] https://dynamic3dgaussians.github.io/
Qu’est-ce que je suis en train de regarder, au juste ?
La méthode existe depuis longtemps, mais elle n’était pas très utilisée : quand un nuage de points contient un million de points, il faut manipuler artistiquement ce million de points
C’est un peu comme les cheveux en 3D. Le principe est simple — il suffit de rendre un milliard de mèches — mais obtenir quelque chose de vraiment beau est difficile
Ici, on demande à un modèle de machine learning d’ajuster l’angle, la couleur, la forme et la taille d’un million de primitives — par exemple des carrés, des cercles, des triangles, etc. — pour qu’elles ressemblent aux photos qu’on lui fournit
Est-ce que cela utilise la méthode proposée par Kerbl et Kopanas à SIGGRAPH 2023 ?
https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/
C’est vraiment impressionnant. Les nuages de points sont déjà intéressants, mais là c’est encore bien plus bluffant. Ça tourne à 60 fps même sur le portable Lenovo que j’utilise au travail
Cela dit, on voit beaucoup d’artefacts, surtout quand on déplace la caméra
Si quelqu’un arrive à faire fonctionner ça dans ThreeJS, ça pourrait marquer l’histoire de la 3D web
Je n’avais jamais rencontré ce genre de contrôle à la souris dans une vue 3D, donc j’ai été très dérouté pendant un moment