Kris

Guía práctica de 3D Gaussian Splatting (3DGS): principios, trampas y conversión a malla

Gaussian Splatting3DGSNube de puntosWebGLWebGPUConversión de malla

En el último año, el 3D Gaussian Splatting (3DGS) ha arrasado en el mundo del renderizado 3D. Tanto en YouTube como en X (antes Twitter), no dejas de ver demos en tiempo real tan realistas que parecen sacadas de otro planeta. Incluso hay quien grita a los cuatro vientos que "esto va a acabar con el modelado tradicional y con NeRF".

Pero cuando realmente intentas integrarlo en un proyecto, te das cuenta de que esta tecnología está llena de decepciones: lo que ves en el anuncio no es lo que recibes. Hoy vamos a desmenuzar la lógica interna del 3DGS y esos fallos ocultos que nadie menciona en los tutoriales.

Dimensión técnicaFotogrametría tradicional3D Gaussian Splatting (3DGS)
FilosofíaSuperficies sólidas: triángulos + texturas PBRNiebla suave: millones de elipsoides translúcidos que emiten luz
Velocidad de renderizadoMuy rápida (la rasterización por hardware GPU tradicional no tiene problema)Muy rápida (ordenamiento por profundidad en GPU + composición)
Edición y física del modeloMuy madura (colisiones, rigging de huesos)Casi imposible de editar (es solo un montón de puntos, sin detección de colisiones)
Reflejos y brillos especularesRequiere shaders complejos, normalmente se ve seco y planoMuy realista: los reflejos en agua y cristal cambian naturalmente con el ángulo de visión
Compatibilidad con impresión 3DSoporte nativo (ya es una malla cerrada)No se puede imprimir directamente (requiere una extracción algorítmica dolorosa)

Ver más allá de la superficie: ¿qué es realmente 3DGS?

En pocas palabras, 3DGS tira por la borda la regla clásica del modelado 3D de "puntos que forman líneas, líneas que forman caras". En su lugar, apila un escenario usando un montón de "bolas de pelo brillantes" (núcleos gaussianos) que se pueden estirar, aplanar, tienen transparencia y cuyo color cambia con el ángulo de visión.

Cada núcleo gaussiano contiene posición, rotación (cuaterniones), escala (matriz de covarianza), opacidad y color (armónicos esféricos SH). Este enfoque es increíblemente ingenioso. Como no hay que calcular refracción por trazado de rayos, solo hay que ordenar esos elipsoides por distancia y dibujarlos de atrás hacia adelante, consigues tasas de 100+ FPS en una GPU normal.

La cruda realidad de los archivos splat en la web

Las demos son impresionantes, pero si de verdad quieres poner un 3DGS en una página web para que lo vea un cliente, el primer obstáculo es el tamaño del archivo y el reventón de la memoria de vídeo.

  • Formato PLY estándar: conserva coordenadas de precisión completa y colores de armónicos esféricos (SH) de alto orden. Con SH de orden 3, cada núcleo necesita 45 números de coma flotante para representar el color que varía con el ángulo. Una escena de una habitación de 100 m² supera fácilmente los 800 MB.
  • Formato SPLAT: elimina la variación avanzada de color (reduce a SH de orden 0, es decir, un color fijo). El tamaño baja a unos 250 MB. Sacrificas el realismo de luces y reflejos para reducir el peso.
  • Formatos SPZ / KSPLAT: compresión cuantitativa agresiva, pensada para salvar los dispositivos móviles. Puede bajar hasta unos 30 MB.

El límite que encontramos en nuestras pruebas: los navegadores móviles modernos (como Safari en iPhone) solo pueden renderizar fluidamente entre 300.000 y 800.000 núcleos gaussianos. Si tu escena supera el millón de núcleos, o si metes un PLY de varios cientos de MB directamente en la web sin convertirlo a SPZ, lo más probable es que el móvil se quede en blanco o se cuelgue.

Si quieres probar el límite de tu dispositivo, puedes usar nuestro visor de Splats Any3D y cargar un archivo localmente. Todo se renderiza en el navegador con WebGL o WebGPU, sin consumir ancho de banda del servidor.

La lección más dolorosa: convertir 3DGS a malla

Muchos usuarios, después de capturar una escena, piensan: "¡Qué pasada! ¡A convertirla a STL e imprimirla!" o "¡A importarla en Blender para añadirle un personaje animado!".

La verdad incómoda es que convertir 3DGS a malla es un atolladero técnico.

Como los núcleos gaussianos son en esencia niebla translúcida y brillante, los algoritmos clásicos de extracción de superficies (como la reconstrucción de Poisson) se enfrentan a una ambigüedad geométrica fatal al tratar con estos objetos no sólidos:

  • El desastre del cristal y el agua: el cristal translúcido que se ve tan realista en 3DGS hace que el algoritmo piense que hay un objeto sólido flotando. Al convertir a malla, obtienes un montón de agujeros y caras deformes, como si un perro lo hubiera mordisqueado.
  • Floaters (puntos flotantes): los núcleos gaussianos que no convergieron del todo durante el entrenamiento crean píxeles dispersos en el aire. Al extraer la malla, el cielo se llena de "meteoritos" flotantes.
  • Pelo y ramas finas: se pierden por completo, convirtiéndose en una pasta informe.

Si tu escena tiene muchos materiales reflectantes o estructuras finas, baja drásticamente tus expectativas sobre el mallado. Forzar la conversión normalmente solo te da "un trozo de barro irreconocible".

Preguntas frecuentes y estrategias prácticas

¿Debo grabar un vídeo con el móvil o tomar fotos para entrenar?

Ambos funcionan, pero lo clave es la tasa de solapamiento y la trayectoria. En nuestras pruebas, grabar un vídeo en 4K a 60 fps rodeando suavemente el objeto y luego extraer un fotograma cada 10 frames da mucho mejores resultados que tomar 200 fotos con pulso tembloroso (el desenfoque de movimiento es el enemigo mortal del 3DGS). Lo importante es: gira alrededor del objeto, no te quedes en un sitio grabando en círculo.

¿Cómo hago la física de colisiones al importarlo a un motor de juegos?

Ni se te ocurra usar los núcleos gaussianos para colisiones. La práctica habitual en Unreal Engine (UE5) y Unity es: usar 3DGS para el renderizado visual, y luego crear un Box invisible o un modelo low-poly muy tosco alrededor del objeto, usando esa malla tradicional como volumen de colisión (Collider).

¿Puedo usar esta tecnología con mi nube de puntos LiDAR?

Una nube de puntos LiDAR normal solo contiene coordenadas XYZ y un color de reflectancia único. No tiene información de campo de luz dependiente del ángulo, así que no se pueden entrenar los parámetros de armónicos esféricos. Puedes usar nuestro visor de PLY Any3D para previsualizar nubes de puntos tradicionales, pero para conseguir ese efecto "brillante y cambiante" del 3DGS, tienes que pasar por el flujo completo de entrenamiento basado en imágenes multivista (preprocesado con COLMAP).

Apóyanos