Czy istnieje algorytm generujący błyskawicę?
Chciałbym algorytm, który generuje listę obiektów segmentów lub punktów określających, gdzie wyląduje śruba. Metoda wymagałaby parametru punktu początkowego wraz z punktem końcowym. Pocisk powinien mieć z niego losowe gałęzie i zygzakiem w losowych odstępach czasu. Rezultatem będzie losowy efekt błyskawicy, który wyglądałby mniej więcej tak
(źródło: wikimedia.org )
Jeśli ktoś zna algorytm, dla którego może to działać, pomoc byłaby bardzo mile widziana!
algorithm
graphic-effects
Geoffroi
źródło
źródło
Odpowiedzi:
Istnieje dość prosty algorytm, którego można użyć do wygenerowania piorunów.
Zacznij od odcinka linii między początkiem śruby (
O
) a punktem końcowym (E
)Wybierz punkt na tej linii (w przybliżeniu lub dokładnie na środku), wywołany
S
i podziel segment na dwa segmenty linii (O->S
iS->E
). WypieraćS
się od oryginalnego odcinka linii (wraz normalny segmentu) przez jakiś niewielkiej ilości losowej. To daje ci jeden „zakręt” błyskawicy.Po obliczeniu zgięcia, na podstawie małej przypadkowej szansy, będziesz chciał dodać segment trzeciego wiersza (zwykle przedłużenie tego
O->S
segmentu). W ten sposób produkujesz „widelce” w błyskawicy. Zazwyczaj będziesz chciał śledzić informacje o intensywności śruby podczas procesu generowania, ponieważ chcesz, aby widelce były ciemniejsze lub miały bardziej subtelne rozmycie:Następnie powtórz powyższy proces dla wszystkich nowych segmentów linii; musisz wybrać liczbę powtórzeń, która daje kształty, które lubisz:
Jest dość jasne wyjaśnienie tej techniki na blogu mojego przyjaciela tutaj ( tutaj bezwstydnie ukradłem zdjęcia); idzie jeszcze głębiej o dodanie efektu blasku.
Na koniec jest też ten artykuł NVIDIA, który opisuje ten sam podstawowy algorytm (również z dodatkowymi szczegółami).
źródło
Poleciłbym alternatywne podejście: szybko eksplorujące losowe drzewo (RRT) . Jedną fajną rzeczą jest to, że możesz ominąć zakręty lub eksplodować we wszystkich kierunkach.
Algorytm jest naprawdę prosty:
Modyfikując funkcje
RandomSample
iExtendToward
, możesz uzyskać bardzo różne drzewa. JeśliRandomSample
wszędzie jednolicie próbki, drzewo będzie rosło równomiernie we wszystkich kierunkach. Jeśli jest tendencyjny do celu, drzewo będzie miało tendencję do wzrostu w kierunku celu. Jeśli zawsze próbkuje bramkę, drzewo będzie od początku do linii prostej.ExtendToward
pozwala także robić interesujące rzeczy na drzewie. Po pierwsze, jeśli masz przeszkody (takie jak ściany), możesz sprawić, aby drzewo rosło wokół nich po prostu odrzucając rozszerzenia kolidujące ze ścianami.Oto, jak to wygląda, gdy nie przesądzasz próbkowania w kierunku celu:
(źródło: uiuc.edu )
A oto jak to wygląda ze ścianami
Kilka fajnych właściwości RRT po jego zakończeniu:
źródło