Obywatel Napisano 2 Wrzesień 2013 Napisano 2 Wrzesień 2013 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.
deshu Napisano 2 Wrzesień 2013 Napisano 2 Wrzesień 2013 Piekne. Nie mam pojęcia na jakiej podstawie miały być obliczane rotacje, ale wierze, że masz pomysł:P
beny Napisano 4 Wrzesień 2013 Napisano 4 Wrzesień 2013 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.
Gość User190 Napisano 4 Wrzesień 2013 Napisano 4 Wrzesień 2013 (edytowane) 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ń 2013 przez User190
Obywatel Napisano 5 Wrzesień 2013 Autor Napisano 5 Wrzesień 2013 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 ;-)
beny Napisano 9 Wrzesień 2013 Napisano 9 Wrzesień 2013 Czad! Fajnie, że to ogarnąłeś! Wygląda na niezły kawał roboty. Pozdro, M.
Rekomendowane odpowiedzi
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ę