Particles - czyli cząsteczki
Co prawda od dawna już nie grałem w żadną nową grę, ale jak się domyślam w wielu występują różnego rodzaju eksplozje, fajerwerki, fontanny, deszcz, etc, etc.. zrobione za pomocą cząsteczek. Efekt ten jest niezwykle prosty, przy pomysłowym zaprojektowaniu potrafi jednak dać bardzo ciekawe rezulaty.

Wyobraź sobie jedną cząsteczkę, znajdującą się gdzieś w przestrzeni. Jest malutka i samotna, ledwo ją widać. Ma ona swoje położenie, prędkość, czasami porusza się ruchem jednostajnym, czasami ma pewne przyśpieszenie, tarcie... działają na nią różne siły (np. grawitacji), gdy wejdzie w odpowiedni obszar może zacząć zachowywać się inaczej - przy dotknięciu pewnych przedmiotów może się odbić... słowem - może się z nią stać WSZYSTKO. Oczywiście wszystko, co uda ci się zaprogramować.

Czy widok takiej cząsteczki, tańczącej w przestrzeni może być fascynujący? Być może, ale nie na dłużej niż 5 sekund. Zwróć jednak uwagę, że nasze komputery są na tyle szybkie, aby obliczyć w czasie rzeczywistym zmiany położenia nie jednej, ale tysięcy takich cząsteczek. To już zaczyna być ciekawe... :-)

Co musi mieć każda cząsteczka, aby mogła żyć w naszym programie?

- położenie, a więc X,Y,Z
- prędkość, a więc SX,SY,SZ


I może na razie wystarczy... Zacznijmy od czegoś klasycznego - rozmieść je losowo w przestrzeni i daj każdej tą samą prędkość.

dla każdej cząsteczki 

X=random*3.0-1.0
Y=random*3.0-1.0
Z=random*3.0-1.0
SX=0.1
SY=0.05
SZ=0.075


Co klatkę należy wykonać następujące instrukcje:

dla każdej cząsteczki 

X=X+SX
Y=Y+SY
Z=Z+SZ


Co ujrzysz na ekranie? Najprawdopodobniej coś w rodzaju pędzących w jednym kierunku gwiazd... czyli nic szczególnego, ale mamy już jakieś podstawy.

Jeżeli jeszcze nie wiesz, to rysowanie cząsteczek powinno odbywać się tak:

oblicz współrzędne ekranowe dla każdej cząsteczki (ze wzorów na perspektywę)
wyczyść ekran wirtualny
narysuj na ekranie wirtualnym każdą cząsteczkę
przepisz ekran wirtualny do pamięci karty graficznej

Dodajmy teraz każdej cząsteczce jeszcze jedną zmienną...

- energia C

Dlaczego C? Bo będzie to zarazem jej kolor. Co klatkę, oprócz standardowych instrukcji będziemy zmniejszać C o pewną wartość. Paletę kolorów powinniśmy ustawić sobie tak, aby przy wartościach największych barwy były najjaśniejsze, a przy zerze ciemniały aż do czerni. Pewnie już się domyślasz, że cząsteczki będą wyglądały jak iskierki - na początku jasne, a potem gasnące, aż do zupełnego zniknięcia.

Zmieńmy jednak tym razem procedurę inicjacji.... Niech wszystkie cząsteczki na początku znajdują się w tym samym miejscu, lecz ich prędkość będzie losowa, oczywiście losujemy po kolei SX, SY i SZ. Dobrze jest tez znormalizować wektor (SX,SY,SZ) aby otrzymać ładny... wybuch! Dodajmy jeszcze do instrukcji wykonywanych co klatkę następujące:

SX=SX*spowolnienie 

SY=SY*spowolnienie
SY=SY*spowolnienie


gdzie "spowolnienie" jest dowolną stałą mniejszą od 1.0, może wynosić np. 0.9, im mniejsza - tym szybciej cząsteczki się zatrzymają... Ponieważ zmniejszamy też jednocześnie energię cząsteczki - trzeba pamiętać, że cząsteczka o energii 0 (lub mniejszej) jest martwa - i nie należy się nią zajmować.
Skoro już wspomniałem o zabijaniu cząsteczek - dobrze jest sobie przygotować odpowiednią strukturę do ich zapisywania. Ja to robię tak:



Niebieskie cząsteczki tętnią życiem, zgniłozielone są już martwe. Nagle umiera cząsteczka zaznaczaona na czerwono. Gdyby została tam gdzie jest, program musiałby co klatkę ją omijać, co byłoby niezbyt optymalne. Przenoszę ją więc na koniec cząsteczek żywych i przesuwam koniec o jedną jednostkę w lewo. Znowu żywe komórki znajdują się po lewej stronie, a martwe po prawej.

A teraz zrobimy sobie fontannę! :-)
Wszystkie cząsteczki muszą zaczynać swój żywot w tym samym miejscu. Prędkość pionowa powinna być dla każdej z nich taka sama, aby wszystkie równo leciały do góry. Różnić się będą dwoma pozostałymi prędkościami. Należy je wylosować z tego samego przedziału, a następnie znormalizować. Do czego to doprowadzi? Że wszystkie cząsteczki będą się poruszały w obrębie.. okręgów! Dokładnie tak, jak w prawdziwej fontannie - będą latać naokoło. Aby jednak nie leciały w nieskończoność - trzeba dodać grawitację.

Dwie prędkości, które normalizowaliśmy nie powinne się zmieniać (chyba że maleć przy odbiciu, albo ulegać wpływowi wiatru, ale to już zależy od ciebie), natomiast prędkość pionowa musi ulegać sile grawitacji. Musi maleć (lub rosnąć, zależy jak na to patrzysz:) co klatkę o stałą wartość:

SY=SY-grawitacja 


Gdy jednak spadnie do samej ziemi (czyli tam gdzie zaczynała), musi się odbić:

jeżeli Y < MIN_Y to SY=SY*odbicie


Gdzie odbicie jest liczbą ujemną z przedziału (-1,0). Przy -1 energia przy odbiciu nie będzie tracona, przy 0 cząsteczka zatrzyma się na ziemi.

I... to już chyba wszystko, o czym mogę ci powiedzieć na ten temat. Jeżeli udało ci się już poczuć, na czym polega zabawa z cząsteczkami - eksperymentuj. Mi udało się uzyskać np. trójwymiarowy ogień, albo płynącą rzekę z wodospadem. Powodzenia!


Autorem tekstu jest: Jacek Popławski
Materiał dodany przez użytkownika: alphan