Skocz do zawartości

[MAXscript] wybor elementow


Rekomendowane odpowiedzi

Napisano

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?

  • Odpowiedzi 4
  • Created
  • Ostatniej odpowiedzi

Top Posters In This Topic

Top Posters In This Topic

Napisano

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.

Napisano

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.

Napisano (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 przez lechoo
Napisano

dzieki lechoo :) pomoglo :D reput polecial :)

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ę



×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Wykorzystujemy cookies. Przeczytaj więcej Polityka prywatności