Skocz do zawartości

Przykład wiatru ruszającego drzewami


Rekomendowane odpowiedzi

Ktoś mnie prosił to zrobiłem przykład drzew ruszających się na wietrze.

 

Zasada działania jest bardzo prosta jednak by wiedzieć jak przykład zmodyfikować trzeba posiadać jakąś już wiedzę czym są funkcje trygonometryczne.

 

1.

Siła wiatru jest wyliczana na podstawie okresowej funkcji matematycznej. Taka funkcja może się składać z pojedynczego sinusa czy cosinusa lub jakieś bardziej złożone rzeczy. Ja zrobiłem w tym przykładzie funkcję sin(X*2)*20+sin(X/2)*30.

GML (oControler Step)
/* zmiana sily wiatru na podstawie jakiejs wymyslonej funkcji trygonometryczniej

zalecam experymentowanie z roznymi funkcjami, mozna dodac kolejene sinusy/cosinusy/tangensy itp*/

gSilaWiatru = sin(X*2)*20+sin(X/2)*30;

 

2.

Siła ta zależy jak widać od kąta X więc co stepa ten kąt będzie się zwiększać o jakiś przyrost:

GML (oControler Create)
// zmienna ktora powoduje zmiany sily wiatru

X = 0;

wartoscPrzyrostuX = 0.001;

GML (oControler Step)
// przyrastanie kata funkcji wiatru

X += wartoscPrzyrostuX;

 

3.

Mając już wiatr który zmienia okresowo swoją siłę możemy ustalić kąt obrotu gałęziami drzew. By gałęzie drgały tym szybciej i mocniej im silniejszy jest wiatr znowu posłużymy się funkcjami trygonometrzycznymi. Tutaj używam 2 wartości obrotu gałęzi. Aby wprowadzić jakieś zróżnicowanie drgań poszczególnych gałęzi drzewa używam sinusa i cosinusa. Zmienne te są globalne i są wyliczane tylko raz na step dla wszystkich drzew to jest ważne dla optymalizacji bo żadne drzewo nic nie wylicza a od razu zna wynik.

GML (oControler Create)
globalvar gObrot, gSilaWiatru;

gObrot[0] = 0;

gObrot[1] = 0;

GML (oControler Step)
// zeby wprowadzic roznorodnosc jedne glezie beda obracane sinusem a inne cosinusem

gObrot[0] = sin(gSilaWiatru);

gObrot[1] = cos(gSilaWiatru);

 

4.

Pora na stworzenie drzewa i jego ruchomych gałęzi. Moje drzewo składa się z czubka, 4 gałęzie po środku i 4 gałęzie jeszcze niżej. Gałęzie te różnie reagują na kąt obrotu wyliczanego w stepie oControler. Jedne przyjmują dodatni kat inne ujemy.

GML (oDrzewo Draw)
// galezie na samym dole tworza uklad krzyza +

draw_sprite_ext( sDrzewo, 0, x-48, y, 1, 1, -gObrot[0]*1.4, -1, 0.9 );

draw_sprite_ext( sDrzewo, 1, x+48, y, 1, 1, +gObrot[1]*1.4, -1, 0.9 );

draw_sprite_ext( sDrzewo, 2, x, y+48, 1, 1, -gObrot[0]*1.4, -1, 0.9 );

draw_sprite_ext( sDrzewo, 1, x, y-48, 1, 1, +gObrot[1]*1.4, -1, 0.9 );

 

// galezie wyzej tworza uklad X

draw_sprite_ext( sDrzewo, 0, x-32, y-32, 1, 1, -gObrot[1]*1.9, -1, 0.7 );

draw_sprite_ext( sDrzewo, 1, x+32, y-32, 1, 1, +gObrot[0]*1.9, -1, 0.7 );

draw_sprite_ext( sDrzewo, 2, x-32, y+32, 1, 1, -gObrot[1]*1.9, -1, 0.7 );

draw_sprite_ext( sDrzewo, 1, x+32, y+32, 1, 1, +gObrot[0]*1.9, -1, 0.7 );

 

// korona

draw_sprite_ext( sDrzewo, 0, x, y, 1, 1, gObrot[0]*0.8, -1, 0.7 );

 

/* galezie sie ruszaja pod dwoma katami gObrot[0] ktory jest sinusem z funkcji wiatru i gObrot[1] ktory jest

cosinusem z funkcji wiatru

dodatkowo *1.4, *1.9, *0.8 ustala roznorodnosc w predkosci obracania. Tutaj czubek drzewa obraca sie najwolniej a

galezie na samym dole najszybciej */

 

Przykład można pobrać tutaj: Download Zawartoś paczki: .exe, .gm81, .gmres

Gmres jest po to by można było sobie odpalić w GM8.

 

Przykład ma dodatkową informację rysującą charakterystykę funkcji wiatru. Pionowa oś to siła wiatru ( im jest stromiej tym mocniej daje ), oś x to czas.

Żółta kropka to aktualne miejsce w tej funkcji.

F0SWyFS.png

 

 

EDIT:

Dla GM lite bez funkcji draw_sprite_ext() można zrobić drzewa tak: http://wklej.org/id/982758/ jednak będą się inaczej zachowywać

 

Wpadłem jeszcze na połączenie tego wyżej z tym co było wcześniej i wygląda teraz wszystko jeszcze efektowniej :D http://wklej.org/id/982760/

 

EDIT2:

Inny przykład funkcji wiatru gSilaWiatru = sin(X*2)*5+sin(X/2)*30; gdzie przyrost wynosi wartoscPrzyrostuX = 0.01; Wiatr jest bardziej dynamiczny i płynny ale bardziej powtarzalny.

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...