Jump to content
Pawelkos

[MaxScript] Pomysl na skrypt

Recommended Posts

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

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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?

Share this post


Link to post
Share on other sites

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ą.

Share this post


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

Share this post


Link to post
Share on other sites

Dzieki chlopaki za dobre checi i ze komus sie w ogole chce probowac:). Jesli jeszcze ktos chce sie podjac challengu to smialo ;)

Share this post


Link to post
Share on other sites

Kilka naście nodów połączonych w Houdinim ;) Ale jeszcze spróbuję wykombinować na ICE w SI bez programowania, więc też

 

knapp01.png

 

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

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites

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]

Edited by gonre

Share this post


Link to post
Share on other sites

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

Share this post


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

Share this post


Link to post
Share on other sites

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
)


Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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
)


Share this post


Link to post
Share on other sites

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

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