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.
źródło
Odpowiedzi:
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) 2)
3)
4)
Wynik końcowy:
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:
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:
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:
Łączymy górną i dolną połowę:
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:
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.
źródło