Sfera przesuwana wzdłuż własnych równoległych
Powierzchnia organiczna, oddychająca, zaczyna swój istnienie jako zwykły siatka UV lub icosaedralna sfera. Każdy wierzchołek jest następnie przesuwany na zewnątrz lub do wewnątrz wzdłuż własnej normalnej powierzchni o wartość pochodzącą z funkcji szumu gładkiego obliczonej dla pozycji 3D wierzchołka, plus powoli posuwający się przesunięcie czasu:
displaced = position + normal * noise3D(position * frequency + vec3(0,0,time*speed)) Ponieważ przesunięcie jest dodawane wzdłuż normalnej powierzchni zamiast w stałym kierunku, powierzchnia wypukła się i tworzą wgłębienia w sposób, który zawsze wygląda na zakotwicony w sferze, a nie obita od strony bocznej – ta sama sztuczka używana do rzeźbienia wysokości terenu, tylko owinięta wokół kuli zamiast płaszczyzny.
displaced = position + normal * noise3D(position * frequency + vec3(0,0,time*speed)) * amplitude
Dlaczego szum prostokątny, a nie klasyczny Perlinowski?
Funkcja szumu jest niemal zawsze szumem prostokątnym, następca zaprojektowany przez Kena Perlina w 2001 roku i pochodzący od jego oryginalnego szumu Perlinowskiego z 1985 roku. Klasyczny szum Perlinowski interpoluje wektory gradientu losowego umieszczone w narożnikach kwadratu (2D) lub sześcianu (3D) siatki; w n wymiarach ta komórka siatki ma 2ⁿ narożników, więc koszt oceny jednego próbkowania szumu rośnie wraz z wymiarami – 8 narożników w 3D, 16 w 4D. Szum prostokątny zamiast tego wykorzystuje prostokąt, najprostszy możliwy kształt, który wypełnia przestrzeń w n wymiarach przy użyciu jak najmniejszej liczby wierzchołków – trójkąt w 2D, tetraedr w 3D, więc próbka 3D potrzebuje tylko 4 ocen narożników zamiast 8. Jest również wizualnie czystszy: siatka kwadratowa/sześcianowa leżąca u podstaw klasycznego szumu Perlinowskiego pozostawia delikatne artefakty kierunkowe osiowe, podczas gdy siatka prostokątna jest znacznie bardziej izotropowa, co oznacza, że wynikowe wzniesienia nie preferują cicho osi x, y lub z.
Kontynuacja: dlaczego morph wygląda płynnie, a nie drżąco
Obie rodziny szumów zostały zbudowane tak, aby były ciągłe w stopniu C¹ — funkcja i jej pierwsza pochodna zmieniają się gładko wszędzie, bez nagłych skoków między komórkami siatki. To ma znaczenie podwójne: przestrzennie, ponieważ sąsiednie wierzchołki przemieszczają się o zbliżone ilości i powierzchnia nie rozdziera się na płaszczyzny; oraz czasowo, ponieważ poruszanie funkcją szumu ukrytego czwartego wejścia (czas) z małym, stałym krokiem generuje gładko ewoluujący pole zamiast nowego, niezależnego wzoru losowego za każdym klatką. Próbkowanie szumu 3D w punkcie (x, y, z + t·prędkość) jest powszechną sztuczką, aby tanio uzyskać animowany szum 3D – to przekrój 4D szumu poruszający się przez osadę 3D, bez ponoszenia kosztów pełnej implementacji 4D.
Wielokrotne podziały oktalnych dla uzyskania szczegółowości organicznej
Posiadanie jednego wywołania szumu generuje gładkie, zaokrąglone kępele o charakterystycznej wielkości. Warstwowanie kilku októw – to samo polecenie funkcji szumu próbkowane z podwójną częstotliwością i zmniejszające się amplitudy, sumowane razem (technika zwana ruchem Brownowskim fraktalnym, fBm) – dodaje drobne zmarszczki na wierzchu szerokich wypukłości, tak jak prawdziwe powierzchnie organiczne (chmury, teren, koralowce) wykazują szczegółowość na wielu skalach jednocześnie:
n = 0
amp = 1; freq = 1
for octave in 0..3:
n += amp * noise3D(p * freq + t)
freq *= 2
amp *= 0.5 // each octave contributes half the previous amplitude
Ponowne obliczanie normalnych po przesunięciu
Po przesunięciu wierzchołków, pierwotne normalne na wierzchołki nie są już poprawne dla oświetlenia – wypukła plamka powierzchni powinna cieniować się inaczej niż płaska. Wersidłowy shader może albo ponownie obliczyć normalny analitycznie z gradientu funkcji szumu (szybkie, dokładne, ale wymaga różnicowania funkcji szomu), albo fragmentowy shader może odtworzyć go numerycznie z sąsiednich punktów przesuniętych za pomocą iloczynu skrzyżnego różnicy skończonej. Lśniący, oświetlony przez Fresnel efekt tej symulacji zależy w całości od poprawnego uzyskania aktualnej normalnej – błąd i wypukłości wydają się płaskie niezależnie od tego, ile geometrii faktycznie się przesuwa.
Frequently asked questions
Dlaczego sfera wygina się płynnie zamiast drgać losowo za każdym klatką?
Przemieszczenie pochodzi z szumu simplexu próbkowanego ciągle w przestrzeni i czasie – funkcja została zaprojektowana tak, aby nie powodować nagłych skoków, dlatego sąsiednie wierzchołki i sąsiednie kroki czasowe generują prawie identyczne wartości, co daje wrażenie gładkiego, organicznego przepływu zamiast statycznego.
Jakie jest rzeczywiste różnice między szumem simplexowym a oryginalnym szumem Perlinowskim?
Klasyczny szum Perlinowski interpoluje gradienty na siatce kwadratowej/sześcianowej, co kosztuje 2ⁿ ocen narożnych na próbkę i powoduje delikatne artefakty osiowe. Szum simplexowy wykorzystuje trójkątną/rómbową przestrzeń siatkową zamiast tego, wymagając tylko n+1 narożników na próbkę i generuje bardziej izotropowy efekt wizualny – tańszy i czystszy, szczególnie w 3D i wyższych wymiarach.
Dlaczego przemieszczenie jest stosowane wzdłuż normalnej zamiast losowej kierunku?
Przesuwanie każdego wierzchołka wzdłuż jego własnego normalnego powierzchni utrzymuje wybrzuszenie zakotwiczone w kształcie sfery – rośnie prosto z powierzchni, a nie odchyla się bokiem, co sprawia, że wynik interpretowany jest jako oddychająca, zmieniająca się masa, a nie kołysząca się, deformująca siatka.
Wypróbuj na żywo
Wszystko powyżej działa bezpośrednio w Twojej przeglądarce — otwórz Morphing Sphere i zmieniaj parametry podczas działania. Nic nie jest instalowane ani przesyłane na serwer, cały model działa w jednej karcie.
▶ Otwórz symulację Morphing Sphere