Pawelkos Napisano 14 Czerwiec 2012 Napisano 14 Czerwiec 2012 Witam szanownych forumowiczow:) Jako, ze o MaxSripcie nie mam zielonego pojecia i nie potrafie w nim napisac nawet glupiego "hello world", pomyslalem ze sprobuje tutaj, liczac na dobra wole i nadmiar wolnego czasu tutejszych skryptowych wyjadaczy:) Ostatnio zdarzylo mi sie robic kilka wizulalizacji, gdzie tematem byly podlogi. Wiele z nich mialo te sama szerokosc klepki lecz rozna dlugosc. Ukladanie tego recznie to strasznie czasocholonny proces. Wiec pomyslalem ze moze ktos to cierpi na nadmiar wolnego czasu mogly skrobnac taki skryp ktory by dziala w nastepujacy sposob: 1. Tworzymy sobie np 4 boxy (nasze klepki podlogi) ktore roznia sie tylko dlugoscia, pozostale wymiary takie same; 2. Wybieramy te 4 boxy i odpalamy nasz skrypt ktory by nastepnie rozmieszczal te boxy jeden obok drugiego (jak parkiet, czy panele), losowo mieszajac kolejnosc tych boxow. Dodatkowo fajnie bylo by jakby w skrypcie mozna bylo okreslic obszar na jakim maja byc rozmieszone klepki i jesli bylaby opcja seed ktora pozwalala by zmieniac losowo uklad tych ze klepek. Generalnie chodzi mi o cos takiego jak FloorGenerator i w sumie bylby on dla mnie wystarczalny po pozwala on na ustalanie wielkosci klepki, wariacje i obszar jaki ma pokrywac podloga, z tym ze nie ma w nim opcji zdefiniowania jakiej dlugosci maja byc klepki (tzn precyzyjnego rozmiaru, jest tylko wariacja max i min dlugosc). Jak mowilem nie mam pojecia o MaxScripcie i tak naprawde nie wiem ile z tym by bylo roboty, wiec jesli prosze o zbyt wiele to prosze zignorowac tego posta, a jesli jednak ktos by sie nudzil i czulby sie na silach takie cos skrobnac to prosze smialo, repow nie pozaluje ;) Mysle ze taki skrypt przydalbym sie nie tylko mi ale rownie i innym uzytkownikom Pozdrawiam
Lucek Napisano 14 Czerwiec 2012 Napisano 14 Czerwiec 2012 No nie jest to trudny algorytm, bo opiera się w sumie na jednej liczbie pseudolosowej i pewnie sprawdzeniu kolizji. Może ktoś to charytatywnie napisze. Chociaż tak na dobrą sprawę można to załatwić za pomocą dispa i map proceduralnych. Takie Bercon Maps spokojnie wystarczą do zrobienia dobrej podłogi.
Dynamico Napisano 15 Czerwiec 2012 Napisano 15 Czerwiec 2012 Nie używałem floor generator ale może gdybyś ustawił wariację max i min długości na tą samą wartość to miałbyś precyzyjną długość klepki?
asblaze Napisano 15 Czerwiec 2012 Napisano 15 Czerwiec 2012 Dynamico, nie chodzi czasem o losowo wybrane 4 rożne długości klepki, a nie jedną taką samą? W melu myślę zabrałoby to kilkanaście linij, ale niestety maxscriptu nie znam. Nawet nie trzeba sprawdzać kolizji, starczy że będzie pamiętał wymiary poprzedniej klepki i sumował szerokość do zadanej wielkości aby przyciąć ostatnią.
Pawelkos Napisano 15 Czerwiec 2012 Autor Napisano 15 Czerwiec 2012 No nie jest to trudny algorytm, bo opiera się w sumie na jednej liczbie pseudolosowej i pewnie sprawdzeniu kolizji. Może ktoś to charytatywnie napisze. Chociaż tak na dobrą sprawę można to załatwić za pomocą dispa i map proceduralnych. Takie Bercon Maps spokojnie wystarczą do zrobienia dobrej podłogi. Niestety takie rozwiazanie w tym wypadku by sie u mnie nie sprawdzilo, bo do konkretnej klepki musze przypisac tez konkretna teksture... Nie używałem floor generator ale może gdybyś ustawił wariację max i min długości na tą samą wartość to miałbyś precyzyjną długość klepki? Dynamico mi chodzi dokladnie o to co napisal asblaze pod twoim postem Dynamico, nie chodzi czasem o losowo wybrane 4 rożne długości klepki, a nie jedną taką samą? W melu myślę zabrałoby to kilkanaście linij, ale niestety maxscriptu nie znam. Nawet nie trzeba sprawdzać kolizji, starczy że będzie pamiętał wymiary poprzedniej klepki i sumował szerokość do zadanej wielkości aby przyciąć ostatnią. asblaze to jesli bylbys tak mily i mogl zaposcic ten skrypt w melu, to moze wtedy bylbym sobie w stanie jakos sam to przelozyc na maxscript. Jesli ktos chcialbym zabrac glos to nie krepujcie sie ;)
Creator Napisano 15 Czerwiec 2012 Napisano 15 Czerwiec 2012 Tylko najpierw spróbuję to w majce zrobić :D
Pawelkos Napisano 15 Czerwiec 2012 Autor Napisano 15 Czerwiec 2012 Dzieki chlopaki za dobre checi i ze komus sie w ogole chce probowac:). Jesli jeszcze ktos chce sie podjac challengu to smialo ;)
legomir Napisano 15 Czerwiec 2012 Napisano 15 Czerwiec 2012 Kilka naście nodów połączonych w Houdinim ;) Ale jeszcze spróbuję wykombinować na ICE w SI bez programowania, więc też Można w ten sposób? Houdini ma 200MB wielkości :P Poza tym, że można bez zbędnego kombinowania zrobić zwykłym scatterem tak myśle ;] A tak btw. czy mi sie wydaje, że jeśli wariacja max i min, jest taka sama to mamy dokładną długość klepki? :D
Pawelkos Napisano 15 Czerwiec 2012 Autor Napisano 15 Czerwiec 2012 Kilka naście nodów połączonych w Houdinim ;) Ale jeszcze spróbuję wykombinować na ICE w SI bez programowania(...) Można w ten sposób? Houdini ma 200MB wielkości :P Poza tym, że można bez zbędnego kombinowania zrobić zwykłym scatterem tak myśle ;] A tak btw. czy mi sie wydaje, że jeśli wariacja max i min, jest taka sama to mamy dokładną długość klepki? :D legomir no niestety nie mam Hudego ani XSI na wyposazeniu, poza tym nie znam ich obslugi, wiec nie mozna w ten sposob:] Nie wiem jak ty to sobie wymysliles z tym skaterem, ale ja mysle ze nie mozna, wiec jesli moglbys rozwinac bo moze czegos nie wiem (tylko miej na uwadze ze jestem ograniczony do scatterow pod maxa). Chyba troche nie jasno opisalem problem, bo ktos juz powyzej pisal podobnie jak ty. Gdyby podloga miala skladac sie z klepek rownej dlugosci to nie bylby problemu. Chodzi o to ze podloga ma sie skladac z klepek roznej dlugosci (ale o konkretnych wymiarach). Tak wiec mam np 4 rodzaje klepki roznej dlugosci: 1. 120x500; 2. 120x600; 3. 120x800; 4. 120x1200. I teraz chodzi mi o to zeby skryp generowal podloge uzywaja klepek o podanych wyzej wymiarach, ktora bedzie wymieszana z tych ze wlasnie klepek, wiec dlatego wlasnie uwazam ze skaterem nie da sie tego zrobic
Pawelkos Napisano 18 Czerwiec 2012 Autor Napisano 18 Czerwiec 2012 No jak tam panowie challenge ? jakies postepy ? bedzie co z tego czy nie bedzie ;)
Creator Napisano 18 Czerwiec 2012 Napisano 18 Czerwiec 2012 Mam już koncept, dzisiaj po robocie do tego siądę.
gonre Napisano 18 Czerwiec 2012 Napisano 18 Czerwiec 2012 (edytowane) Tak na szybko. wymagania: elementy są prospopadłościanami z PIVOTem w środku! nazwy obiektów do klonowania trzeba przyposać do tablicy o nazwie element_names elementów musi być conajmniej jeden ------ USER settings element_width = 1 element_names =#("klepka1","klepka2","klepka3","klepka4") floor_length = 70 floor_width = 10 ------ USER settings fin counter_length=0 counter_width=0 currnet_floor_width =0 currnet_floor_length =0 x_pos = 0 y_pos = 0 while currnet_floor_width ( counter_width +=1 x_pos += element_width currnet_floor_width += element_width currnet_floor_length= 0 while currnet_floor_length ( counter_length +=1 rand = random 1 element_names.count orginal_element = ( execute ("$"+element_names[rand]) ) new_element = instance orginal_element new_element.name= "element_"+ counter_width as string + "_" + counter_length as string new_element.wirecolor = orginal_element.wirecolor bb = nodeLocalBoundingBox new_element y_pos = currnet_floor_length + (bb[2][2] - bb[1][2])/2 new_element.pos = [x_pos,y_pos,0] currnet_floor_length += (bb[2][2] - bb[1][2]) --format ( " debug: % % \n" ) currnet_floor_width currnet_floor_length ) ) Ustawienia poczatkowe na których testowałem skrypt: box height:1 width:1 length:1 name:"klepka1" pos:[-6,0,0] box height:1 width:1 length:3 name:"klepka2" pos:[-7,0,0] box height:1 width:1 length:4 name:"klepka3" pos:[-8,0,0] box height:1 width:1 length:7 name:"klepka4" pos:[-9,0,0] Edytowane 18 Czerwiec 2012 przez gonre
Grave Napisano 19 Czerwiec 2012 Napisano 19 Czerwiec 2012 Przyznam że też się trochę czaiłem, ale robota zając...
Pawelkos Napisano 20 Czerwiec 2012 Autor Napisano 20 Czerwiec 2012 gonre wielkie dzieki, dziala jak talala :D. Teraz chcialbym sobie zrobic maly interface do tego z czym juz mysle powinienem sobie dac rade. Mam tylko takie pytanko, chcialbym zrobic spinner cos jak "seed" ktory zmienialby losowosc rozlozenia klepek. Chcialbym tez aby to dzialo sie w realtime :]. Moglby ktos podpowiedziec jak takie cos robi sie maxscripcie zeby zmiana wartosci byla na bierzaca uaktualnia w viewporcie ? Jeszcze raz wielke dzieki :)gonre
gonre Napisano 20 Czerwiec 2012 Napisano 20 Czerwiec 2012 chcialbym zrobic spinner cos jak "seed" ktory zmienialby losowosc rozlozenia klepek. seed z tego co wiem nie istnieje dla random() jeśli zależy Ci by szybko, zmieniać różne ułożenia to po prostu kasuj stworzone elementy i wywołaj skrypt ponownie dla powyższego skryptu jest to komenda delete $element_* Chcialbym tez aby to dzialo sie w realtime :] odpalając skrypt z delete $element_* na początku osiągam wynik poniżej sekundy dla 200 elementów, dla każdorazowego wywołania, wiec jest powyżej 1 fps ;] tworzenie geometrii w czasie rzeczywistym to raczej nie maxscript ;] najprościej było by zrobić przycisk recreate w UI PS: jeśli komuś nie odświeża ekranu po stworzeniu podłogi niech na końcu dopisze redrawViews()
gonre Napisano 20 Czerwiec 2012 Napisano 20 Czerwiec 2012 WAŻNE ! przy tworzeniu wielu obiektów warto wyłączyć UNDO, przyspiesza to wielokrotnie tworzenie obiektów naniosłem poprawki i UI skrypt działa na nazwach obiektów teraz PREFIXem można "tworzyć grupy" clearlistener() global klepkiRollout ( if klepkiRollout !=undefined then if klepkiRollout.open then DestroyDialog klepkiRollout rollout klepkiRollout "Klepki" ( local windowWidth = 400 local windowHeight = 220 local windowPos = [10,10] local isRolloutResized = 0 local element_width = 1 local element_names =#("klepka1","klepka2","klepka3","klepka4") local floor_length = 70 local floor_width = 10 label L_null1 " " edittext E_prefix "new element prefix" text: "element_" edittext E_objects "base objects" label L_null2 " " spinner S_floor_length "floor length" range:[1,100000,1] type:#integer spinner S_floor_width "floor width" range:[1,100000,1] type:#integer spinner S_element_width "element width" range:[1,100000,1] type:#float label L_null3 " " checkbox CB_delete "delete elements with current prefix" checked:false button B_recreate "create" width:78 enabled:true on B_recreate pressed do ( counter_length=0 counter_width=0 currnet_floor_width =0 currnet_floor_length =0 x_pos = 0 y_pos = 0 element_names = filterString E_objects.text "," undo off ( if CB_delete.checked then delete ( execute("$"+E_prefix.text+"*") ) while currnet_floor_width ( counter_width +=1 x_pos += element_width currnet_floor_width += element_width currnet_floor_length= 0 format "xxxxxxx : %\n" x_pos while currnet_floor_length ( counter_length +=1 rand = random 1 element_names.count orginal_element = ( execute ("$"+element_names[rand]) ) new_element = instance orginal_element new_element.name= E_prefix.text + counter_width as string + "_" + counter_length as string new_element.wirecolor = orginal_element.wirecolor bb = nodeLocalBoundingBox new_element y_pos = currnet_floor_length + (bb[2][2] - bb[1][2])/2 new_element.pos = [x_pos,y_pos,0] currnet_floor_length += (bb[2][2] - bb[1][2]) --format ( " debug: % % \n" ) currnet_floor_width currnet_floor_length ) ) ) redrawViews() ) on klepkiRollout open do ( for n = 1 to element_names.count do ( E_objects.text += element_names[n] + "," ) S_floor_width.value = floor_width S_floor_length.value = floor_length S_element_width.value = element_width ) on S_floor_length changed val do ( floor_length = val ) on S_floor_width changed val do ( floor_width = val ) on S_element_width changed val do ( element_width = val ) ) createdialog klepkiRollout style:#(#style_titlebar, #style_border, #style_sysmenu, #style_resizing, #style_sunkenedge) pos:klepkiRollout.windowPos width:klepkiRollout.windowWidth height:klepkiRollout.windowHeight )
Pawelkos Napisano 20 Czerwiec 2012 Autor Napisano 20 Czerwiec 2012 gonre dzieki bardzo, wszystko ladnie smiga :D. Nie chce naduzywac twojej dobroci, ale myslisz ze dalbys rade zmodyfikowac skrypt tak, zeby te nakrotsze klepki nie byly jedna za druga ? Obok siebie spoko ale zeby na dlugosc, nie byly jedna za druga ? Sorry jesli jestem zbyt upierdliwy i jeszcze raz wielkie dzieki ze ci sie chcialo :) dalbym repa ale juz nie moge
gonre Napisano 20 Czerwiec 2012 Napisano 20 Czerwiec 2012 Myślałem o tym, ale jestem zbyt leniwy by być nadgorliwy ;] ... ale skoro chcesz to proszę --- BSD License ----- -------- make base objects for tests -- box height:1 width:1 length:1 name:"klepka1" pos:[-6,0,0] wirecolor: (color 13 40 130) -- box height:1 width:1 length:3 name:"klepka2" pos:[-7,0,0] wirecolor: (color 22 70 170) -- box height:1 width:1 length:4 name:"klepka3" pos:[-8,0,0] wirecolor: (color 40 90 180) -- box height:1 width:1 length:7 name:"klepka4" pos:[-9,0,0] wirecolor: (color 90 130 255) -------- ----- --- clearlistener() global klepkiRollout ( if klepkiRollout !=undefined then if klepkiRollout.open then DestroyDialog klepkiRollout rollout klepkiRollout "Klepki" ( local windowWidth = 400 local windowHeight = 220 local windowPos = [10,10] local isRolloutResized = 0 local element_width = 1 local element_names =#("klepka1","klepka2","klepka3","klepka4") local floor_length = 70 local floor_width = 10 label L_null1 " " edittext E_prefix "new element prefix" text: "element_" edittext E_objects "base objects" label L_null2 " " spinner S_floor_length "floor length" range:[1,100000,1] type:#integer spinner S_floor_width "floor width" range:[1,100000,1] type:#integer spinner S_element_width "element width" range:[1,100000,1] type:#float label L_null3 " " checkbox CB_delete "delete elements with current prefix" checked:false button B_recreate "create" width:78 enabled:true on B_recreate pressed do ( counter_length=0 counter_width=0 currnet_floor_width =0 currnet_floor_length =0 x_pos = 0 y_pos = 0 last_element_type = 1 last_element_type_try = 0 element_names = filterString E_objects.text "," undo off ( if CB_delete.checked then delete ( execute("$"+E_prefix.text+"*") ) while currnet_floor_width ( counter_width +=1 x_pos += element_width currnet_floor_width += element_width currnet_floor_length= 0 --format "xxxxxxx : %\n" x_pos while currnet_floor_length ( counter_length +=1 ------ rand element rand = random 1 element_names.count last_element_type_try = 0 while last_element_type == rand and last_element_type_try ( rand = random 1 element_names.count last_element_type_try +=1 ) last_element_type = rand ------ rand element orginal_element = ( execute ("$"+element_names[rand]) ) if isvalidnode orginal_element then ( new_element = instance orginal_element new_element.name= E_prefix.text + counter_width as string + "_" + counter_length as string new_element.wirecolor = orginal_element.wirecolor bb = nodeLocalBoundingBox new_element y_pos = currnet_floor_length + (bb[2][2] - bb[1][2])/2 new_element.pos = [x_pos,y_pos,0] currnet_floor_length += (bb[2][2] - bb[1][2]) ) else ( currnet_floor_length += 1 --- prevent infinity while format ( " ERR: no valid node: % rand: % \n" ) element_names[rand] rand ) --format ( " debug: % % \n" ) currnet_floor_width currnet_floor_length ) ) ) redrawViews() ) on klepkiRollout open do ( for n = 1 to element_names.count do ( E_objects.text += element_names[n] + "," ) S_floor_width.value = floor_width S_floor_length.value = floor_length S_element_width.value = element_width ) on S_floor_length changed val do ( floor_length = val ) on S_floor_width changed val do ( floor_width = val ) on S_element_width changed val do ( element_width = val ) ) createdialog klepkiRollout style:#(#style_titlebar, #style_border, #style_sysmenu, #style_resizing, #style_sunkenedge) pos:klepkiRollout.windowPos width:klepkiRollout.windowWidth height:klepkiRollout.windowHeight )
Pawelkos Napisano 21 Czerwiec 2012 Autor Napisano 21 Czerwiec 2012 gonre kurde, ripsect za robote i za szybkosc ;) wielkie dzieki:). Jak bys mial czas zajrzec jeszcze do tego watku i podpowiedziec co nie co bylo by super :D http://www.max3d.pl/forum/showthread.php?t=84172&p=1108752&viewfull=1#post1108752 A wracajac do tego realtimowych zmian, szkoda ze za bardzo sie nieda bo w sumie we floorgeneragtorze to nawet dziala, nie jest to demon szybkosci ale daje rade, ale to juz taka czysta ciekawosc, bo przycisk recreate jak zasugerowales wczesniej w zupelnosci mi wystarczy ;) Jeszcze raz wielkie dzieki
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ę