Generowanie geometrii proceduralnej

10

Niedawno przyglądałem się programowi SceneKit dla systemu OS X i zauważyłem, że istnieje kilka fabrycznych metod tworzenia kształtów geometrycznych, takich jak:

Pudełko, kapsułka, stożek, cylinder, samolot, piramida, kula, torus i tuba.

Jestem zainteresowany dodawaniem takich prymitywnych kształtów do mojego renderera, ale staram się znaleźć jakieś rozsądne źródło, z którego mogę uzyskać wiedzę na temat generowania procedur. Istnieje kilka zasobów, które szczegółowo opisują teorię, ale brakuje odpowiedniego kodu źródłowego, aby ją wykonać.

SceneKit zapewnia fabryczne metody, które pozwalają dynamicznie ustawiać atrybuty takich kształtów. W przypadku ramki można podać wartości całkowite dla liczby segmentów szerokości, wysokości i głębokości, na które powinna być podzielona każda twarz.

Rozumiem teorię, ale brakuje mi wiedzy, aby rozpocząć dzielenie powierzchni geometrycznych w celu osiągnięcia pożądanego efektu.

Wierzchołki dla każdego kształtu są najprawdopodobniej dość łatwe do wygenerowania w prostych pętlach. Tym, co mnie zaskakuje, jest wiedza o tym, jak tworzyć twarze, a raczej odpowiednie współrzędne tekstury dla każdej twarzy. Normalne można obliczyć dla każdej twarzy, więc jestem całkiem pewien, że mogę osiągnąć to, czego chcę, po prostu wiem, od czego zacząć.

Czy ktoś może podać jakiekolwiek szczegóły dotyczące geometrii proceduralnej? Tak naprawdę potrzebuję kodu źródłowego, aby uzyskać informacje. Szukałem wysoko i nisko tutoriali, ale do tej pory wymyśliłem tylko kilka rozsądnych stron lub blogów. Wszelkie dobre książki, tutoriale, blogi lub artykuły badawcze będą mile widziane.

Edytuj na podstawie komentarzy

Powinienem był wyjaśnić, że wiem, jak tworzyć wierzchołki dla podstawowych kształtów, większość z nich można prawdopodobnie osiągnąć za pomocą prostych pętli. Nie rozumiem, jak tworzyć twarze z wygenerowanej tablicy wierzchołków. Jak utworzyć pasek trójkąta lub trójkąty z pozornie nieuporządkowanej tablicy wierzchołków?

Zakładam, że gdy przekroczę ten punkt, mogę utworzyć normalne z każdej twarzy. Chociaż nie zagłębiłem się jeszcze w to, widziałem wiele odniesień do tego i jestem pewien, że będzie to łatwe do wdrożenia.

Idealnie chciałbym być w stanie wygenerować geometrię z danego zestawu właściwości, takich jak sposób, który zapewnia SceneKit. Biorąc pod uwagę, że SceneKit to zrobiło i możesz robić podobne rzeczy w Blenderze i Mayi itp. Zakładam, że nie próbuję realizować rzeczy niemożliwych.

Ostatnim aspektem byłoby zastosowanie tekstur. Ponownie nie jest to coś, co zaimplementowałem, ale przeczytałem i jestem świadom wymagań.

Głównym problemem tutaj jest to, że wiem, co chcę osiągnąć, ale staram się rozszyfrować, jak zaimplementować wyżej wymienione prymitywy. Miałem nadzieję, że uda mi się znaleźć pozory wiedzy za pomocą kodu źródłowego, ale do tej pory nie spotkałem niczego odpowiedniego.

CaptainRedmuff
źródło
Mówisz, że twoim problemem jest podział geometrii, ale potem mówisz, że tworzenie wierzchołków powinno być łatwe, a potem mówisz, że twoim problemem jest tworzenie ścian, a potem mówisz, że twoim problemem jest mapowanie tekstur. Jaki masz problem? Czy potrafisz wygenerować pozycje wierzchołków? Czy potrafisz wygenerować krawędzie i ściany? Również współrzędne tekstury zależą od tekstury i tego, co chcesz z nią osiągnąć, więc pytanie o współrzędne tekstury nie jest dobre. Wreszcie, generowanie prymitywów dotyczy po prostu geometrii, a ludzie rzadko nazywają ją „geometrią proceduralną”, chociaż taka właśnie jest.
jrsala
Rozumiem, jak tworzyć geometrię dla prostych kształtów, takich jak sześcian lub płaszczyzna, to tworzenie ścian, których nie rozumiem. Jak utworzyć twarze z pęczka wierzchołków? Wykreślenie punktów dla bardziej złożonych kształtów jest częścią problemu, mimo że mam podstawową wiedzę. Skleję je wszystkie razem w trójkątny pasek lub trójkąty, dlatego staram się owinąć głowę.
CaptainRedmuff
OK, dzięki za szczegóły. Możesz zredagować swoje pytanie, aby wyjaśnić. Czas na odpowiedź!
jrsala

Odpowiedzi:

11

Sposobem na wygenerowanie krawędzi i powierzchni prymitywnego kształtu, takiego jak pudełko, stożek i wszystkie te, które zacytowałeś, jest wygenerowanie ich w tym samym czasie, gdy tworzysz wierzchołki. W rzeczywistości należy tworzyć wierzchołki w logiczny sposób, który ułatwia odpowiednie obliczenie krawędzi i ścian.

Istnieją algorytmy, które przyjmują jako dane wejściowe zbiór punktów w przestrzeni i obliczają nad nim tak zwaną „ triangulację zbioru punktów ”, ale problem triangulacji zbioru punktów jest NP-kompletny , dzięki czemu szybciej jest tworzyć krawędzie i ściany w miarę upływu czasu niż po prostu obliczać wierzchołki i pozwolić algorytmowi zadziałać. Informuję tylko, że istnieje takie rozwiązanie.

Oprócz tego nieefektywnego rozwiązania, myślę, że możesz traktować prymitywy tylko dla poszczególnych przypadków, jak w poniższych przykładach.

Siatka to wierzchołki i ściany . Krawędzie są zawarte w opisie ścian, chyba że siatka zawiera linie, które nie tworzą ścian. Wierzchołki są krotkami 3 współrzędnych zmiennoprzecinkowych. Krawędzie są po prostu parami odniesień do wierzchołków, ale z pewnością nie będziesz ich potrzebować. Powiedz na przykład, że twoje wierzchołki są w indeksowanej tablicy. Cóż, twoje krawędzie mogą być wtedy parami wskaźników z tej tablicy. Twarze są trojaczkami odniesień do wierzchołków lub trojaczkami indeksów w przypadku tablicy indeksowanej .

Powinieneś być w stanie policzyć wierzchołki, krawędzie i ściany, które składają się na każdy z tych prymitywnych kształtów, ponieważ możliwość ich policzenia oznacza zrozumienie właściwości obiektu, co pomaga ci opracować metodę, w której je zbudujesz, używając pętli i inne narzędzia, jak zobaczymy.

Stożek

W przypadku stożka z n + 2 wierzchołkami, krawędziami 3n i powierzchniami 2n :

  1. Zrób dwa osobne wierzchołki.
  2. Zrób okrąg wokół jednego z wierzchołków (wierzchołka podstawowego), który znajduje się w płaszczyźnie prostopadłej do odcinka między dwoma pierwszymi wierzchołkami. Mam nadzieję, że możesz zrobić koło za pomocą trygonometrii, prawda? To już wszystkie wierzchołki stożka. To także jedna trzecia wszystkich krawędzi ( w okręgu jest n krawędzi w sumie 3n ).
  3. Zrób n krawędzi od wierzchołka podstawowego do n wierzchołków w okręgu. Możesz zrobić połowę twarzy (to znaczy n twarzy).
  4. Zrób n krawędzi od wierzchołka wierzchołka do n wierzchołków w okręgu. Możesz zrobić drugą połowę twarzy (to n twarzy).

1) Dwa wierzchołki 2) i koło
3) i twarze
4)i twarze
Wynik końcowy:wynik

Możesz także tworzyć krawędzie i ściany podczas uruchamiania pętli tworzącej okrąg. Ta sama złożoność, ta sama rzecz. Zrób jeden wierzchołek na kole, zapisz go w tablicy wierzchołków, dodaj odpowiednią krawędź (parę indeksów) do tablicy par indeksów, jeśli masz na to ochotę, i na koniec dodaj odpowiednią powierzchnię do twojej tablicy trojaczków indeksów . Przejdź do następnego wierzchołka.

Cylinder i rura: nie robienie tej samej pracy dwa razy i quady

Ponownie, dla rury zaczyna się ona wierzchołkiem i okręgiem, który będzie środkiem albo górnej, albo dolnej tarczy cylindra:

  1. Zrób wierzchołek.
  2. Zrób okrąg wokół wierzchołka. Dodaj krawędzie (jeśli chcesz krawędzie) między kolejnymi wierzchołkami okręgu oraz między środkowym wierzchołkiem a każdym wierzchołkiem okręgu. Dodaj twarze między każdą triolą wierzchołków wykonanych ze środkowego wierzchołka i dwoma kolejnymi wierzchołkami na okręgu.
  3. Powiel wszystko, przełóż kopię w kierunku prostopadłym do właśnie wykonanej podstawy, o długość żądanego cylindra.
  4. Połącz górę i dół.

Aby połączyć górę i dół, musisz utworzyć poczwórne pary par naprzeciw siebie wierzchołków. Więc pomyśl przed siebie i dlaczego nie uczynisz się funkcją, która tworzy dwie trójkątne twarze z czterech wierzchołków?

Gotowy. Zauważ, że tym razem wykorzystujemy fakt, że ta sama struktura (okrąg + środek) pojawia się dwa razy w cylindrze, aby uzyskać skrót. Nie musimy robić wszystkiego ręcznie wierzchołków, krawędzi i powierzchni, w przeciwieństwie do stożka, gdzie było to konieczne.

Zgodnie z tą zasadą lenistwa można również zrobić jedną czwartą okręgu i powielić go, i ponownie zrobić pełne koło z bardzo prostymi przekształceniami (ważne dla dowolnego koła, tak jak ze stożkiem), ale to naprawdę przesada dla niezbyt skomplikowany kształt.

Zawsze musisz używać właściwości geometrycznych tworzonych obiektów, aby uprościć ich tworzenie . Mianowicie, ich symetrie i niezmienniki .

W przypadku walca po prostu nie twórz bazowego wierzchołka, po prostu utwórz okrąg, powielić, przetłumaczyć kopię, zrobić quady, gotowe.

Kula i kapsułka: dodając złożoności, wciąż nie ta sama praca dwa razy

Aby stworzyć kapsułkę, chcemy stworzyć kulę UV, podzielić ją na dwie połowy, przetłumaczyć pierwszą połowę, a następnie połączyć obie z bokami kapsułek.

Ponownie możliwe jest utworzenie tylko jednej ósmej (!!) kuli, a następnie zduplikowanie jej i odwrócenie, a następnie zduplikowanie i odwrócenie wyniku, z wyjątkiem innej osi itp., Aby uzyskać pełną kulę, w 4 krokach (utwórz ósmy , zduplikuj i odwróć trzy razy). Może przesada, ale mniej niż w przypadku koła.

Prosta kula UV:
kula

W rzeczywistości wykonujemy tylko jedną połowę (na przykład), kopiujemy tę połowę, odwracamy kopię do góry nogami i tłumaczymy ją długością kapsułki:
połówki

Łączymy górną i dolną połowę:
kapsuła

Prawdziwa (nieco) ciężka praca pochodzi z trygonometrii, która polega na tworzeniu kuli. Zbiór wszystkich wierzchołków należących do kuli UV można opisać jako zbiór wszystkich punktów formy:

zwrotnica

gdzie R jest promieniem kuli i dla pewnej dodatniej liczby całkowitej N mamy stałą

θ = × π / N ,

k i n są liczbami całkowitymi z k zmieniającym się od 0 do 2N-1 oraz n zmieniającym się od -N / 2 do + N / 2 .

Aby stworzyć półkulę lub Ósmy sfery, musisz ograniczyć zbiór wartości przyjmowanych przez k i n .

Gdyby k było liczbami rzeczywistymi, a nie tylko liczbami całkowitymi, dostałbyś całą kulę, a nie tylko wierzchołki na jej powierzchni. Więc to, co tutaj zrobiliśmy, to rasteryzacja równania powierzchni pierwotnej .

Przerażający torus : po tym wszystkim, co widzieliśmy, jest łatwy!

Ponownie, więcej trygonometrii, więcej wierzchołków, więcej quadów, więcej symetrii, więcej niezmienników ... więcej geometrii! Znajdź równanie dla powierzchni torusa, „rasteryzuj go poprawnie”, uprość problem, używając (oczywistych) symetrii torusa, a na koniec zapętl się przez zestaw właśnie zdefiniowanych wierzchołków i twórz krawędzie i twarze podczas udać się!

Widzieć? Całkowicie proste.

jrsala
źródło
Łał. Dziękuję bardzo za tak szczegółową odpowiedź i za tak wiele przykładów. Nie zastanawiałem się nad pomysłem wygenerowania połowy kuli i odbicia symetrycznych elementów. Bardzo dziękuję za poświęcenie czasu na napisanie tego w sposób, który mogę łatwo zrozumieć i mam nadzieję z łatwością wprowadzić w życie z łatwością.
CaptainRedmuff
Nie ma za co! Przykro mi, ale nie było kodu.
jrsala
Zarys metod był bardziej tym, czego naprawdę potrzebowałem. Mogę zacząć opracowywać plan działania przynajmniej odtąd:] Nie sądzę, żebyś miał jakieś informacje na temat pudełek / kostek z fazowanymi krawędziami? docs.autodesk.com/3DSMAX/15/ENU/3ds-Max-Help/images/…
CaptainRedmuff