Za pomocą funkcji szumów można generować losowe wysokości. Najprostszym z nich jest szum wartości, który działa dokładnie tak, jak opis: generujesz losowe wysokości całkowite, a następnie interpolujesz wysokości między nimi. Najczęściej stosowaną metodą interpolacji jest odwzorowanie sześciennej krzywej S:
Załóżmy, że masz wysokość h0
w punkcie x0
i wysokość h1
w punkcie x1
. Następnie, aby uzyskać wysokość w dowolnym punkcie x
( x0<=x<=x1
), używasz
t = (x-x0)/(x1-x0); // map to [0,1] range
t = t*t*(3 - 2*t); // map to cubic S-shaped curve
h = h0+t*h1;
Wysokości uzyskane w ten sposób będą gładkie, losowe, ale niezbyt interesujące. Aby poprawić swój teren, możesz użyć fraktalnego hałasu . Działa to tak: załóżmy, że wygenerowałeś funkcję, h(x)
która zwraca wysokość przy danej współrzędnej (używając powyższej metody). Ta funkcja ma częstotliwość określoną przez częstotliwość pierwotnych wysokości intergerów. Aby zrobić z niego fraktal, łączysz funkcje z kilkoma częstotliwościami:
fbm(x)=h(x) + 0.5*h(2*x) + 0.25*h(4*x) + 0.125*h(8*x);
W tym przykładzie łączę cztery częstotliwości - oryginalną, podwójną, 4-krotną i 8-krotną oryginalną, przy czym wyższe częstotliwości mają mniejszą wagę. Teoretycznie fraktale sięgają nieskończoności, ale w praktyce wymaga tylko kilku określeń. fbm
We wzorze oznacza ułamkowego ruchu Browna - jest to nazwa tej funkcji.
To jest potężna technika. Możesz grać z mnożnikiem częstotliwości, z wagami o różnych częstotliwościach lub dodawać funkcje zniekształcające hałas. Na przykład, aby uzyskać bardziej „wypukłe” odczucie, h(x)
można zmienić na 1-abs(h(x))
(zakładając -1<=h(x)<=1
)
Jednak chociaż wszystko to jest miłe, technika ta ma poważne ograniczenia. Dzięki podejściu opartemu na „linii wysokości” nigdy nie możesz mieć „nawisów” terenu. I wyobrażam sobie, że będą to bardzo fajne funkcje w grze podobnej do „Moon Buggy”.
Dodawanie ładnych zwisów jest trudnym zadaniem. Jedną rzecz, o której mogę myśleć - możesz zacząć od fraktalnej „linii wysokości” i „mozaikować” ją w serię splajnów lub krzywych Beziera. Następnie linia terenu zostanie zdefiniowana przez kilka „kluczowych punktów”. Zastosuj drgania w tych kluczowych punktach - spowoduje to przypadkowe odkształcenie terenu, prawdopodobnie tworząc ciekawe kształty. Jednak samo skrzyżowanie terenu może stać się problemem przy takim podejściu, szczególnie przy dużych wahaniach.
Moim pomysłem byłoby stworzenie wygładzonej funkcji szumu. Najpierw metoda intNoise (int), która zwraca „losową” liczbę int, ale która zależy od danych wejściowych. Jeśli użyjesz tego samego wejścia dwa razy, wynik będzie taki sam.
Następnie użyj metody wygładzania, aby utworzyć zmiennoprzecinkową (zmiennoprzecinkową), która używa dwóch liczb całkowitych wokół danych wejściowych do utworzenia wartości losowej.
Następnie użyj pozycji X jako danych wejściowych i Y jako danych wyjściowych. Rezultatem będzie wygładzona krzywa, ale o losowej wysokości.
źródło