Czy ktoś może wyjaśnić podwójne konturowanie?

9

Próbowałem zrozumieć renderowanie wokseli i przyglądałem się podwójnemu konturowaniu (DC).

Jak dotąd rozumiem tak bardzo:

  1. Uruchom funkcję gęstości dla zestawu punktów siatki (tj. Funkcja szumu)
  2. Znajdź, które krawędzie w wiązce zawierają zmiany między punktami końcowymi
  3. Z tych krawędzi utwórz punkty przecięcia (tj. Wektory)

Teraz utknąłem w tym miejscu, następnie generowanie normalnych, ale jak? Podczas przeglądania tego tematu ten obraz zwykle się pojawia.

                                                   Podpisana siatka z krawędziami oznaczonymi danymi Hermite

Z przeprowadzonych badań wynika, że ​​normalne zostałyby wygenerowane z powierzchni izosferycznej. Czy słusznie jest myśleć, że przechodzę od hałasu do izosurface do normalnych? Jeśli tak, w jaki sposób miałbym wykonać każdy krok?

Według mojego zrozumienia, następnym krokiem będzie następujący artykuł DC ;

Dla każdej krawędzi, która wykazuje zmianę znaku, wygeneruj quad łączący minimalizujące wierzchołki czterech kostek zawierających krawędź.

Czy ten cytat jest reprezentowany przez powyższy obraz?

W końcu następnym krokiem byłoby uruchomienie QEF z przecinającymi się punktami i normalnymi, a to wygenerowałoby moje dane wierzchołków. Czy to jest poprawne?

Mydlany
źródło
Jak rozumiem ten proces, jest to coś w rodzaju ... szumu> chmury punktów> powierzchni iso> normalnych ... ale nie jestem wystarczająco inteligentny, aby twierdzić, że potrafię wyjaśnić ten proces poprawnie, więc nie zamierzam próbować odpowiedzi.
Wojna

Odpowiedzi:

3

Normalne byłyby generowane na podstawie gradientu funkcji gęstości w tym samym czasie, gdy otrzymujesz punkty przecięcia między krawędziami a powierzchnią. Jeśli jest to coś prostego i zamkniętego, jak kula, możesz obliczyć normalne analitycznie, ale z hałasem musisz pobrać próbki.

Następne kroki wykonujesz w niewłaściwej kolejności. Najpierw generujesz wierzchołek dla każdej komórki, która wykazuje zmianę znaku. Minimalizowane QEF to po prostu całkowita odległość do każdej płaszczyzny, która jest zdefiniowana przez punkt przecięcia / pary normalne dla tej komórki. Następnie przechodzisz przez krawędzie, które wykazują zmiany znaków i tworzysz quad, używając czterech sąsiadujących wierzchołków (które z pewnością zostały wygenerowane w ostatnim kroku).

Teraz moją największą przeszkodą we wdrożeniu tego było rozwiązanie QEF. Właściwie wymyśliłem proste iteracyjne rozwiązanie, które będzie działało dobrze na (na przykład) procesorze graficznym równolegle. Zasadniczo zaczynasz wierzchołek w środku komórki. Następnie uśredniasz wszystkie wektory pobrane z wierzchołka do każdej płaszczyzny i przesuwasz wierzchołek wzdłuż tej wypadkowej, i powtarzasz ten krok określoną liczbę razy. Przekonałem się, że przesunięcie o ~ 70% wzdłuż wypadkowej ustabilizuje się w najmniejszej liczbie iteracji.

jmegaffin
źródło
Powiedzmy, że mam komórkę / woksel, który, jak wiem, wykazuje zmianę znaku (tj. Przypadek taki jak MC), uruchomiłem funkcję szumu dla każdego 8 rogów komórki, aby znaleźć jej gęstość. Co mam problemy ze zrozumieniem jest z tego, w jaki sposób mogę znaleźć zmienne x , n i p o w QEF?
Soapy
x jest pozycją wierzchołka. Dla każdego punktu przecięcia masz p (pozycja) oraz n (normalny), które składają się na samoloty, które mi chodzi.
jmegaffin
p znajduje się przez stwierdzenie, gdzie średnia ważona dwóch gęstości wzdłuż krawędzi wynosi zero. Następnie obliczasz n , biorąc gradient funkcji gęstości w punkcie p .
jmegaffin
Tak więc w zasadzie dla każdego sześcianu obliczam p i n dla każdej 12 krawędzi, a następnie uruchamiam QEF dla każdej krawędzi komórki p i n do x , która w twoim przykładzie jest na początku woksela / komórki na początek? Następnie, jeśli cztery komórki mają tę samą krawędź, tworzę quad łączący każdą z czterech komórek x ? I czy wynikowy quad to moje wielokątne dane?
Soapy
Nie każda krawędź będzie miała skrzyżowanie, więc niekoniecznie rozwiązujesz QEF dla 12 samolotów. Poza tym to masz!
jmegaffin
1

Od czytania papieru do strony 2, wydaje się, że ciężary objętości są przechowywane w rogach siatki, zamiast być ciężarem samej kostki, jak wolą normalne algorytmy w stylu Marching Cubes. Te grubości narożników określają punkt między krawędzią między 2 narożnikami, w którym następuje zmiana znaku z rogu do rogu. Krawędzie ze zmianami znaku przechowują również normalną krawędź, która jest linią kątową w reprezentacji 2D w OP. Ta normalna informacja jest definiowana podczas tworzenia woluminu (za pomocą dowolnego narzędzia edycyjnego lub metody tworzenia woluminu proceduralnego), a nie po wygenerowaniu powierzchni isosurface, jak można oczekiwać po algorytmie w stylu Marching Cubes. Te normalne dane „stwierdzają”, że linia / powierzchnia przechodząca przez punkt musi mieć określoną wartość normalną. W przypadkach, w których marszowe kostki wyginałyby linię w tym punkcie, aby połączyć się z innym punktem na sąsiedniej krawędzi, zarówno rozszerzone marszowe kostki, jak i podwójne konturowanie przedłużają linię / powierzchnię na zewnątrz, aż przecina się z linią / powierzchnią przechodzącą przez punkt na przylegająca krawędź, która ma inną wartość normalną. Umożliwia to tworzenie ostrych narożników na podstawie danych objętości, w których podstawowe algorytmy Marching Cubes zaokrągliłyby nieco powierzchnię. Nie do końca rozumiem, w jaki sposób QEF (kwadratowe funkcje błędów) odgrywają w tym rolę, z tym wyjątkiem, że wydaje się, że ułatwiają one obliczenie rozszerzonego punktu w sześcianie, w którym będzie znajdować się róg. Rozszerzone kostki marszowe i podwójne konturowanie wydłużają linię / powierzchnię na zewnątrz, aż przecina się z linią / powierzchnią przechodzącą przez punkt na sąsiedniej krawędzi, który ma inną wartość normalną. Umożliwia to tworzenie ostrych narożników na podstawie danych objętości, w których podstawowe algorytmy Marching Cubes zaokrągliłyby nieco powierzchnię. Nie do końca rozumiem, w jaki sposób QEF (kwadratowe funkcje błędów) odgrywają w tym rolę, z tym wyjątkiem, że wydaje się, że ułatwiają one obliczenie rozszerzonego punktu w sześcianie, w którym będzie znajdować się róg. Rozszerzone kostki marszowe i podwójne konturowanie wydłużają linię / powierzchnię na zewnątrz, aż przecina się z linią / powierzchnią przechodzącą przez punkt na sąsiedniej krawędzi, który ma inną wartość normalną. Umożliwia to tworzenie ostrych narożników na podstawie danych objętości, w których podstawowe algorytmy Marching Cubes zaokrągliłyby nieco powierzchnię. Nie do końca rozumiem, w jaki sposób QEF (kwadratowe funkcje błędów) odgrywają w tym rolę, z tym wyjątkiem, że wydaje się, że ułatwiają one obliczenie rozszerzonego punktu w sześcianie, w którym będzie znajdować się róg.

Zauważ, że mówiłem tutaj o liniach i krawędziach w sensie 2D, jak pokazano w OP. Musiałbym trochę przeczytać i pomyśleć, aby rozszerzyć to na 3D w celu generowania siatki wolumetrycznej.

Aby odpowiedzieć na drugą połowę twojego pytania na temat generowania normalnych i myślenia z proceduralnego punktu widzenia opartego na hałasie, wydaje się, że wypełniłbyś swoją objętość danymi szumu, następnie szukał krawędzi ze zmianami znaków, a następnie zbadał 4 kostki które dzielą krawędź, aby dowiedzieć się, jakie trójkąty zostaną wygenerowane, i obliczyć wierzchołek normalny, tak jak dla każdego innego przecięcia wielu trójkątów, biorąc średnią normalnych dla każdego trójkąta, który dzieli wierzchołek. Jest to z mojej strony bardzo spekulacyjne, ponieważ artykuł dotyczy głównie operacji CSG i objętości generowanych z siatek konwertowanych za pomocą skanowania, które mają dobrze zdefiniowane normalne na powierzchniach.

Mam nadzieję, że przynajmniej pierwsza część tej odpowiedzi dotyczy różnic w sposobie przedstawiania i wykorzystywania danych dotyczących masy w sposób zupełnie inny niż podstawowe kostki marszowe oraz dlaczego normalne dane muszą być tworzone dość wcześnie w procesie generowania objętości, gdzie przy podstawowych kostkach marszowych normalne są zwykle tworzone jako ostatni etap procesu generowania siatki.

Wzniesienie
źródło