Sea Anemones
Projekt został zrealizowany w ramach przedmiotu Pracownia Programowania VR na wydziale MiNI. Wynikiem pracy jest proceduralny generator ukwiałów oraz symulacja ich zachowania w naturalnym środowisku. Szczególny nacisk położono na część wizualną, to jest dokładne oddanie kształtu zwierzęcia, oraz kolory i oświetlenie.
Cel projektu
Celem projektu było utworzenie symulacji wykorzystującej elementy
generowane proceduralnie. Generacja proceduralna wykonywana jest co
klatka, ponieważ kształt obiektu zmienia się w każdym kroku animacji.
Ilość operacji w każdej klatce jest minimalizowana ze względu na
poprawę wydajności obliczeń. Wygenerowany proceduralnie kształt jest
następnie teksturowany i oświetlany przez szereg shaderów, aby jak
najlepiej oddać półprzezroczystość i wiotkość symulowanego
organizmu.
Ukwiał to bezszkieletowy koralowiec, który żyje przytwierdzony nogą (podeszwą) do podłoża morskiego. Czułki, zwykle rozgałęzione, występują wokoło otworu gębowego (często w kilku rzędach). Ukwiały nie posiadają szkieletu wewnętrznego, ale mają dobrze rozwinięte umięśnienie. Te zwierzęta są drapieżnikami- za pomocą komórek parzydełkowych obezwładniają ofiarę i wciągają ją czułkami do otworu gębowego. Ukwiały są często żywo ubarwione i mają wyraźne desenie.
Najciekawsze elementy projektu
Fizyka
Do animacji czułków użyto symulacji fizycznej w czasie rzeczywistym. Jako silnika fizyki użyto sprawdzonego i otwartoźródłowego silnika Bullet. Każdy czułek jest symulowany przez łańcuch kinematyczny, składający się z pięciu kapsuł (kształt walca zakończonego kulami). Wymiary kapsuły odpowiadają wartościom ustawionym przez użytkownika, takim jak długość i grubość czułków. Kolejne kapsuły są połączone ze sobą za pomocą ograniczeń stożkowych, co pozwala symulować dość swobodne uginanie się czułków. Parametry symulacji zostały tak dobrane, aby symulować opory ruchu pod wodą.
Pozycje i orientacja kapsuł po każdym kroku symulacji wyznaczają położenia kolejnych punktów krzywej interpolacyjnej. Użycie krzywej pozwala na interpolację kształtu czułków pomiędzy symulowanymi kapsułami, a zatem wygenerowanie siatki trójątów.
Profilowanie aplikacji pod względem użycia procesora wykazało, że symulacja fizyczna zajmuje od 10% czasu wykonania przy kilkudziesięciu czułkach, do 25% przy okołu dwustu. Bardziej zasobożerne okazało się odtwarzanie dynamicznej siatki trójkątów po stronie procesora.
subsurface scattering
Subsurface scattering (rozpraszanie podpowierzchniowe) to technika graficzna pozwalająca na realistyczne oświetlenie półprzezroczystych obiektów o zmiennym rozproszeniu światła. W metodzie tej wykorzystuje się lokalną mapę głębokości obiektu obliczoną w podobny sposób co dla ambient occlusion, ale z odwróconymi normalnymi. Światło zazwyczaj przenika powierzchnię i jest wielokrotnie odbijane pod różnymi kątami wewnątrz materiału przed jego opuszczeniem, pod innym kątem niż odbiłoby się bezpośrednio od powierzchni.
Przy implementacji bazowaliśmy na informacjach zawartych w publikacji Colina Barré-Brisebois'a , która została zaprezentowana w książce GPU Pro 2.
parametryzacja
Ukwiał jest tworzony dynamicznie na podstawie szerokiego wyboru parametrów. Kontrolę nad parametrami umożliwia otwartoźródłowa bibiloteka Cinder.
Parametry pozwalają na intuicyjną, ale dokładną kontrolę kształtu, wyglądu i zachowania symulowanego ukwiału. Aby ułatwić użytkownikowi stworzenie naturalnego i pełnego życia ukwiału, parametry podzielono na kilka kategorii. Należą do nich:
- Wygląd nogi
- Wygląd i zachowanie czułków
- Wybór shaderów
- Wybór kolorów
- Opcje debugowania
Wykorzystane technologie
Cinder wykorzystywany jest jako framework do tworzenia okna i obsługi OpenGL. Umożliwia interakcję z użytkownikiem poprzez menu i mysz/klawiaturę. Bullet Physics służy do animacji ukwiału: ruchu czułek i nogi oraz kolizji występujących między elementami w środowisku fizycznym (elementów składowych ukwiału oraz elementów zewnętrznych).
Pobieranie
Źródła projektu | SeaAnemones-src.zip |
Pliki wykonywalne projektu dla Windows | SeaAnemones-bin-win32.zip |
Otwarte repozytorium | SeaAnemones at bitbucket.org |
Instrukcja kompilacji ze źródeł
Dla Windows:- Instalacja Cinder:
- Pobrać pliki Cinder.
- Rozpakować archiwum
- Instalacja Bullet
- Pobrać źródła Bullet
- Wygenerować pliki Visual Studio z użyciem
bin/vs2010.bat
- Zbudować solucję Visual Studio
0BulletSolution.sln
- W razie korzystania z VS2012 albo VS2010, może być
konieczność zmiany jednego z plików źródłowych Bulleta w celu
poprawnej kompilacji: w
btQuadWord.h
zmienić linię 76 na:#if (defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)) || defined(BT_USE_NEON)
- Kompilacja
- Pobrać źródła projektu
- Ustawić w Visual Studio zmienną środowiskową
CINDER_DIR
na ścieżkę do katalogu Cinder - Ustawić w Visual Studio zmienną środowiskowe
BULLET_INCLUDE
na ścieżkę do katalogusrc
Bulleta - Ustawić w Visual Studio zmienną środowiskowe
BULLET_LIB
na ścieżkę do katalogulib
Bulleta - Zbudować solucję SeaAnemones:
vc11/SeaAnemones.sln
Sterowanie
Sterowanie kamerą jest zrealizowane przy użyciu myszki. Obrót kamery jest możliwy przy
wciśniętym lewym przycisku myszy. Zbliżenie dostępne jest przy przyciśniętym
prawym przycisku myszy. Środkowy przycisk myszy służy do poruszania kamerą w przestrzeni.
Aby przetestować działanie kolizji należy wcisnąć spację, co powoduje wystrzelenie
czarnej perły w stronę ukwiału.
Powiększenie obrazu do pełnego ekranu jest dostępne pod przyciskiem F.
Inspiracja
Poniżej przedstawiamy pierwszy szkic pomysłu wykonany przez autorów, w którym wymieniono podstawowe parametry charakteryzujące ukwiał.
Zaskakujące zachowanie tchórzliwego ukwiału
Team
Grzegorz, miłośnik chińskiej animacji. Odpowiada za fizykę i mergowanie branchów. Nie umie napisać konstruktora kopiującego.
Agnieszka wykonała parametryczne generowanie kształtu ukwiału oraz shadery Subsurface Scattering. Lubi ukiwały. Nie umie napisać konstruktora kopiującego.
Daria była odpowiedzialna za gradientowe oświetlenie ukwiału oraz shadery Subsurface Scattering. Nie umie napisać konstruktora kopiującego.