Próbowałem zrozumieć renderowanie wokseli i przyglądałem się podwójnemu konturowaniu (DC).
Jak dotąd rozumiem tak bardzo:
- Uruchom funkcję gęstości dla zestawu punktów siatki (tj. Funkcja szumu)
- Znajdź, które krawędzie w wiązce zawierają zmiany między punktami końcowymi
- 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.
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?
źródło
Odpowiedzi:
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.
źródło
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.
źródło