# Sweep Surface Sweep (swept) Surface to metoda generowania powierzchni za pomocą dwóch krzywych gdzie jedna jest przesuwana wzdłuż drugiej (stąd sweep oznaczające zamiatać) ![Vogel](swept-tube-c.jpg) | ![Vogel](swept-tube-s.jpg) Istnieją różne warianty tej metody, w które pozwalają kierować różnymi parametrami powierzchni. My będziemy wykorzystywać je do tworzenia takich organów jak płatki czy liście. Dlatego w naszym przypadku będziemy kontrolować szerokość i wygięcie powierzchni. Otwórz scenę `SweepSurface`, znajdziesz w niej obiekt `Leaf Generator`, wybierz go. Zawiera on skrypt `LeafGrow`, który będzie służyć do tworzenia liści metodą *sweep surface*. Skrypt posiada szereg parametrów interesują nas następujące: * `Length` - długość powierzchni; * `Width` - szerokość powierzchni; * `Width Curve` - krzywa definiująca szerokość powierzchni. By ją modyfikować kliknij na miniaturkę na prawo od napisu. Jest ona opisywana za pomocą krzywych Beziera; * `Fold Curve` - krzywa definiująca wygięcie wzdłuż powierzchni. Podobnie jak powyżej; * `Infold` - współczynnik wygięcia w poprzek powierzchni; * `Number Of Animation steps` - rozdzielczość powierzchni; Przycisk `Grow Leaf` generuje powierzchnię. ### Obsługa krzywych po otwarciu krzywej wyświetli się jej okno widoczne poniżej. Nowe punkty dodaje się poprzez kliknięcie 2 razy lewym przyciskiem na krzywej. Kliknięcie prawym przyciskiem na punkcie otwiera menu, które, pozwala na usuwanie i precyzyjne przesuwanie punktu (można go też zwyczajnie przeciągnąć). Z opcji polecam spróbować Flat i Broken (pozwala modyfikować styczne niezależnie). ![Vogel](curve.jpg) Przetestuj jak działają powyższe parametry, wygeneruj kilka testowych powierzchni. ## Zadanie (domowe) W podfolderze `leaf_shapes` znajdują się ponumerowane ilustracje przedstawiające różne kształty liści. Utwórz liść za pomocą `Leaf Grow` liść o numerze, który będzie jak najwierniej oddawać liść o numerze, który przystaje do Twojego indeksu modulo 5. ## Dodawanie tekstury Wygenerowany liść ma dość nieciekawy, jednokolorowy materiał. by to poprawić podmienimy kolor na teksturę liścia. Pierwszym etapem jest znalezienie tekstury, która będzie się nadawać. Pominiemy go i skorzystamy z `leaf texutre` w podfolderze `Texture` folderu `Models`. W folderze `Materials` utwórz nowy materiał, kilknij na niego. inspektorze kliknij na kółko obok Albedo, by wybrać teksturę. ![inspector](material.jpg) Pozostaje dopasować teksturę do geometrii liścia. Wykorzystaj do tego parametry Tiling i Offset. Pierwszy służy do skalowania tekstury, drugi do przesuwania jej. ## Eksportowanie liścia W projekcie powinien być zainstalowany **FBX exporter**, jeżeli nie jest znajdź go w `Window -> Package Manager`. By taki liść wykorzystać w innym projekcie należy go wyeksportować, by to zrobić skorzystamy z **FBX exporter**. Kliknij prawym przyciskiem na `Leaf Generator` w hierarchii sceny. Następnie wybierz opcję **export to FBX...**. Ustaw ścieżkę na `Assets/Models` `Export Format` na **Binary** i kliknij export. Poszukaj utworzonego modelu i dodaj go do sceny, żeby się upewnić czy faktycznie jest taki sam. Możesz zauważyć, że pozycja tekstury wróciła do domyślnej wartości. By to naprawić przeciągnij na dodany model wcześniej stworzony materiał. Nie chcemy za każdym razem dodaniem liścia zmieniać materiału, dlatego zapisz obiekt jako prefab przeciągając go do pola ## Zadanie domowe Zastąp płatki róży z poprzedniego zadania domowego wygenerowanymi przez siebie płatkami za pomocą sweep surface # Pipe Model Pipe model pozwala zasymulować pogrubianie się gałęzi wraz z rozwojem rośliny. Polega na wprowadzeniu do symboli odpowiadających za segmenty gałęzi parametru, który odpowiada za jej grubość. Nazwijmy go `L(width,...)`, gdzie `...` oznacza pozostałe parametry. W największej ogólności metoda polega na modyfikowaniu szerokości na podstawie szerokości jego następników (młodszych gałęzi) za pomocą wzoru $$ width = (\sum_{L_c} width_{L_c}^n)^\frac{1}{n}$$ gdzie suma przechodzi po następnikach gałęzi, $width_{L_c}$ jest grubością danej gałęzi a $n$ jest parametrem pomiędzy 2 a 3. Sposób działania jest przedstawiony na poniższym obrazku: ![pipe model](pipe_model.png) Jak widać informacja o grubości jest propagowana z czubków gałęzi do pnia, stąd nazwa *Pipe model*. ## L-Systemy kontekstowe i komunikacja wstecz Do implementacji pipe model potrzebujemy komunikacji w kierunku od następnika do poprzednika. Na poprzednich zajęciach pojawiła się komunikacja L-Systemu od poprzednika do następnika. Jest ona prostsza w obsłudze, bo symbol może posiadać zawsze co najwyżej jednego poprzednika. Natomiast w przypadku Bracketed L-Systemów i rozgałęzień następników może być dowolna liczba i każdy przypadek będzie obsługiwany osobno. Następniki wypisujemy w nawiasach kwadratowych, przykładowo: ``` A > [B]C -> AA ``` Reguły mogą się tyczyć tylko bezpośrednich sąsiadów, więc przykładowo reguła `A>[CD]B` jest nieprawidłowa. Reguła będzie zastosowana, gdy symbol ma takie same następniki i w tej samej kolejności co warunku reguły. To znaczy jeśli weźmiemy regułę ``` A > C -> AA ``` to zamieni ona napis `AC` na `AAC`, ale `A[B]C` pozostawi bez zmian. podobnie ``` A > [B][C]D -> AA ``` zamieni `A[B][C]D` na `AA[B][C]D` natomiast `A[C][B]D` nie obsłuży. Te reguły można łączyć z warunkami logicznymi i z instrukcjami stochastycznymi (Przypominam, że symbole są identyfikowane po znaku i liczbie zmiennych.) Pozostaje jeszcze kwestia jak traktowane są ignorowane znaki. Tak jak poprzednio nie mają one wpływu na kontekst, ponadto, jeżeli zdarzy się, że taki symbol ma kilku następników, wszyscy są brani pod uwagę. Przykładowo, gdy `+` jest ignorowany, to ``` A[+[B]C]D A[+B]+[C]D ``` są traktowane jak `A[B][C]D`. ## Implementacja w L-Systemach Zakładamy że wszystkie segmenty gałęzi są opisywane przez jeden symbol `G(width,...)`, gdzie parametr `width` będzie szerokością gałęzi a zamiast `...` powinny być pozostałe parametry. `n` to parametr, który trzeba zamienić na jakąś wartość liczbową w L-Systemie Pierwszym krokiem jest ustawienie we wszystkich regułach, które tworzą nowe segmenty gałęzi, jednej początkowej wartości. Następnie musimy rozpatrzeć wszystkie przypadki, gdy segment gałęzi jest połączony z innymi gałęziami i dodać odpowiednie reguły. Najprościej jest założyć, że rozgałęzienie są maksymalnie podwójne, wtedy wystarczy rozpatrzyć dwa przypadki: Gdy jest rozgałęzienie, wtedy należy dodać regułę, która poszerza gałąź: ```C G(width,...) > [G(width_1,...)]G(width_2,...) -> G((width_1^n+width_2^n)^(1/n),...) ``` Gdy nie ma rozgałęzienia należy przekazać grubość ``` G(width,...) > G(width_1,...) -> G((width_1),...) ``` uwaga, jeżeli zakładasz, że z boku gałęzi mogą wyrosnąć jakieś inne elementy, to trzeba też to uwzględnić i dodać do tego reguły, przykładowo z boku gałęzi może wyrosnąć liść opisywany symbolem `L`, wtedy trzeba dodać także regułę: ``` G(width,...) > [L]G(width_1,...) -> G((width_1),...) ``` ## Zadanie W Scenie `PipeModel` załadowany jest L-System rozwoju rośliny z poprzednich zadań, rozbuduj go o pipe model. Tak zmodyfikuj interpretację żółwia, żeby uzależnić grubość łodygi od parametru odpowiadającego za grubość. # Przykładowy projekt Wykorzystaj Pozyskaną wiedzę na temat filotaksji i propagacji informacji w L-Systemach do stworzenia modelu rozwoju róży. Użyj propagacji do sterowania wzrostem rośliny zgodnie ze schematem poniżej, jako kwiaty użyj wyników modelu z poprzedniego zadania (nie musisz wizualizować ich rozwijania się, wystarczy, że będą się pojawiać i znikać). **Zaimplemenuj pipe model liście wygeneruj za pomocą sweep surface** ### Schemat rozwoju róży Róża składa się z **łodyg**, **kwiatów** i **liści**. Częścią, która rośnie jest jest czubek łodygi, który będziemy nazywać **wierzchołkiem**. Liście wyrastają bezpośrednio z łodygi, w filotaksji spiralnej. Każdy liść składa się z nieparzystej liczby liści rosnących na przeciwlegle. ![rose](Rose\3.jpg) ![rose](Rose\2.jpg) Cykl rozwoju róży podzielimy na 4 etapy wzorowane na porach roku. #### Wiosna W miejscu starych liści pojawiają się **zalążki** nowych liści, w tym etapie każdy z nich ma szansę stać się **wierzchołkiem** nowej łodygi. Istniejące **wierzchołki** rosną i wytwarzają nowe zalążki liści. #### Lato Obecne **wierzchołki** kontynuują swój wzrost. Na tym etapie nowe łodygi mogą wyrosnąć tylko z nowych **zalążków**, które pojawiają się w wyniku rozwoju łodyg, ale szansa na ich pojawienie jest większa. W trakcie tego etapu **wierzchołek** może zmienić się w **kwiat**. ### Jesień Wzrost rośliny się zatrzymuje, kwiaty zamieniają się w owoce, nie powstają nowe liście ani zalążki. ### Zima Roślina czeka na nową wiosnę, powstałe owoce są obrywane przez okoliczne zwierzęta szukające pożywienia. Pojedyńcze elementy łodygi mogą zostać uśpione lub uszkodzone i w niektórych miejscach nie wyrosną nowe liście lub wierzchołek przestanie funkcjonować. --- Poniżej znajduje się symboliczna reprezentacja zasad ![rose](Rose\rose_diagram.png)