Desarrollo

GreatSpades: recoloreo de texturas voxel

Pipeline en Python para recolorear texturas 8192² de un soldado voxel preservando el detalle de la tela.

1 estrella2026rol: autor únicoestado: activo

01 Problema y contexto

Un personaje voxel llega con una única textura base de 8192 píxeles por lado. Producir variantes de uniforme pintando encima destruye el detalle horneado en ella (la trama de la tela, las costuras, las sombras de los pliegues), y una pasada ingenua sobre la imagen completa agota la memoria.

Un personaje voxel para videojuego llega con una única textura base de 8192 píxeles por lado. Producir variantes de uniforme pintando encima destruye el detalle horneado en esa textura: la trama de la tela, las costuras, los bolsillos y las sombras de los pliegues. El problema real es separar el color del detalle, y hacerlo en una imagen lo bastante grande como para que una pasada ingenua sobre toda la textura agote la memoria.

02 Solución

Recoloreado en espacio Lab: se conserva la variación de luminancia, que es donde vive todo el detalle de la tela, y se sustituye solo la cromaticidad por la del color objetivo. El procesamiento va por bandas horizontales para mantener acotada la memoria, y las piezas que el color no distingue (el casco y el uniforme comparten material) se separan por clasificación de triángulos de la malla. La cara queda excluida por geometría, no por color.

  1. Análisis de la textura fuente para determinar qué se podía separar por color y qué no: el casco y el uniforme comparten un único material gris.
  2. Segmentación por croma y tono para aislar la zona recoloreable, protegiendo de forma explícita el oliva del chaleco, la piel y el cuello.
  3. Recoloreado en espacio Lab: se conserva la variación de luminancia, que es donde vive todo el detalle de la tela, y se sustituye la cromaticidad por la del color objetivo.
  4. Procesamiento por bandas horizontales de 1024 filas para mantener acotada la memoria, con el brillo de referencia estimado en una reducción a 512 píxeles.
  5. Clasificación por triángulo de la malla para separar las piezas que el color no distingue, con la cara excluida por geometría antes que por color.
  6. Aplicación de escritorio con visor three.js: recoloreado en GPU mediante shader para la vista previa y exportación en Python a resolución completa.

03 Resultados

Cifras verificables en el repositorio y su documentación:

8192²resolución de la textura de salida
4regiones recoloreables por separado, con la piel y la cara bloqueadas

04 Cómo está construido

Herramienta de procesamiento de imagen que genera variaciones de color del uniforme y casco de un modelo 3D voxel, segmentando la zona recoloreable en espacio HSV y recoloreando en espacio Lab para conservar costuras, trama y sombras de la tela. Incluye una CLI con paleta editable en JSON y una app de escritorio (pywebview + three.js) con visor 3D y panel de colores en tiempo real, empaquetable como ejecutable con PyInstaller. Todo el procesamiento usa solo NumPy y Pillow, con lectura por bandas para manejar texturas de 8192×8192 sin agotar memoria.

05 Decisiones éticas

  • La piel y la cara están bloqueadas por geometría y no por color: los triángulos frontales de la cabeza quedan excluidos del recoloreado, de modo que ninguna variante puede alterar el tono de piel del personaje, ni por accidente ni a propósito.

06 Aspectos destacados

  • Recoloreado en espacio Lab que sustituye la cromaticidad (a*, b*) y preserva la luminancia L*, manteniendo intacto el detalle de la tela.
  • Segmentación por color HSV que aísla la zona recoloreable y protege chaleco, guantes, piel y cuello con umbrales validados.
  • Procesamiento por bandas para texturas de 8192×8192 usando solo NumPy y Pillow.
  • App de escritorio con visor 3D en three.js y motor Python vía pywebview, empaquetada como .exe con PyInstaller.

07 Limitaciones

No hay dataset: hay una sola textura fuente y los umbrales están calibrados sobre ella. La máscara supone que la zona recoloreable es casi acromática y protege el oliva del chaleco por rango de tono; con otro personaje esos números hay que recalibrarlos. El casco y el uniforme comparten material, así que el color por sí solo no los separa y hizo falta un mapa de regiones derivado de la geometría. La verificación es visual, mediante comparativas de original, resultado y máscara, no una métrica cuantitativa de fidelidad.