Show HN: Gaussian Splatting 3D en tiempo real en WebGL
(antimatter15.com)- Un visor WebGL con el que puedes abrir y manipular directamente en el navegador escenas de 3D Gaussian Splat, y cuyo código de implementación está publicado en GitHub
- Soporta teclado, mouse, trackpad, táctil e incluso gamepad, cubriendo ampliamente entornos de entrada de escritorio y móviles
- El control de cámara se divide en desplazamiento, rotación orbital, inclinación y roll, y permite explorar la misma escena de distintas maneras según el dispositivo de entrada
- Con las teclas numéricas y
-,+,pes posible cambiar entre vistas de cámara precargadas, recorrer cámaras y reanudar la animación predeterminada - Puedes arrastrar y soltar archivos
.plypara convertirlos a.splat, y cargar configuraciones de cámara concameras.json
WebGL 3D Gaussian Splat Viewer
- WebGL 3D Gaussian Splat Viewer es un visor de 3D Gaussian Splat creado por Kevin Kwok
- El código está publicado en Github
Controles por dispositivo de entrada
-
Movimiento con teclado
- Flecha izquierda/derecha: mover a izquierda/derecha
- Flecha arriba/abajo: mover hacia adelante/atrás
- Space: saltar
-
Ángulo de cámara
a/d: girar la cámara a izquierda/derechaw/s: inclinar la cámara arriba/abajoq/e: roll de la cámara en sentido antihorario/horarioi/k,j/l: rotación orbital
-
Trackpad
- Scroll: rotación orbital arriba/abajo/izquierda/derecha
- Pinch: mover hacia adelante/atrás
Ctrl+ scroll: mover hacia adelante/atrásShift+ scroll: mover arriba/abajo o izquierda/derecha
-
Mouse
- Clic y arrastrar: rotación orbital
- Clic derecho o arrastrar arriba/abajo junto con la tecla
Ctrl/Cmd: desplazamiento
-
Táctil
- Un dedo: rotación orbital
- Pellizco con dos dedos: mover hacia adelante/atrás
- Rotación con dos dedos: girar la cámara en sentido horario/antihorario
- Deslizamiento con dos dedos: mover a izquierda/derecha y arriba/abajo
-
Gamepad
- Funciona si hay un control de juego conectado
Cámara y manejo de archivos
-
Control de vistas de cámara
0-9: cambiar a una de las vistas de cámara precargadas-o+: recorrer las cámaras cargadasp: reanudar la animación predeterminada
-
Arrastrar y soltar
- Archivo
.ply: convertir a.splat cameras.json: cargar cámaras
- Archivo
1 comentarios
Opiniones en Hacker News
Está muy bueno, pero los controles confunden
No es el movimiento típico con WASD y rotación de la vista con el mouse; al arrastrar con el mouse uno se mueve hacia adelante/atrás y orbita alrededor de un punto específico, A/D mueve a izquierda/derecha, y W/S sirve para mirar arriba/abajo
La lista completa de controles está en el README: https://github.com/antimatter15/splat#controls
La intención original era poder moverse solo con las flechas, girando en el lugar y caminando hacia adelante y atrás
La estructura es hacer el “movimiento principal” con las flechas/joystick para avanzar/retroceder y girar a izquierda/derecha, y el “movimiento secundario” con WASD/botones C para desplazarse lateralmente y mirar arriba/abajo
Está increíble. Yo también estoy trabajando en portar gaussian-splatting [0] a WebGPU
Al igual que otras implementaciones que he visto hasta ahora, esta parece cometer el mismo error al proyectar elipsoides en proyección en perspectiva. Primero calcula la covarianza en 3D y luego la proyecta a 2D[1], pero ese enfoque solo es correcto para proyección paralela/ortográfica; aplicado a proyección en perspectiva da resultados incorrectos
En la proyección en perspectiva hay tres efectos adicionales. El desplazamiento por paralaje cambia la forma de la elipse proyectada, la rotación del elipsoide puede cambiar su posición aparente y producir una traslación adicional, y una sección cónica puede ser no solo una elipse sino también una parábola o una hipérbola
Parece que el primer efecto se corrige manualmente con esta matriz[2], pero los otros dos efectos no entran en los cálculos en las implementaciones que he visto hasta ahora. Para hacerlo correctamente no habría que calcular la covarianza 3D, sino obtener el cono límite del elipsoide cuyo vértice es la posición de la cámara y luego intersectarlo con el plano de vista. La sección cónica resultante es el contorno exacto del elipsoide proyectado en perspectiva
[0]: https://github.com/graphdeco-inria/gaussian-splatting
[1]: https://github.com/antimatter15/splat/blob/3695c57e8828fedc2...
[2]: https://github.com/antimatter15/splat/blob/3695c57e8828fedc2...
Pero si la gaussiana es pequeña respecto del tamaño de la imagen, se puede aproximar linealizando la función de proyección. Por eso el paper de Gaussian Splatting usa el jacobiano de la función de proyección, como en la ecuación 5[0]
En la práctica, esta aproximación encaja muy bien. La matriz mencionada en tu tercer enlace es precisamente ese jacobiano, y no es una corrección manual sino algo matemáticamente válido. Ver [1] para la derivación
[0] https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/3d_...
[1] https://math.stackexchange.com/a/4716514/43771
Visto de otra manera, se aproxima la proyección suponiendo que toda la gaussiana está a una profundidad fija; si está lo suficientemente lejos, debería funcionar
La transformación proyectiva de una gaussiana se ve bastante engorrosa, pero imagino que alguien ya lo habrá hecho. En coordenadas proyectivas parece posible, aunque la parte final de proyectar a coordenadas cartesianas es complicada
Por cierto, proyectar solo el contorno también está mal. Cambia toda la distribución de densidad, y eso también afecta el contorno
Pensaba que la proyección de cuadriláteros ya era un problema resuelto; ¿podrías explicar un poco más en qué se diferencia de un arreglo simple de cuadriláteros?
Al hacer zoom out se ven muchas aristas poligonales que no parece que deberían estar ahí
Parece como si intentara dibujar “bultos” suaves, pero las coordenadas de textura estuvieran un poco desalineadas; me pregunto si es un bug o una parte intencional de la técnica
Básicamente es una nube de puntos semidensa[1], pero en vez de puntos tiene bultos cuyo color, ángulo y tamaño se ajustaron para coincidir con las fotos de entrada. Por eso está optimizada para verse desde cierta distancia
Piénsalo como un dibujo vectorial 3D. Si haces demasiado zoom o separas partes, el conjunto empieza a verse algo raro
[1]https://www.researchgate.net/publication/326621750/figure/fi...
Hasta ahora solo había visto que Gaussian splatting se usara con datos fotográficos.
¿También se puede usar con otros datos gráficos? Dicho de otro modo, ¿tiene potencial para usarse en juegos?
Solo contiene color según la posición y la dirección geométricas, y no tiene conceptos de superficies, materiales ni transporte general de la luz, es decir, emisión, absorción, transmisión, reflexión o dispersión. En otras palabras, solo permite iluminación precalculada y escenas estáticas, y la animación es difícil.
La industria parece estar moviéndose hacia métodos que permiten una mejor iluminación dinámica, como el renderizado basado en física (PBR) y el trazado de rayos/rutas.
Además, por ahora la eficiencia espacial es extremadamente baja. Una escena que en un motor de renderizado tradicional ocuparía decenas de GB puede llegar a ocupar TB. Aunque podría mejorar con más optimización.
Una excepción donde Gaussian splatting podría ser interesante es el contenido procedimental/generativo, quizá incluso con animación. En especial podría encajar bien con efectos volumétricos como humo, fuego, nubes o agua en movimiento, donde hoy se usan sistemas de partículas.
Es fácil imaginar un juego de mundo abierto estilo Minecraft que use esto como motor base en lugar de vóxeles.
¿Esta técnica también funciona con video?
Viendo el README del trabajo de INRIA[1], parece que entrenan un modelo por cada escena estática; ¿eso deja fuera al video?
[1] https://github.com/graphdeco-inria/gaussian-splatting
[1] https://arxiv.org/abs/2308.09713
[2] https://dynamic3dgaussians.github.io/
¿Qué estoy viendo exactamente?
Es una técnica que existe desde hace mucho, pero si una nube de puntos tiene un millón de puntos, hay que manejarlos artísticamente uno por uno, así que no se usaba mucho.
Es parecido al cabello 3D. El principio es simple: basta con renderizar mil millones de cabellos, pero hacerlo para que realmente se vea bien es difícil.
Aquí se hace que un modelo de aprendizaje automático ajuste el ángulo, color, forma y tamaño de un millón de primitivas, por ejemplo cuadrados, círculos o triángulos, para que se parezcan a las fotos que le proporcionamos.
¿Esto usa el método propuesto por Kerbl y Kopanas en SIGGRAPH 2023?
https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/
Es realmente impresionante. Las nubes de puntos también son interesantes, pero esto es mucho más sorprendente. Incluso corre a 60 fps en la laptop Lenovo que uso en la empresa.
Aunque se ven muchos artefactos, sobre todo al mover la cámara.
Si logran hacer que esto funcione dentro de ThreeJS, creo que podrían dejar huella en la historia del 3D web.
Nunca había experimentado este tipo de control con el mouse en una vista 3D, así que estuve bastante confundido por un rato.