Motor híbrido para procesar geometría 3D pesada con C++ y visualizarla en el navegador con Three.js.
- ✅ Parser STL binario en C++ (archivos de 50+ MB)
- ✅ Cálculo de normales suaves para rendering profesional
- ✅ WebAssembly para near-native performance
- ✅ Visualización 3D con Three.js y smooth shading
- ✅ Arquitectura modular y escalable
- ✅ Compilación con Docker (sin ensuciar tu sistema)
- Docker Desktop (para compilar C++)
- Python 3 (para servidor local) o Live Server (extensión VS Code)
# Modo todo-en-uno
.\start.bat
# Opción 1: Desarrollo (compila + servidor)
# Opción 4: Verificar que todo esté instalado- Abre http://localhost:8000/web
- Presiona F12 para ver la consola
- Arrastra un archivo STL o haz click en "Seleccionar archivo"
- ¡Ver tu modelo 3D con smooth shading!
visor/
├── core/ # Backend C++
│ ├── engine.cpp # Punto de entrada WASM
│ ├── stl_parser.h # Parser de formato STL
│ └── mesh_processor.h # Cálculo de normales suaves
│
├── web/ # Frontend JavaScript
│ ├── index.html # Interfaz de usuario
│ ├── app.js # Orquestación principal
│ ├── geometry_loader.js # Comunicación con WASM
│ └── renderer.js # Renderizado Three.js
│
├── build/ # Generados por compilación
│ ├── engine.js # Wrapper JavaScript
│ └── engine.wasm # Código C++ compilado
│
├── Dockerfile # Imagen Emscripten
├── Makefile # Configuración de compilación
├── start.bat # Script principal (Windows)
└── README.md # Este archivo
Archivo STL (ej: 58 MB)
↓
JavaScript: FileReader → ArrayBuffer
↓
WASM: Transferencia de datos
↓
C++: STL Parser → Extrae triángulos
↓
C++: Mesh Processor → Calcula normales suaves
↓
WASM: Exporta arrays (vertices + normals)
↓
JavaScript: Lee HEAPF32
↓
Three.js: BufferGeometry + MeshPhongMaterial
↓
WebGL: Renderizado con smooth shading
↓
🎨 Modelo 3D profesional en el navegador
.\start.bat
# Menú interactivo:
# 1. Desarrollo (compila + servidor)
# 2. Solo compilar
# 3. Solo servidor
# 4. Verificar setup
# 5. Limpiar y recompilar# Compilar C++ a WebAssembly
docker run --rm -v "%cd%":/src emscripten/emsdk make
# Iniciar servidor
python -m http.server 8000
# Limpiar build
make cleanEl motor calcula normales suaves por vértice en C++ para lograr renderizado profesional:
- Parse STL: Extrae triángulos del archivo binario
- Calcula normales de triángulos: Producto cruz de edges
- Agrupa por vértices compartidos: Mapa de coordenadas → normales
- Promedia normales: Suma y normaliza por vértice
- Exporta a JavaScript: Arrays de vertices + normals
- Renderiza con Three.js: MeshPhongMaterial + flatShading:false
Resultado: Superficie orgánica y profesional vs aspecto facetado.
Ver SMOOTH_SHADING.md para detalles técnicos.
- Size: 58.38 MB
- Triangles: 1,224,222
- Vertices: 3,672,666
- Load time: < 1 second
- Parsing + normals: ~200ms
- FPS: stable 60fps
- Abre Docker Desktop y espera a que inicie
- Ejecuta
.\start.bat→ Opción 4 para verificar
- Ejecuta
.\start.bat→ Opción 5 (Limpiar y recompilar) - En el navegador: Ctrl + Shift + R (hard refresh)
- Verifica la consola (F12) en busca de errores
- Asegúrate de que engine.js y engine.wasm existen en build/
- Prueba con un archivo STL pequeño primero
- Normal: Docker descarga la imagen de Emscripten (~1.5 GB)
- Solo sucede una vez
- Siguientes compilaciones: ~10-15 segundos
cd tools
python generate_test_stl.py
# Crea test_cube.stl (cubo simple)O descarga archivos STL de:
- SMOOTH_SHADING.md - Algoritmo de normales suaves
- build/README.md - Archivos generados por compilación
| Componente | Tecnología | Propósito |
|---|---|---|
| Parser STL | C++ | Procesamiento rápido |
| Normales | C++ | Cálculos matemáticos pesados |
| Compilador | Emscripten | C++ → WebAssembly |
| Containerización | Docker | Entorno reproducible |
| Visualización | Three.js | Renderizado 3D |
| Interfaz | HTML5 + ES6 Modules | UI moderna |
- OrbitControls (rotar con mouse)
- Materiales PBR (Physically Based Rendering)
- Ambient Occlusion
- Simplificación de malla (LOD)
- Operaciones booleanas
- Exportar STL procesado
- Cálculo de volumen
- Detección de errores en geometría
MIT
Este es un proyecto de aprendizaje demostrando integración C++/WASM/JavaScript.
Desarrollado con: C++17, WebAssembly, Three.js, Emscripten, Docker