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.

W widoku debugowania można zobaczyć kapsuły, na których opiera się symulacja fizyczna.
Zbliżenie na efekt subsurface scattering

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

Zbliżenie na parametry

Wykorzystane technologie

Projekt zaimplementowano w języku C++ z wykorzystaniem następujących bibliotek:
  • Bullet Physics silnik fizyki
  • Cinder środowisko graficzne

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

Poniżej pobrać można źródła naszego projektu, oraz skompilowane pliki wykonywalne.
Ź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:
  1. Instalacja Cinder:
    1. Pobrać pliki Cinder.
    2. Rozpakować archiwum
  2. Instalacja Bullet
    1. Pobrać źródła Bullet
    2. Wygenerować pliki Visual Studio z użyciem bin/vs2010.bat
    3. Zbudować solucję Visual Studio 0BulletSolution.sln
    4. 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)
  3. Kompilacja
    1. Pobrać źródła projektu
    2. Ustawić w Visual Studio zmienną środowiskową CINDER_DIR na ścieżkę do katalogu Cinder
    3. Ustawić w Visual Studio zmienną środowiskowe BULLET_INCLUDE na ścieżkę do katalogu src Bulleta
    4. Ustawić w Visual Studio zmienną środowiskowe BULLET_LIB na ścieżkę do katalogu lib Bulleta
    5. 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.