Jump to content
  • 0
Obywatel

Parallel Poisson Disk Sampling with Spectrum Analysis on Surfaces

Question

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.

Share this post


Link to post
Share on other sites

5 answers to this question

Recommended Posts

  • 0

Piekne.

Nie mam pojęcia na jakiej podstawie miały być obliczane rotacje, ale wierze, że masz pomysł:P

Share this post


Link to post
Share on other sites
  • 0

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.

Share this post


Link to post
Share on other sites
  • 0
Guest User190
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ą :)

Edited by User190

Share this post


Link to post
Share on other sites
  • 0
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 ;-)

Share this post


Link to post
Share on other sites
  • 0

Czad! Fajnie, że to ogarnąłeś! Wygląda na niezły kawał roboty.

 

Pozdro,

M.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

We are using cookies. Read about our Privacy Policy