Principe de génération des contours

Les silhouettes sont extraites comme le zéro de l’expression n·v sur le maillage, où n représente les normales interpolées aux sommets et v le vecteur vue. Cette condition produit des chaînes continues qui sont ensuite lissées légèrement avant d’être encrées. La chaîne de double courbe d’une immersion est ajoutée de la même façon, garantissant la continuité même aux points de singularité. Le pipeline de contour, décrit par Hertzmann (1999), repose sur le chaînage des segments et la visibilité calculée sur le GPU.

Hachurage suivant les courbures principales

Le hachurage repose sur les lignes de champ de courbure principale. Trois densités imbriquées sont pré‑calculées : la première suit la première direction principale, la seconde suit la direction orthogonale pour le cross‑hatching, et la troisième ajuste le ton en fonction de la valeur de courbure. L’ordre des directions utilise la courbure signée plutôt que la magnitude, ce qui préserve la continuité lorsque κ₁ = −κ₂. Les traits sont générés comme des rubans coniques dont l’épaisseur augmente du côté ombré et vers le spectateur, reproduisant l’effet d’un pinceau à large plume.

Gestion de la visibilité et des effets de papier

La visibilité est résolue en deux passes GPU : une passe de lignes cachées trace les parties occultées en pointillé, tandis qu’une « halo de papier » monoface est dessinée sous chaque contour proche, masquant les lignes derrière. Les hachures restent fixes dans l’espace objet, évitant le glissement perceptible décrit par Praun et al. (2001). Les débuts de traits sont accentués par un effet de « pooling » d’encre, et la terminaison dépasse légèrement le point final, rappelant le rendu de traits esquissés.

Implémentation et références algorithmiques

Le maillage des surfaces implicites utilise la variante tétraédrique de Marching Cubes (Lorensen & Cline, 1987) pour la polygonisation. Le test d’intersection segment‑triangle de Möller‑Trumbore (1997) alimente le calcul de la double courbe. Les fonctions mathématiques sont exposées en JavaScript ; par exemple :

function boy(u,v){
  const w = Math.tan(Math.PI*u/4);
  const k = 2*Math.sqrt(2*3-1)/(3-1);
  const denom = w*w*3 + k*w*3 - 1;
  return [3*u/denom, 3*v/denom, 3*w/denom];
}

Cette fonction encode l’immersion Bryant‑Kusner de la surface de Boy, vérifiée à la précision machine. D’autres familles, comme apery(u,v,n,k) ou torusknot(u,v,p,q,R,r,a), offrent des modèles de surfaces classiques (Morin, nœud torique). L’ensemble des références bibliographiques, de Hertzmann (2000) à Jobard & Lefer (1997), confirme que chaque étape du pipeline s’appuie sur des travaux éprouvés en rendu non photoréaliste.