https://www.cc.gatech.edu/~turk/bio_sim/articles/voxel_space_automata_89.pdf
Voxel space to kwantyzowana przestrzeń 3D podzielona na voxele czyli sześciany identycznej wielkości.
Do każdego sześcianu można przypisać wartość liczbową i w ten sposób przechowywać jakąś informację o tym regionie (zawartość substancji chemicznej, wilgotność, zacienienie, obecność innych obiektów). Można to wykorzystać do rozmieszczania obiektów w przestrzeni, unikania kolizji, ustalania zacienienia w przestrzeni.
Voxel space wymaga większej ilości RAMu (trzeba te wszystkie wartości przechowywać), ale jako, że nie trzeba wszystkiego na żywo wyliczać, tylko wczytuje się dane z tablicy, to jest szybka metoda.
Fermony to substancje, za pomocą których organizmy przekazują sobie informacje.
Przyjmujemy, że w prawdziwym świecie, mrówki poruszają się w sposób losowy; gdy znajdują pożywienie, wracają do swojej kolonii pozostawiając ślad składający się z feromonów. Gdy inna mrówka natknie się na ten ślad, przestaje poruszać się w sposób losowy i podąża za śladem w kierunku pożywienia.
Jednak po pewnym czasie feromony wyparowują, a więc siła ich działania maleje. Im dłuższa jest trasa od pożywienia do kolonii, tym więcej mają czasu feromony, aby wyparować. Krótsze trasy jednak zapewniają, iż siła działania feromonów będzie większa. Parowanie feromonów jest efektem pozytywnym, bowiem pozwala to na odnajdywanie optymalnej trasy do pożywienia. Gdyby feromony nie wyparowywały, każda kolejna trasa miałaby taką samą siłę jak poprzednia, przez co nie dochodziłoby do odnalezienia optymalnego rozwiązania problemu.
Zatem gdy jedna mrówka odnajdzie dobrą (krótką) drogę, inne mrówki będą podążać tą właśnie drogą, również zostawiając feromony, a więc zwiększając ich natężenie. Ostatecznie wszystkie mrówki będą poruszać się tą samą, najlepszą drogą, a pozostałe drogi zostaną zapomniane (wyparują). (Wikipedia)
https://projects.duszekjk.com/ants1.0/
Otwórz projekt voxelSpace w Unity
Otwórz scenę "Scenes/theAntsAreMarching"
Zapoznaj się z przygotowanymi skryptami
Ant (obiekt mrówki)
VoxelSpace (reprezentacja voxel space, którą będziemy robić)
Napisz funkcję createVoxelSpace()
Zainicjalizuj atrybut byte[,] voxels
, to znaczy utwórz tablicę dwuwymiarową o wymiarach sizeX
na sizeY
.
W pętli ustaw wartość każdej komórki na 0.
Do wizualizacji tej przestrzeni wykorzystamy żółte kule, których rozmiar będzie zależny od zawartości feromonu. Utwórz dwuwymiarową tablicę typu GameObject
o takich samych wymiarach jak powyżej i przypisz ją do atrybutu GameObject[,] lights
.
W pętli zapełnij tablice instancjami previewShape
, do utworzenia nowej instancji obiektu służy funkcja Instantiate(GameObject gameObject)
. Ustaw każdemu pozycję odpowiadającą pozycji danego voxela korzystając z funkcji positionInWorld
(uzupełnimy ją w następnym kroku).
Napisz funkcje positionInVoxelSpace(Vector3 worldPosition) i positionInWorld(Vector2 voxelPosition) skalujące współrzędne z ciągłych (współrzędnych gameObject'ów - floats), na te w voxel space (wartości współrzędnych są wartościami Int o wielkości od 0 do odpowiednio sizeX-1 i sizeY-1) i z powrotem na ciągłe. Weź po uwagę różne skale (voxelScale), oraz umiejscowienie obiektu table (gameObject.transform.position). Jako, że w pozycji ciągłej (obiektów gry) mamy 3 wymiary, a ten voxel space ma 2, to ustaw wymiary xy z voxel space w wartościach xz, a wymiar y pomiń/ustaw na 0.
Napisz funkcje getPheromoneAt(foat x, float y)
Napisz funkcje sniff() (skrypt Ant)
Mrówki po wyjściu z mrowiska poruszają się w kierunkach w dół lub w lewo. Jeśli znajdą jedzenie, to zawracają i idą w kierunku mrowiska (prawo i w górę). Jeśli mrówka dojdzie do krańca voxel space, to też zaczyna iść w kierunku mrowiska. Mrówka po dojściu do mrowiska zostawia jedzenie (jeśli je ma) i znowu wychodzi z mrowiska. Kierunek (dół i lewo lub góra i prawo) jest zależny od zawartości feromonu w sąsiednich voxelach w tym kierunku. Jeśli zawartość fermonu jest taka sama, to idzie w losowym kierunku.
https://projects.duszekjk.com/ants1.0/
bool hasFood - czy ma jedzenie
sbyte foodSearch - stan szukania jedzenia, 1 wraca do mrowiska, -1 idzie od mrowiska, szuka jedzenia
Funkcja ta ma na celu zmianę kierunku poruszania się tej mrówki
Sprawdź i uaktualnij status (ten voxel)
Jeśli jeśli funkcja getPheromoneAt zwraca liczbę większą od 250, to to jest jedzenie, z którym mrówka ma wracać do mrowiska (ustawiamy hasFood i foodSearch)
Jeśli jesteśmy w punkcie (0,0) (voxel space) to jesteśmy w mrowisku (zostawiamy jedzenie i zmieniamy kierunek na szukanie jedzenia (ustawiamy hasFood i foodSearch))
Jeśli dojdziemy do końca voxelSpace, to wracamy do mrowiska (ustawiamy tylko foodSearch)
Ustal kierunek (sąsiednie voxele)
Jeśli mrówka ma jedzenie, to zwiększ w obecnej pozycji wartość voxel'a o 40. (ten voxel)
Napisz funkcje updateVoxelSpace(), która obniża wartości feromonów jako wynik parowania w czasie
Sprawdź jak mrówki się poruszają
Otwórz scenę menu
Podpisz się w Canvas/get/Podpis
Wyeksportuj swój projekt dla wybranego systemu