Napisano 2 Wrzesień 201311 l Cześć, prezentuję implementację algorytmu przedstawionego w dokumencie "Parallel Poisson Disk Sampling with Spectrum Analysis on Surfaces", służącego do równomiernego rozmieszczenia punktów na obiekcie. Dokumentacja programu dostępna jest pod tym adresem: http://research.microsoft.com/apps/pubs/default.aspx?id=135760 Projekt zrealizowany jest w postaci pluginu (DG Node) do Autodesk Maya 2013 w oparciu o technologię NVIDIA CUDA. Rozmieszczanie punktów na obiekcie odbywa się praktycznie w czasie rzeczywistym. Wcześniej miałem okazję zaimplementować sekwencyjny algorytm i różnica w szybkości działania jest znaczna. Dużą zaletą współbieżnego algorytmu od Microsoftu jest stosunkowo niewielki wpływ ilości poligonów na szybkość obliczeń, który w przypadku sekwencyjnego algorytmu miał istotne znaczenie, ponieważ każdy trójkąt wymagał przetwarzania. Plugin skompilowany dla Linuxa 64bit, Autodesk Maya 2013, dystrybucja Funtoo/Gentoo, wymagane biblioteki CUDA. Nie sprawdzałem działania na innych dystrybucjach. Jeśli znajdę czas to postaram się skompilować dla Windowsa. Wyniki obliczeń węzła można wykorzystać w instancerze. Obecnie brak obliczonych rotacji, więc praktyczne zastosowanie póki co niewielkie. Mam jednak nadzieję, że uda mi się w najbliższym czasie stworzyć bardziej kompletne narzędzie.
Napisano 2 Wrzesień 201311 l Piekne. Nie mam pojęcia na jakiej podstawie miały być obliczane rotacje, ale wierze, że masz pomysł:P
Napisano 4 Wrzesień 201311 l Potrzebujesz do poprawnego działania poprawnych UVek? Jaką klasą są wyświetlane punkty? Czy pobranie z pozycji punktu normalki face'a znacznie by wydłużyło czas obliczeń? W czym przydatne było wykorzystanie bibliotek CUDA? Obsługujesz wielowątkowość w swoim nodzie? Kurde - można by wykorzystać te punkty do auto UV unwrappingu.
Napisano 4 Wrzesień 201311 l Potrzebujesz do poprawnego działania poprawnych UVek? Jaką klasą są wyświetlane punkty? Czy pobranie z pozycji punktu normalki face'a znacznie by wydłużyło czas obliczeń? W czym przydatne było wykorzystanie bibliotek CUDA? Obsługujesz wielowątkowość w swoim nodzie? Kurde - można by wykorzystać te punkty do auto UV unwrappingu. Jest wielowątkowość i działa to naprawdę szybko. Michał robił porównania z dtos i różnica wyszła chyba ponad 100 razy na korzyść ppds (ale to już najlepiej pytać jego). Dobra robota Zią :) Edytowane 4 Wrzesień 201311 l przez User190
Napisano 5 Wrzesień 201311 l Autor Potrzebujesz do poprawnego działania poprawnych UVek? UV Set nie jest potrzebny do obliczenia punktów. Jako input plugin przyjmuje pozycje wierzchołków i ID wierzchołków tworzących trójkąty. Jaką klasą są wyświetlane punkty? Punkty wyświetlane są klasą mgDisplayPoints, lokator który napisałem do sprawdzania wyników. Czy pobranie z pozycji punktu normalki face'a znacznie by wydłużyło czas obliczeń? Obliczenie wektora normalnego dla sampli w bardzo niewielkim stopniu wydłuży obliczenia, czasy będą minimalnie większe. To będzie następna rzecz którą chciałbym się zająć, żeby narzędzie miało praktyczne zastosowanie. Zacząłem pisać ten plugin z myślą o narzędziu do rozprowadzania piór na obiekcie. Mam nadzieję że uda mi się stworzyć zestaw DG nołdów umożliwiających wygodną pracę z punktami w Maya. W czym przydatne było wykorzystanie bibliotek CUDA? Obsługujesz wielowątkowość w swoim nodzie? Większość obliczeń wykonuje się na karcie graficznej. W skrócie wygląda to tak: najpierw wysyłam dane obiektu na GPU (wierzchołki, ID wierzchołków które tworzą trójkąt), później losuje na tych trójkątach bardzo dużą ilość punktów uzyskując w ten sposób dyskretną reprezentacją powierzchni obiektu (zamiast trójkątów mam punkty na całej jego powierzchni). Losowanie punktów odbywa się wielowątkowo na karcie graficznej za pomocą bibliotek cuRAND. Później wybieram z tego zbioru punkty które są dostatecznie oddalone od siebie. Żeby tego dokonać muszę wylosowane punkty odpowiednio pogrupować: dzielę przestrzeń bounding boxa na komórki i przypisuję wylosowane punkty do komórek. Następnie grupuję komórki w ten sposób, żeby w danej grupie komórki były dostatecznie daleko od siebie, na tyle daleko, żeby punkty znajdujące się w tych komórkach nie mogły kolidować ze sobą. Teraz w grupach komórek mogę dokonać współbieżnego wybierania punktów. Pomocna tutaj okazała się biblioteka NVIDIA Thrust, która dostarcza takie mechanizmy jak współbieżne sortowanie. Opis trochę zawoalowany jak sam algorytm ;-)
Napisano 9 Wrzesień 201311 l Czad! Fajnie, że to ogarnąłeś! Wygląda na niezły kawał roboty. Pozdro, M.
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto