Vai al contenuto

Assegnare Ad Una Faccia Di Una Editablepoly Una Texture


sefiroths

Recommended Posts

ho provato sul listener questo piccolo script


b=converttopoly(box())

select b

polyop.setFaceSelection b #(2)

max views redraw

$.material = meditmaterials[1]

max views redraw

addmodifier b(uvwmap())

max views redraw

col comando polyop.setFaceSelection b #(2) pensavo avrei selezionato solo una faccia, invece la texture viene assegnata su tutto l'oggetto

se invece al posto della riga di comando, seleziono a mano la faccia, e poi riparto com lo script da $material...ecc... funziona bene...

ho sbagliato comando?non è quello che si usa per selezionare le facce?

o ci va un altro comando prima?

Link al commento
Condividi su altri siti

bn-top

grazie per la rapida risposta


b=converttopoly(box())

select b

subobjectLevel=4

polyop.setFaceSelection b #(2)

max views redraw

$.material = meditmaterials[1]

max views redraw

addmodifier b(uvwmap())

max views redraw

ma mi da'

-- Runtime error: Requested sub-object level out of range: 4

mi va bene anche un multimaterial, cioè ho un cubo editablepoly in cui la faccia superiore è di un materiale, le altre di un altro materiale

Link al commento
Condividi su altri siti

Inviata (modificato)

trovato così funziona


b=converttopoly(box())

select b

subobjectLevel=4

polyop.setFaceSelection b #(2)

max views redraw

$.material = meditmaterials[1]

max views redraw

addmodifier b(uvwmap())

max views redraw

mha chissà come mai prima non andava...

rettifico...ogni tanto mi da' out of range...?

la domanda per il multimaterial però rimane, credo sia una soluzione migliore...no?

Modificato da sefiroths
Link al commento
Condividi su altri siti

problema stranissimo...

se apro il listener e incollo questo script, non funziona, cioè tutte le facce sono dello stesso materiale...

se faccio invio passo passo, come ho fatto prima, ma ho visualizzato il pannello modify (invece che il create per esempio) lo stesso script funziona....?????????????????????????


xm=-100

ym=0

spl=1

	b=box prefix:theObj.name	

	b.pos =[xm+spl*30,ym,2]

    b.height = 10

    b.width = 20

	b=convertToPoly(

	select b

    subobjectLevel=4

	polyop.setFaceSelection b #(2)

    $.material = meditmaterials[1]

	--polyop.setFaceSelection b #(1,3,4,5,6)

    --$.material = meditmaterials[7]	

    addmodifier b(uvwmap())

	b.modifiers[#UVW_Mapping].maptype=4

[/code]




un errore simile si ripropone se lo script lo cambio un po'...

se ho selezionato il pennello "create" di max lo script procede ma le facce sono tutte con la stessa texture, se ho il pannello "modify" va in errore dicendo:

-- Runtime error: Requested sub-object level out of range: 4

suppongo perchè il pannello modify ha l'oggetto che ho selezionato col mouse che è una editable spline





[code] theObj = selection[1] if superClassOf theObj == shape then ( Nsplines=numSplines(theObj) progressStart "Exploding" for spl = 1 to Nsplines do ( b=box prefix:theObj.name b.pos =[spl*10,0,2] b.height = 10 b.width = 20 b=convertToPoly(B) select b subobjectLevel=4 polyop.setFaceSelection b #(2) $.material = meditmaterials[1] polyop.setFaceSelection b #(1,3,4,5,6) $.material = meditmaterials[7] addmodifier b(uvwmap()) b.modifiers[#UVW_Mapping].maptype=4 ) )

purtroppo senza le vostre delucidazioni non credo di venirne a capo da solo........

Link al commento
Condividi su altri siti

Ma scusa perchè non ti compili direttamente lo script.ms, il listener lo usi "parallelamente" magari per testare una funzione in particolare.

Adesso non ho 3dstudio sotto mano ma mi è sembrato di vedere in "then" senza "else", sostituiscilo con "do", uhm.. però ci sono alcune cosette che non ho ancora approfondito, sei sicuro che si applica così il material con $.material ?

Comunque prima stavo facendo anchio delle prove con le spline, esempio per stampare tutti i vertici e cosi via, ma qualcuno conosce un algoritmo per trsformare una spline chiusa in un poligono, perchè mi sono reso conto che non è affatto una cosa banale.

Modificato da johnwhile
Link al commento
Condividi su altri siti

dando un'occhiata veloce al tuo script direi che l'errore deriva da questa riga:

    b=convertToPoly(

[/code]


la box tu la salvi nella variabile 'b' in questo modo:

[code] b=box prefix:theObj.name

la variabile è 'b' e non 'B'.

é per questo che b dopo non ha un oggetto e il subobject level dà errore.

Fammi sapere come va.

ciao

Link al commento
Condividi su altri siti

dando un'occhiata veloce al tuo script direi che l'errore deriva da questa riga:

    b=convertToPoly(

[/code]


la box tu la salvi nella variabile 'b' in questo modo:

[code] b=box prefix:theObj.name

la variabile è 'b' e non 'B'.

é per questo che b dopo non ha un oggetto e il subobject level dà errore.

Fammi sapere come va.

ciao

Ma a me MaxScript non distingue la maiuscole dalle minuscole

Link al commento
Condividi su altri siti

non capisco perchè incollando sia venuta una B maiuscola al posto della minuscola...comunque il difetto rimane:

come ho scritto sopra lo script funziona se ho già il pannello "modify" attivo=> tutte le texture e le box sono corrette

se ho il pannello "create" attivo, lo script genera box tutte con le medesime texture sui lati

lo script di max è case-insensitive; quindi "b" o "B" per max è identico...

ho risolto scrivendo dopo select b..."max modify mode"

Link al commento
Condividi su altri siti

e togliendo:

progressStart "Exploding"

l'errore sub obj level 4 out of range scompare

.....

non capisco proprio, se qualcuno con max script editor sotto ci desse un'occhiata...

ho caricato 2 video in cui faccio vedere cosa succede:

texture tutte uguali e no:

http://www.megaupload.com/?d=0SRI3T2I

quando compare sub obj level 4 out of range:

http://www.megaupload.com/?d=VSCXJ04F

Link al commento
Condividi su altri siti

Premesso che è la prima volta che faccio questa cosa (al massimo assegnavo material a tutto l'oggetto) con un pò di listener record e un pò di quello che avete scritto ho provato il seguente script:

Obj = selection[1]

convertToPoly Obj

subobjectLevel = 4

for i=1 to obj.numFaces do

	(

	polyOp.setFaceSelection obj i

        meditMaterials[i].diffuse = random white black

	$.material = meditMaterials[i]

	)

Ho creato un Box e dato che ha 6 facce crea un material con colori a caso e lo assegna.

Però questo metodo non mi piace tanto, simula la tecnica manuale proprio perchè con lo script fà prima la selezione e poi $.materil, quell'$ non lo scrivo mai negli script.

-----------------------------------------------------

Infatti se invece di selection metto:

Obj = geometry[1]

lo script dà errore:

-- Runtime error: Requested sub-object level out of range: 4

-- Error occurred in i loop; filename: C:\Documents and Settings\amministratore.AMMINIST-748892\Desktop\test.submaterial.ms; position: 206

-- Frame:

-- i: 1

-- Unknown property: "material" in undefined

OK

Solo che non sò come fare diversamente. :huh:

Modificato da johnwhile
Link al commento
Condividi su altri siti

mi sà che l'unico modo sia il MultiMaterial proprio perchè in mesh c'è il SetMatID ossia l'ID del material applicabile alle facce

PS: carino il modo di selezionare facce a gruppi con il bitarray:

polyOp.setFaceSelection b #{57..59, 62..64, 67..69,107..109, 112..114, 117..119}

Modificato da johnwhile
Link al commento
Condividi su altri siti

scusate per la 'B' mi sono confuso col c++...

Comunque per fare degli script all'inizio è comodo ragiornarli come se tu stessi lavorando a mano tramite interfaccia, ma questo è il modo più lento e sopratutto favorisce la comparsa di errori(tipo quello del modify panel).

Certo non sempre è possibile evitare questa metodologia, ma io preferisco ragionare solo tramite maxscript.

Ad esempio l'assegnare un materiale ad una faccia come tu fai da interfaccia in realtà corrisponde ad una sequenza di azioni fatte in automatico da max:

-Creazione del multimateriale con un numero di materiali pari al numero delle id presenti nella mesh/poly

-se la selezione comprende un'intera id allora viene assegnato allo slot corrispondente nel multimaterial il materiale da te assegnato

-se la selezione non comprende un'intera id o le sue facce appartengono ad id differenti viene aggiunta una id nuova e poi procede col punto precedente

-se il multimateriale è già presente ne viene creato uno nuovo ma uguale a quello già esistente

Tanto vale che ti fai tu questa operazione manuale che è abbastanza semplice(visto che la cosa sarà abbastanza sistematica puoi togliere dei 'se'), in questo modo avrai più controllo e lo script sarà più veloce senza passare dall'interfaccia(il discorso della velocità diventa irrilevante se sai già che i rettangoli saranno sempre pochi).

guarda questo esempio, riesce ad assegnare diversi materiali alle facce senza dover selezionare e dover essere in modify mode:

vetObj =selection as array

for obj in vetObj do

(

	convertToPoly Obj

	numFacce=obj.numFaces


	theMat=multimaterial numSubs:numFacce name:("Materiale "+obj.name)


	for i=1 to numFacce do

	(

		polyop.setFaceMatID obj #{i} i


		theMat.materialList[i].diffuse=random white black


	)


	obj.material = theMat


)

I vari materiali all'interno del multimat sono materiali standard modificati solo nel colore, ma è possibile mettere altri materiali o modificarli a piacere.

Fammi sapere

ciao

Link al commento
Condividi su altri siti

bravissimo, :Clap03:. Tra l'altro mi hai dato un'idea fantastica per un mio script !

Però non ho capito cosa hai fatto cioè dove esiste questo materiale ? è per caso un materiale temporaneo ? Perchè per vederlo nel material editor ho dovuto scrivere:

vetObj =selection as array
for obj in vetObj do
(
convertToPoly Obj
numFacce=obj.numFaces
theMat=multimaterial numSubs:numFacce name:("Materiale "+obj.name)
for i=1 to numFacce do
(
polyop.setFaceMatID obj #{i} i
theMat.materialList[i].diffuse=random white black
)
meditMaterials[1]=theMat
obj.material = meditMaterials[1]
)[/sql]

Modificato da johnwhile
Link al commento
Condividi su altri siti

un materiale perchè esista nella scena deve essere assegnato da qualche parte, basta anche solo ad un oggetto, poi per editarlo devi caricarlo nel material editor.

Non è necessario passare dal material editor, se vuoi editare il materiale puoi sempre usare il contagocce.

Anche perchè se hai più oggetti selezionati ad ogni iterazione del for metterai il materiale creato sempre nello slot 1 e quindi ti ritroverai nel material editor solo il materiale dell'ultima iterazione.

Quindi al posto di:

	meditMaterials[1]=theMat

        obj.material = meditMaterials[1]   

io scriverei:

        obj.material =theMat   

	meditMaterials[1]= theMat   

che mi sembra più corretto(inoltre quando non vuoi caricare il materiale nell'editor ti basta commentare solo la seconda riga senza altre modifiche)

I materiali della tua scena non devono per forza essere tutti nel material editor, esso non è il 'contenitore' dei materiali della scena, ma è appunto l'editor, ti permette di editarne fino a 24 contemporaneamente.

per altre domande son qua

ciao

Link al commento
Condividi su altri siti

wow fantastico!stasera provo!!!!!!!

quali sono le condizioni che mi permettono di non passare dall'interfaccia?

per esempio io pensavo che un'istruzione tipo

polyOp.setFaceSelection b #{57..59, 62..64, 67..69,107..109, 112..114, 117..119}

non dovesse essere preceduta da

select b

e max modify mode...

ma se non ce li mettevo non funzionava...

Link al commento
Condividi su altri siti

Inviata (modificato)

ho provato funziona benissimo!grazie :Clap03:

esiste qualcosa per bypassare e velocizzare anche questo passaggio?

senza "max modify mode" non funziona con errore:

>> MAXScript Rollout Handler Exception: -- Unknown property: "gizmo" in Uvwmap:UVW Mapping <<

se sono in modify mode funziona ma è abbastanza lento...


addmodifier b(uvwmap())

b.modifiers[#UVW_Mapping].maptype=4							b.modifiers[#UVW_Mapping].length = spn_FV_Height.value

b.modifiers[#UVW_Mapping].width = spn_FV_Width.value

b.modifiers[#UVW_Mapping].gizmo.position = [blabla,blabla,blabla]

Modificato da sefiroths
Link al commento
Condividi su altri siti

dov'è progressStart?

Non lo vedo.

per velocizzare lo script guarda anche i comandi:

Da mettere prima dell'esecuzione dello script


suspendEditing()

DisableSceneRedraw()

Da mettere dopo l'esecuzione dello script

resumeEditing() 

enableSceneRedraw() 

occhio che se lo script dà errore devi poi manualmente eseguire

resumeEditing() 

enableSceneRedraw() 

dal listener altrimenti il command panel e le viewport non si aggiorneranno!!!

ciao

Link al commento
Condividi su altri siti

ok scusa, è che ho postato solo una parte minimale dello script in modo che fosse leggibile e testabile immediatamente, io ho un ciclo, fuori ho scritto progress start come in quello che esplode le spline...a pag.1 del topic ho fatto un video in cui mostro l'errore e il codice

comunque provo quello che mi hai scritto...infatti durante il ciclo il pannello di destra sfarfalla moltissimo

Link al commento
Condividi su altri siti

Inviata (modificato)

ho fatto una prova e se aggiungo i comandi che mi hai scritto, lo script va in errore dicendo:

>> MAXScript Rollout Handler Exception: -- Unknown property: "gizmo" in Uvwmap:UVW Mapping <<

bho...non capisco...perchè mai uno script che funziona...si dovrebbe fermare se aggiungo determinate righe...

stasera vedo di costruire uno script basilare in cui faccio spuntare l'errore

Modificato da sefiroths
Link al commento
Condividi su altri siti

Accedi per commentare

Sarai in grado di lasciare un commento dopo l'accesso



Accedi ora
  • Navigazione recente   0 utenti

    Non ci sono utenti registrati da visualizzare in questa pagina.

×
×
  • Crea nuovo...