Symulacja 3D

Opis i założenia przedmiotu

Przedmiot dla zaawansowanych grafików komputerowych. Ten wykład i cały przedmiot jest przygotowany dla osób, które trochę dobrze już znają grafikę komputerową tworzoną w Blenderze. Optymalnie, gdyby kończyły wcześniej kursy u mnie o nazwie Grafika 3D (cały semestr) oraz Animacja 3D (też cały semestr), które prowadzę od wielu lat. Zapisanie się na ten przedmiot bez uprzedniej potwierdzonej znajomości Animacji i Grafiki nie powinno być możliwe. Na tym przedmiocie nie powtarzam już podstaw!

O czym jest tu mowa

Pełen program, tzw. program maksimum, który jakimś cudem można byłoby zrealizować mając odpowiednio chętną i zaawansowaną grupę studentów, wygląda tak:

Wstęp

Ustalamy zakres przedmiotu oraz określamy robocze środowisko. Najczęściej dotyczy to ostatniej stabilnej wersji Blendera. Zwykle na pierwszych zajęciach pokazuję co można zrobić i jest to raczej taki zestaw możliwości i wykład pokazowy. Jeżeli studenci tego wymagają, krótko powtarzamy niektóre informacje z Animacji lub Grafiki, ale nie trwa to długo: oczekuję, że podstawy są już znane. Czasami na tym etapie (oprócz spraw organizacyjnych) pokazuję jak renderować w wydajny sposób, oraz jakie nietypowe i zaawansowane opcje warto w Blenderze włączyć (nie jest to konfiguracja identyczna jak ta, której używamy podczas studiowania Grafiki).

Symulacje Rigid Body

Omawiam tutaj bardzo interesujący silnik symulacyjny wbudowany w Blendera, który pochodzi z przepisanego silnika Bullet, używanego kiedyś między innymi w takich grach jak Half Life, i innych. Kiedyś w Blendera był wbudowany jako Game Engine, potem został usunięty i zintegrowany z nową bazą kodową 2.8. Silnik ten zyskał na stabilności i paru nowych możliwościach, obecnie jednak nie jest już aktywnie rozwijany. Wydaje się, że osiągnął pewną dojrzałość, a najprawdopodobniej zostanie zastąpiony czymś innym, np. odłożonym na razie "trybem interaktywnym". W silniku tym można tworzyć złożone, dynamiczne relacje między obiektami, symulować efekty sprężystości, tarcia i bezwładności, oraz oczywiście bryły sztywne. Ciekawym rozszerzeniem jest także Motor - rodzaj constraintu, który nadaje obiektom energię. Silnik ten dobrze współpracuje ze zwykłymi animacjami opartymi o klatki kluczowe, i jest najstabilniejszy wtedy, gdy dotyczy wielkich i ciężkich obiektów. Na zajęciach tłumaczę jak można ten silnik skonfigurować, ustabilizować, oraz jak robić powiązania między obiektami, umożliwiając np. symulowanie rozpadających się kaskadowo obiektów (mur, który się łamie, a potem rozpada, szkło, które się tłucze na kawałki, drewno, które łamie się zachowując włóknistą strukturę drzazg, itp.). Śmiesznym i bardzo atrakcyjnym zastosowaniem tego silnika jest wykonywanie symulacji typu rag-doll, czyli postaci ludzkich biorących udział w samochodowych wypadkach, upadkach i rozmaitych kraksach.

Symulacje cząsteczkowe

To bardzo wielki temat, który zwykle rozbijam na kilka osobnych wykładów. Pokazuję podstawy działania systemu cząstek, jak i kiedy sa generowane, jakie mają parametry i jak przekłada się to na ewolucję systemu. W gruncie rzeczy, opowiadam o wszystkich ustawieniach pokazując jak działają i tłumacząc jaki efekt można osiągnąć za pomocą odpowiednio wysterowanych opcji - i okazuje się że jak zwykle całkiem niewielkie zmiany generują zupełnie różne efekty i wyniki. Poznajemy na tym etapie takie pojęcia jak Ruchy Browna, generowanie siatkowe, efekty składania prędkości i masę innych efektów. Na tym pierwszym etapie uczymy się jak kontrolować ruch cząstek aby utworzyły w przestrzeni różne kształty według naszych potrzeb, np. napisy, spiralę lub inne efektowne akcje. Na kolejnym wykładzie pokazuję cząstki bardziej zaawansowane oraz możliwości wirtualnego zwiększania ich liczby za pomocą Children zwykłych lub interpolowanych. Często w takim temacie zapoznaję studentów z tematem generowania i wizualizacji fal uderzeniowych, gdzie możemy prześledzić jak na poziomie mikroskali powstaje wybuch (zaczyna się zwykle od zarodków, które są znacznie gorętsze od reszty cząstek, one podgrzewają układ powyżej temperatury krytycznej i następuje bum). Badamy także i obserwujemy jak zachowują się cząstki symulowane przy użyciu SPH (ang. smoothed particle hydrodynamics) w dwóch wersjach - nowej, i klasycznej. Jeżeli starczy czasu (lub na kolejnym wykładzie) przechodzę do bardziej statycznych zastosowań, i omawiamy symulowanie włosów oraz ogólnie pod-silnik Hair. Włosy są jego oczywistym zastosowaniem, ale można go także wykorzystać do pozycjonowania obiektów takich jak rośliny, kwiaty, drzewa, krzaki, kamyki na ścieżce i inne obiekty, których instancje można lub należy ustawiać precyzyjnie. Oczywiście przedstawiam takie tematy jak zagadnienia związane z cieniowaniem (ang. shading) włosów, włącznie z ich anizotropowymi własnościami. Na końcu tego obszernego tematu poruszam trochę tematykę animacji włosów z ich własną dynamiką, poruszanie się łanu zboża lub trawy, i wchodzimy trochę w tematykę pól siłowych, w szczególności pola Texture Field (chociaż inne też można wykorzystać). Zbliżenie do pól siłowych umożliwia nam wejście w nowy temat na następnym wykładzie. W systemie cząstek można zrobić dużo więcej, ale zwykle nie poruszam wszystkich tematów, bo nie ma na to czasu. A każdy taki temat powinien być wyjaśniony i przećwiczony, bo bez ćwiczeń studenci lubią wszystko szybko zapominać :) Ale gdy jest czas lub zainteresowanie, to czasami pokazuję także specyficzny sposób generowania cząstek za pomocą sprite'ów, w modelu bilboard. Umożliwia to zrobienie takich animacji jak np. efekt Matrix 3D (chociaż efekt ten można zrobić także innymi metodami). Używanie sprite'ów do animacji cząstek można wykorzystać także do generowania losowych lub jakoś sterowanych obiektów typu 'custom', na przykład strumienia magicznych gwiazdek lub zmiennych w czasie czcionek lub obiektów w które przemienia się każda cząstka w czasie. Bilboardy rozszerzają znacznie ilość możliwości, ale jako takie są dość rzadko używane, wymagają mapy kafli do prezentacji i ogólnie jest sporo z nimi roboty. Pamiętam, że w trakcie istnienia przedmiotu Animacja (gdy jeszcze nie było symulacji) zdarzyło mi się ten temat opowiadać może dwa razy...

Symulacje Soft-Body

Jest to dość rozbudowany symulator brył posiadających elastyczność, który przy standardowych ustawieniach zdaje się niczego sensownego nie generować. Pokazuję jak zrobić aby proste prymitywne obiekty nabrały sprężystości i wyjaśniam, gdzie modyfikuje się parametry sprężystej siatki. W modelu tego silnika można dość sporo zrobić, ustawia się np. siły sprężystości kierunkowe, można usztywniać także przekątne lub tworzyć zjawisko zderzeń deformujących (niesprężystych), kolizje mogą być liczone na różne sposoby. Niestety, silnik ten nie jest zintegrowany z Rigid Body ale jest to pewnie kwestią czasu, o ile wcześniej cały Blender nie przejdzie przeprojektowania pod kątem Wszystko w Nodach (ang. Everything Nodes). Silnika tego używamy następnie do symulowania różnych elastycznych obiektów, takich jak np. galaretka, elastyczne materiały, nadmuchiwane obiekty (balony) lub samochody, które przy zderzeniu zgniatają się trwale. Ogólnie jest to bardzo ciekawy symulator, chociaż stanowi on starą bazę kodową i dawno już nie był aktualizowany.

Cloth

Ten silnik symulacyjny mógłby przypominać czasami Soft-Body ale jest liczony inaczej, uwzględnia wewnętrzne kolizje obiektu z samym sobą i wspiera zszywanie fragmentów tkaniny za pomocą przyłożonych w zdefiniowane przez animatora miejsca sił, którymi można sterować (ang. sewing). Pokazują jak robi się tkaniny, obrusy, flagi, wyjaśniam możliwości związane ze zmianą elastyczności tkaniny i jej parametrami i porównujemy jak na stół upada np. obrus z grubej skóry, z ciężkiej, lejącej się gumy albo z leciutkiego jedwabiu. Za każdym razem wyniki są zupełnie różne. Tego typu symulacje są idealne, jeżeli chcemy wymodelować np. wiszące zasłony w oknach, zmięty i rzucony na oparcie krzesła ręcznik lub skotłowaną pościel na łóżku. Oprócz tego silnik ten pozwala generować realistyczny ruch ubrań, zarówno sukienek i innych zwiewnych fragmentów stroju, jak i flag lub sztandarów przyczepionych trwale do obiektów sztywnych. Wyjaśnienia działania tego silnika nie zabierają wiele czasu, bo studenci mają już doświadczenie w działaniu podobnych silników omówionych wcześniej (w szczególności Soft Body). Znane są zatem metody przywiązywania obiektu elastycznego do obiektu sztywnego, reguły określania zmiennej sztywności elementów i zachowanie obiektów gdy wchodzą w kolizję z tzw. koliderami (czyli obiektami, które wymuszają kolizję podczas kontaktu).

Fluid

Ten temat jest często długo oczekiwany i wręcz pożądany przez studentów. Symulacje płynów w Blenderze są liczone przez silnik MantaFlow, zintegrowany z Blenderem chociaż przez pewien czas stanowił osobny projekt Open Source. W silniku tym możliwe jest generowanie realistycznych ruchów cieczy w skalach większych niż pozwalał na to system cząstek, możliwe są zatem animacje makroskopowego zachowania się płynów. W silniku tym można osobno symulować i osobno przeliczać różne elementy dynamiki - ruch samego płynu, ruch piany, ruch bąbelków powietrza itp. Jest to symulacja domenowa, to znaczy że obliczenia działają tylko w ściśle określonej przestrzeni, i w niej musi zmieścić się cała nasza akcja. Pokazuję także jak zrobić efekty gdy w wodzie pływa lub znajduje się jakiś obiekt przeszkadzający (ang. obstacle). Symulacje tego typu niestety zwykle zajmują sporo miejsca na dysku, gdzie zapisywane są tzw. cache. Oprócz wody i innych cieczy, silnik ten pozwala animować efekty takie jak dym i ogień, z dodatkowymi własnościami, takimi jak rozkład gęstości, temperatura, mapa ciepła, przepływu, itp. Dzięki temu można wygenerować wolumetryczny ogień lub fotorealistyczne zmętnienia atmosfery, dym z papierosa lub grzyb z wybuchu jądrowego. Możliwe jest też generowanie dymów zależnych od temperatury - więc opary ciekłego azotu spływające w dół po ściance naczynia to w sumie dość trywialna do zrobienia sprawa.

Dynamic Paint

Efekty takie jak wgniecenia, ślady na powierzchni zostawiane przez rysy, płynące krople płynów lub udar (wywołujący fale) symuluje się za pomocą efektów Dynamic Paint. Możliwe jest tutaj malowanie powierzchni jednego obiektu, ustawionego jako "płótno" drugim obiektem. Możliwe jest zrobienie kółek na wodzie, które powstają np. wtedy gdy pada deszcz. Efekty Dynamic Paint można zapisać w formie danych wierzchołków (jako grup wag) albo wypalić do plików graficznych, co umożliwia potem używanie ich jako animowanej tekstury. Możliwości które uzyskujemy przez Dynamic Paint są po prostu zaskakujące. Można zrobić efekt np. wysychającej wody lub właśnie odwrotnie - pocącej się skóry lub ściany. Efektów tych używa się także wszędzie tam, gdzie trzeba zrobić animację powstawania tzw. 'decals', czyli śladów powstających na jakiejś powierzchni. Dobrym przykładem jest wypalenie osmalonej dziury lub śladów za pomocą rozgrzanego przedmiotu (idealne do mieczy świetlnych - ale to już mocne wejście do Efektów Specjalnych). Ogólnie ten temat tłumaczę na końcu całego kursu, czasami zamieniając miejscami z wykładem na temat Pól Siłowych.

Pola Siłowe

Jest tutaj mowa o dość uniwersalnym zestawie narzędzi, który pozwala wywołać chaotyczne lub uporządkowane ruchy masowo animowanych obiektów, np. cząstek takich jak płatki śniegu, dym, chmury wolumetryczne lub elementy w przestrzeni poruszające się w słabej grawitacji na które działają inne siły. Pola są bardzo różne, zaczynając od prostych wektorowych sił pchających obiekty w jednym kierunku, do bardziej złożonych które wymuszają nieliniowe zmiany sił. W polach siłowych można zmieniać sporo parametrów, zwykle są to siła danego pola, jego losowość (zjawisko porywów wiatru) oraz efekty dodatkowe - ciągnięcie (drag), zanik (można zdefiniować go fizycznie, np. z kwadratem odległości) itp. Cząstki także mogą generować pola siłowe które wpływają na siebie, zatem możliwe jest obserwowanie oddziaływań elektrostatycznych w różnych przejawach: elektrycznym, magnetycznym, Lenarda-Jonesa, harmonicznym, i jeszcze paru innych. Ciekawym polem jest pole turbulentne, które jest bardzo często wykorzystywane przy tworzeniu efektów specjalnych w Hollywood (np. zanik bohaterów w Avengers: End Game).