The demo looks easy: load a glTF, orbit around it, swap a material. Then a real manufacturer sends you their actual product file and you learn that the hard part was never the Three.js. It was getting their CAD into something a browser can load in under three seconds.
What actually arrives
Manufacturers model in SolidWorks, Inventor, Rhino, or hand you a STEP file. Exported to glTF, a single product variant lands at 40 to 120MB. It is usually:
- Z-up, because that is the CAD convention. Three.js is Y-up, so your model is lying on its back.
- Scaled in millimeters or inches, so it is either microscopic or the size of a building.
- Stripped of materials, or carrying CAD materials that mean nothing to a PBR renderer.
- Thousands of separate parts, every bolt its own mesh, which is thousands of draw calls.
None of that is the manufacturer doing anything wrong. It is just that CAD and realtime web rendering want opposite things.
The pipeline
I run every incoming model through the same stages before it goes near the configurator:
- Decimate and merge in Blender. Collapse the part tree, remove internal geometry the customer never sees, weld bolts and screws into the parent. A 4000-part assembly becomes a handful of meshes.
- Fix orientation and scale on import. Rotate Z-up to Y-up, set 1 unit = 1 meter. Do it once, bake it, never think about it again in the app.
- Reassign PBR materials by slot. Not per part. Group surfaces into material slots (frame, glass, hardware) so a color picker touches one material, not two hundred.
-
Compress.
gltf-transformorgltf-pipelinewith Draco for geometry. For textures, KTX2 so the GPU stores them compressed, not just the file.
gltf-transform optimize in.glb out.glb --compress draco --texture-compress ktx2
90MB in, 2 to 5MB out, with no visible loss on a product shot.
The part the quote forgets
Here is the thing the demo budget never includes: this pipeline is per product line, and it is ongoing. New product, new file, run it again. New variant, new export. If the manufacturer updates a model, someone reprocesses it.
When I scope a configurator I treat the asset pipeline as its own line item, sometimes with a small Blender script or a Laravel queue job so reprocessing is one command, not a day of clicking. The studio runs several of these in production, one per manufacturer, each fed by the same pipeline.
I am Dominik Groński / GroDev, a studio in Poznan, Poland building custom 3D configurators and Laravel back-ends for manufacturers.
Top comments (0)