Construire un Pipeline de Conversion Fiable de Fichiers CAD/STEP et GLB vers USDZ pour Apple Vision Pro

Guide pratique et de niveau production pour concevoir un pipeline de conversion backend robuste, transformant de manière fiable les fichiers CAD/STEP et GLB en formats USDZ de haute qualité pour Apple Vision Pro, iOS et les flux de travail de l'informatique spatiale industrielle.

Construire un Pipeline de Conversion Fiable de Fichiers CAD/STEP et GLB vers USDZ pour Apple Vision Pro

Construire un Pipeline de Conversion Fiable de Fichiers CAD/STEP et GLB vers USDZ pour Apple Vision Pro

Fournir des modèles 3D de haute qualité pour l'Apple Vision Pro représente un défi technique majeur : la plupart des équipes d'ingénierie travaillent avec des fichiers STEP (ou d'autres formats CAD), tandis que les plateformes d'Apple attendent des fichiers USDZ optimisés pour RealityKit.

La conversion directe au sein d'une seule requête HTTP fonctionne pour des démos simples, mais échoue rapidement avec de vrais actifs industriels. Les grands assemblages, la géométrie NURBS complexe, les textures lourdes et les limites strictes des ressources du serveur entraînent souvent des expirations de délai (timeouts), des textures manquantes, des noms de pièces perdus et des échelles incorrectes.

Dans cet article, nous partageons notre pipeline de qualité production qui convertit de manière fiable les fichiers STEP et GLB en fichiers USDZ de haute qualité, parfaitement adaptés aux applications Apple Vision Pro.

1. Pourquoi un Pipeline de Conversion Dédié est Nécessaire

Les fichiers STEP contiennent des données d'ingénierie précises (surfaces NURBS, métadonnées, assemblages de milliers de pièces). Leur conversion nécessite une tessellation lourde et une gestion rigoureuse. Les fichiers GLB, bien que basés sur des maillages (meshes), ont tout de même besoin d'une normalisation des matériaux, d'un traitement des textures et d'optimisations spécifiques au format USDZ.

Notre architecture finale sépare les responsabilités pour garantir la stabilité et l'évolutivité :

L'utilisateur téléverse un fichier STEP ou GLB
  ↓
L'API valide le fichier et crée une tâche asynchrone
  ↓
Un worker récupère la tâche dans la file d'attente
  ↓
Conversion STEP → GLB (service dédié)
  ↓
Conversion GLB → USDZ avec normalisation de la scène
  ↓
Post-traitement (noms des maillages, échelle, matériaux)
  ↓
Téléversement du fichier USDZ sur le CDN
  ↓
Le client reçoit le statut de la tâche et l'URL de téléchargement

2. Technologies de Conversion Centrales

  • STEP → GLB : Propulsé par cascadio (bibliothèque Python v0.0.17) construite sur OCCT (Open CASCADE Technology). Cette combinaison offre une analyse robuste des fichiers STEP, une tessellation efficace et un export GLB tout en préservant la hiérarchie et les noms des pièces.
  • GLB → USDZ : Utilise Three.js avec l'exportateur officiel USDZExporter, s'exécutant entièrement sur Node.js grâce à de nombreux polyfills et scripts de post-traitement.

3. Conception de l'API – Entièrement Asynchrone

Toutes les conversions lourdes sont traitées de manière asynchrone afin d'éviter les expirations de délai (timeouts) de l'API.

Endpoint Method Purpose
POST /model-converter/jobs POST Téléverser un fichier STEP ou GLB et créer une nouvelle tâche de conversion. Retourne immédiatement l'ID de la tâche.
GET /model-converter/jobs/:jobId GET Vérifier le statut actuel d'une tâche de conversion (queued, processing, completed, ou failed).
GET /model-converter/jobs/:jobId/download GET Télécharger le fichier USDZ final après une conversion réussie.

4. Conversion STEP to GLB

Nous exploitons un service NestJS dédié au traitement du format STEP car la tessellation est très gourmande en ressources CPU et mémoire.

async convertStepToGlb(fileBuffer: Buffer, originalName: string): Promise<Buffer> {
  const formData = new FormData();
  formData.append('file', fileBuffer, originalName);

  const response = await firstValueFrom(
    this.httpService.post(`${this.occtServiceUrl}/convert/step-to-glb`, formData, {
      headers: formData.getHeaders(),
      responseType: 'arraybuffer',
      timeout: 300_000,
    })
  );
  return Buffer.from(response.data);
}

5. Conversion GLB to USDZ

Cette étape nécessite d'importants polyfills Node.js car Three.js et l'USDZExporter ont été initialement conçus pour les environnements de navigateurs web.

async convertGlbToUsdz(glbBuffer: Buffer, originalName?: string): Promise<Buffer> {
  ensureNodeRuntime();           // Polyfills pour Blob, fetch, canvas, Image
  await ensureImageLoaderPatch();

  const scene = new THREE.Scene();
  const loader = new GLTFLoader();
  // Analyser le fichier GLB ...

  await prepareScene(scene);     // Normalisation des matériaux + rendu (baking) des textures
  const rawUsdz = await new USDZExporter().parse(scene, { 
    quickLookCompatible: true 
  });

  // Préserver les noms originaux des maillages/pièces
  return postProcessUsdz(Buffer.from(rawUsdz), meshNames, rootDisplayName);
}

6. Préparation & Normalisation Critiques de la Scène

De nombreuses conversions échouent silencieusement en raison de matériaux non pris en charge ou d'échelles incorrectes. Nous appliquons les étapes suivantes :

  • Convertir tous les matériaux en MeshStandardMaterial
  • Corriger les textures ORM (Occlusion / Rugosité / Métallisation)
  • Calculer et intégrer (bake) các textures via un canvas si nécessaire
  • Normaliser l'échelle du modèle en se basant sur sa boîte englobante (bounding box)
  • Collecter et restaurer les noms originaux des maillages via un post-traitement USDA

7. Problèmes Courants en Production et Solutions

Issue Cause Solution
Textures manquantes Le serveur manque d'un décodeur canvas / image @napi-rs/canvas + correctif personnalisé pour ImageLoader
Pièces qui disparaissent dans l'USDZ Matériaux non pris en charge Forcer l'utilisation de MeshStandardMaterial + configuration correcte des faces (side)
Mauvaise échelle dans le Vision Pro Les unités CAD varient considérablement d'un fichier à l'autre Normalisation automatique basée sur la boîte englobante (bounding box)
Noms de pièces perdus L'USDZExporter renomme automatiquement các objets Collecte des noms en amont + post-traitement USDA
Expirations de délai fréquentes (Timeouts) Processus de conversion synchrone Tâches asynchrones + service STEP dédié

Conclusion

Un pipeline de conversion STEP và GLB vers USDZ fiable implique bien plus que le simple appel d'un outil d'exportation. Cela requiert :

  • Une séparation claire entre la couche API et le traitement lourd
  • Un service dédié à la tessellation CAD utilisant cascadio + OCCT
  • Un environnement Node.js robuste doté de polyfills complets pour Three.js
  • Une normalisation minutieuse de la scène et un post-traitement rigoureux
  • Une gestion appropriée des erreurs, des délais d'expiration et une surveillance (monitoring) continue

Ce pipeline a prouvé sa stabilité sous une charge de production réelle et constitue la base de notre workflow 3D dédié à la visualisation d'ingénierie ainsi qu'aux cas d'usage de formation en réalité augmentée (AR).