dany zestaw wierzchołków i trójkątów dla każdej siatki. Czy ktoś zna algorytm lub miejsce, w którym można zacząć szukać (najpierw spróbowałem google, ale nie znalazłem dobrego miejsca do rozpoczęcia) do wykonywania operacji boolowskich na wspomnianych siatkach i uzyskania zestawu wierzchołków i trójkąta dla powstałej siatki? Szczególnie interesujące są odejmowanie i zjednoczenie.
Przykładowe zdjęcia: http://www.rhino3d.com/4/help/Commands/Booleans.htm
źródło
Myślę, że możemy to rozwiązać, jeśli tylko o tym pomyślimy.
Oczywiście chcesz utworzyć ściany (trójkąty), w których przecinają się dwie geometrie. Następnie masz trzy siatki: przecięcie, które właśnie izolowałeś, geometrię 1 i geometrię 2.
Następnie po prostu usuń to, czego nie potrzebujesz!
Myślę, że to obejmuje, co? Najtrudniejszą częścią byłoby oczywiście stworzenie twarzy skrzyżowania. W tym celu iteruj po każdej twarzy jednej i sprawdź, czy ta twarz jest częścią drugiej; jeśli jest całkowicie w środku, skopiuj twarz jako część siatki przecięcia. Jeśli jest częściowo wewnątrz, musisz podzielić trójkąt wzdłuż linii przecięcia; Myślę, że DirectX i OpenGL miałyby w tym celu funkcje pomocnicze, lub to tylko matematyka 3D (wektory). Nauczyłem się tego rodzaju rzeczy w Rachunku 3 (a może 2?), Ale jeśli nie masz pojęcia, może zapytaj na stronie math.stackexchange.com . I oczywiście, jeśli twarz jest na zewnątrz, nie rób nic. Po wykonaniu iteracji po wszystkich powierzchniach obu siatek pozostanie siatka przecięcia.
źródło
Jeśli masz do czynienia z modelami wielokątnymi, być może będziesz musiał poradzić sobie z geometrią niezróżnicowaną, co oznacza, że pytanie, co jest „wewnątrz”, a co „na zewnątrz” nie jest zdefiniowane. Wykonanie operacji boolowskiej jest trudne, jeśli nie wiesz, czy masz 0, czy 1.
Musisz także radzić sobie z przypadkowymi przypadkami, takimi jak wielokąty współpłaskie, wielokąty przecinające krawędzie, wierzchołki leżące na krawędziach i / lub twarzach oraz rzeczy tego rodzaju. Żadna z tych rzeczy nie jest niemożliwa, potrzebujesz tylko solidnego sposobu reprezentowania danych siatki i ścisłej definicji tego, co się wydarzy w takich przypadkach.
źródło
Warto zauważyć, że większość twoich operacji może być reprezentowana przez negację i zjednoczenie, gdzie negacja jakiejś geometrii jest właśnie tą geometrią z odwróconymi normalnymi. Jeśli więc możesz uzyskać prawidłowy związek, pozostałe operacje powinny po prostu następować:
Sander ma kilka całkiem dobrych postów na blogu, które omawiają implementacje CSG: http://sandervanrossen.blogspot.com/search/label/CSG
źródło
Jest to dość trudny temat, przynajmniej jeśli chcesz to zrobić solidnie (zmiennoprzecinkowe powoduje pewne poważne trudności).
Chciałbym wskazać na literaturę geometrii obliczeniowej / grafiki komputerowej na ten temat, szczególnie te ostatnie:
http://homes.cs.washington.edu/~gilbo/repofiles/booleans2009.pdf
http://openflipper.org/uploads/media/campen_2010_eg_02.pdf
źródło