Gość ant-3d Napisano 11 Styczeń 2011 Napisano 11 Styczeń 2011 Hej Potrzebuje w maxscripcie odtrzymac tablice w ktorej bede mial pozapisywane dane vertexow poszczegolnych elementow. Czyli np. mamy jakis obiekt ktory sklada sie z 500 elementow. Chce miec tablice parts gdzie np. w parts[1] bede mial dane wszystkich vertexow nalezacych do elelemenu 1 itd. Ma ktos pomysl jak to ugryzc? Narazie doszedlem do czegos takiego: parts = #() -- moja tablica $.EditablePoly.SetSelection #Face #{1} -- wybieram pierwszego faca $.selectElement() -- wybieram element do ktorego nalezy ten face $.EditablePoly.ConvertSelection #Element #Vertex -- konwertuje selekcje na vertexy parts[1] = polyop.getVertSelection $ -- wrzucam vertexy pierwszego elementu do tablicy no i teraz potrzebuje zrobic to dla wszystkich elementow. Problem polega na tym ze nie wiem jak wybrac faca ktory lezy juz kolejnym elemencie i nie nalezy do tego elementu ktory juz zapisalem. Jak to bede wiedzial to reszta bedzie juz analogiczna. Moze ktos wie jak to mniej karkolomnie zrobic?
Polacco Napisano 11 Styczeń 2011 Napisano 11 Styczeń 2011 Abstra***ąc zupełnie od tego czy jest bardzo łatwy sposób na uzyskanie tego w Maxscript (szczerze: nie chce mi się sprawdzać) - to co opisałeś to bardzo podstawowe zagadnienie z teorii grafów: http://en.wikipedia.org/wiki/Connected_component_%28graph_theory%29 Rozwiązywałem to kiedyś w C++ z użyciem boost::graph, potem napisałem własną implementację bo boost nie lubi się z OpenMP - to naprawdę banalna sprawa.
Gość ant-3d Napisano 11 Styczeń 2011 Napisano 11 Styczeń 2011 moze banalna nie wiem, nie bede sie spieral. Tylko wiesz ja nie jestem programistom tylko grafikiem ktory jest zmuszony taki skrypt miec. Nie mam skad go wziasc wiec sam go musze zrobic. Wiec jak to jest proste to prosze o pomoc.
lechoo Napisano 11 Styczeń 2011 Napisano 11 Styczeń 2011 (edytowane) Na szybko napisalem kod ktory chyba dobrze ilustruje jedna z mozliwosci rozwiazania problemu. Mam nadzieje ze z komentarzami wszystko jest jasne. groupsArr = #() allFoundArr = #() myMesh = $obiekt iNumFaces = getNumFaces myMesh iTotalFound = 0 --ilosc znalezionych fejsow iCurrentFace = 1 --od tego fejsa zaczynam przeszukiwanie while (true) do ( sel = #{iCurrentFace} count = 0 while (true) do ( sel = meshop.getVertsUsingFace myMesh sel --szukam vertexow przy pomocy fejsa(ow) z sel sel = meshop.getFacesUsingVert myMesh sel --szukam fejsow przy pomocy vertexow z poprzedniego kroku if (count == sel.numberSet) then exit --i tak dopoki przybywa elementow count = sel.numberSet ) iTotalFound += sel.numberSet --zwiekszam ilosc wszystkich znalezionych fejsow append groupsArr (sel as array) --wrzucam to tablicy wynikowej grupe fejsow join allFoundArr (sel as array) --dodatkowa tablica ktorej uzywam do znalezienia numeru nie wykorzystanego jeszcze fejsa if (iTotalFound == iNumFaces) then exit --znalazlem wszystkie fejsy, koniec for f in 1 to iNumFaces do --szukam numeru fejsa od ktorego moge zaczac kolejny etap wyszukiwania ( if (findItem allFoundArr f == 0) then ( iCurrentFace = f exit ) ) ) print groupsArr edit: na koncu wychodzi tablica z fejsami, dopiero teraz to zauwazylem, oczywiscie mozesz latwo wydobyc z tego vertexy (getVertsUsingFace) albo zmodyfikowac algorytm Edytowane 11 Styczeń 2011 przez lechoo
Gość ant-3d Napisano 12 Styczeń 2011 Napisano 12 Styczeń 2011 dzieki lechoo :) pomoglo :D reput polecial :)
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ę