ParAAvis: a 3D parachute colour customizer — from a section’s colour to the factory’s order form

Client
ParAAvis
Year
2021
What we did
ProcessWire websites, Support, servers, backups
Stack
ProcessWire, PHP, Vanilla JS, Interactive 3D models, three.js
Website
paraavis.com/parachutes/osnovnye/seven/customizer

The buyer paints the canopy in 3D in the factory’s fabric colours and downloads a ready order form: 11 parachutes, 7 models of our own, each under 1 MB.

11
parachutes with the customizer
Focus, Seven, Rave, Ultimate, Ultimate II, Dolphin-2, Stealth Tandem, Stealth-2, Cruise, Lesnik-3M and Bestia, September 2026
B
7
3D models of our own
Related canopies share one model: the Ultimate model works for five parachutes
B
977KB
the heaviest model
Rave, 24,500 triangles; the lightest is Seven, 377 KB. No textures, no compression
B

The task

ParAAvis makes parachutes, and almost every canopy is ordered in its own colours. The colours used to be chosen on the factory’s order form: fabric names were written into the boxes for each section and rib, and what the whole canopy would look like had to be imagined.

What was needed was a customizer right on the parachute’s page: turn the canopy, paint it with the fabrics the factory actually sews, and get a filled-in order form straight away.

Models from scratch

A model of its own for each canopy family. Our 3D modelling group built them in Blender from scratch. A model is split into zones — top, bottom, ribs, slider — and the zones into parts: individual panels and ribs.

The model and the site speak the same language. Object names in the model match the zone names in the CMS, so the customizer knows by itself which part of the canopy to paint, with no mapping tables. Related canopies share one model: the Ultimate model works for five parachutes.

How the customizer works

Zones and parts. In “zones” mode one click paints the whole top of the canopy or all the ribs at once; in “parts” mode, a single panel. The mesh of the part that is about to be painted shows through under the cursor.

Real fabrics only. The palette is the factory’s fabric catalogue from the CMS, each parachute’s default colours are set there too. The canopy can be turned and zoomed with a mouse or a finger, its zones pulled apart to look inside, and the picture saved.

From the customizer to the order form

The floppy-disk button downloads the factory’s order form in Excel — the very form that used to be filled in by hand. The server finds the cells in the form by the names of the zones and parts and writes the chosen fabrics into them — by their catalogue names, not colour codes.

The model and the CMS

// every part of the model sits inside its zone: top, ribs, bottom, slider
loader.load(customizer.file, gltf => {
  gltf.scene.traverse(mesh => {
    if (!mesh.isMesh) return
    const area = mesh.parent.name               // zone name in the model = zone name in the CMS
    const fabric = customizer.areas[area].color // this canopy’s default fabric
    mesh.material = new THREE.MeshPhongMaterial({
      color: '#' + customizer.swatches[fabric].rgb,
      side: THREE.DoubleSide,
    })
  })
})

A new canopy in the customizer is a model from Blender and settings in the CMS, with no code changes.

Light models

The models have no textures: colour comes from the material and shape from the geometry, simplified in Blender to 15,000–25,000 triangles. A model file weighs 377 to 977 KB and loads only when the buyer opens the customizer — the parachute’s page itself gets no heavier.