MWS/teść zadań/cw3.md
2021-09-16 19:40:48 +02:00

9.1 KiB

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 | Vogel

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
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

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.

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

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łąź:

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

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