Vai al contenuto
rIO

[maxscript] Guida Introduttiva

Recommended Posts

rIO    0

Introduzione ai MaxScript, il linguaggio di scripting di 3D Studio max

Cos'e' un linguaggio di scripting ?

Un linguaggio di scripting non e' altro che un metodo offerto da un software per accedere in modo semplice ma altamente potente alle sue funzionalita' interne.

MaxScript e' sotto tutti i punti di vista un linguaggio di programmazione con cui possiamo pilotare in modo complesso ed estremamente efficace il motore CAD di max.

A differenza dei plugin, che sono dei files eseguibili, gli script sono una lista di istruzioni che Max interpreta ed esegue.

Un esempio tipico di uno script (scritto in quello che in gergo si chiama pseudocodice) potrebbe essere :

Istruzione 0 : Se e' selezionato almeno un oggetto vai avanti

Istruzione 1 : Scegli il materiale dell'oggetto attualmente selezionato

Istruzione 2 : Chiedi all'utente se vuole convertire questo materiale in wireframe

Istruzione 3 : Se l'utente risponde si, allora abilita il flag Wireframe del materiale selezionato.
Immaginiamo che questa lista di istruzioni sia scritta in un file di testo cosi' come la leggiamo. Grazie al motore di scripting di max sara' possibile selezionare un oggetto nella scena e dire al software : "apri la lista di istruzioni ed eseguila per me" Ovviamente questo esempio non rende merito a quel che possiamo fare con MaxScript, ma e' facile capire quanto semplice sia "comandare" a max cio' che deve eseguire per noi. Come si scrive uno script per max ? Gli script sono nel 90% dei casi dei "semplici" files di testo contenenti tutta la lista di comandi per max, e proprio per questo all'interno di max esiste un editor molto simile al notepad utilizzato per creare gli script. Anche le interfaccie grafiche nel 90% dei casi verranno create con delle istruzioni del tipo : "Aggiungi un tasto alla finestra e chiamalo Esegui". Esiste inoltre la possibilita' di utilizzare un editor visuale per creare le interfaccie, ma lo vedremo nel prossimo tutorial, per ora ci basti sapere della sua esistenza. L'altro modo di eseguire uno script e' grazie al Listener, ovvero un interfaccia in cui possiamo dire a max di eseguire alcuni comandi "al volo", senza doverli salvare in un file. Proviamo ad esempio ad aprire la finestra del Listener (MaxScript - MaxScriptListener) e a digitare al suo interno il seguente comando :
messagebox  ("Ciao " + sysInfo.username + " !") as string
Posizioniamoci alla fine della riga e premiamo INVIO. Cosa abbiamo fatto ??? Semplicemente abbiamo detto "al volo" a max di presentarci un messagebox (un avviso di sistema), e di usare come testo per il box la stringa "Ciao " seguita dal contenuto della variabile di sistema username, il tutto seguito da un punto esclamativo. vediamo lo stesso esempio in pseudocodice :
mostra_un_avviso_usando_i_dati_che_seguono ("Ciao " + contenuto_della_variabile_username + " !")
Facile no ?? Ok, facile ma anche un filino inutile direte voi (anche se si potrebbe usare come benvenuto di max ad ogni avvio! :) ). Vediamo qualcosa che abbia a che fare con la grafica 3d allora. Rimanete nel MaxScriptListener e cancellate quanto scritto, sostituendolo col codice seguente :
(getMeditMaterial 1).wire = true
Premete Invio. Ora provate ad aprire il material editor e ... magia.... il primo materiale e' diventato wireframe !! Vediamo cosa abbiamo fatto :
(leggi_materiale_numero 1) di_questo_materiale_imposta_la_proprietà . wire = a vero
Abbiamo semplicemente "comandato" a max di prendere il materiale numero 1 del material editor e di impostargli la proprieta' wireframe a TRUE. L'altro metodo per far eseguire i comandi a max e' quello di aprire un nuovo script (MaxScript->New Script) e di scrivervi all'interno il codice. Dopo averlo salvato potremo eseguirlo selezionando Run Script allo stesso menu', oppure premendo CTRL+E nella finestra dell'editor, oppure ancora selezionando File -> Evaluate All sempre nell'editor. Questo e' il metodo che vi consiglio di usare, aprite l'editor, selezionate il testo del tutorial, incollatelo nell'editor e selezionate File -> Evaluate all per eseguirlo. Si parte....o quasi.... Prima di cominciare con qualche esempio piu' complesso vediamo alcuni fondamenti di programmazione, o meglio, della sintassi e della struttura. Molte delle funzionalita' che max ci mette a disposizione sono gestite ad oggetti, ovvero dei "contenitori" che hanno delle proprieta' e degli utilizzi. Ad esempio l'oggetto automobile potrebbe avere la proprieta' "colore_carrozzeria" e la funzionalita' "sterza_a_destra". Per accedere alle funzionalita' e alle proprieta' si dovra' per cui scrivere ad esempio : automobile.sterza_a_destra Potremmo anche scrivere: bicicletta.colore_sellino = automobile.colore_carrozzeria O anche if automobile.sterza_a_destra then bicicletta.fermati ecco perche' nel precedente esempio abbiamo usato : (getMeditMaterial 1).wire = true, che potrebbe anche essere scritto come :
materiale = 3dstudio.leggiMaterialeNumero(1)

materiale.wireframe = true
Bene.... partiamo decisi col primo script "serio" !!! Andreamo a crare un semplicissimo script che attiva o disattiva la proprietaì' wireframe ai materiali degli oggetti attualmente selezionati. Aggiungiamo alla scena vuota qualche oggetto standard ed assegniamogli due o tre materiali diversi. (Nel mio caso ho creato tre teiere e gli ho assegnato i primi tre materiali del Materialeditor) Creiamo un nuovo script selezionando maxScript -> NewScript. Ci viene aperta la finestra dell'editor. Scriviamoci da parte la lista dei comandi che dovemo eseguire per svolgere il nostro lavoro, in pseudocodice, non c'e' bisogno per ora di sapere la sintassi di maxscript.
Istruzione 0 : Trova il materiale del primo oggetto selezionato

Istruzione 1 : Imposta il materiale a wireframe

Istruzione 2 : Trova il materiale del secondo oggetto selezionato

Istruzione 3 : Imposta il materiale a wireframe

Istruzione 4 : Cosi' via fino all'ultimo oggetto selezionato...
Prima di scrivere del codice vediamo di capire quali sono le difficolta' di questo script. Le prime righe sono semplici, abbiamo visto prima il comando per selezionare un materiale nel material editor, ed abbiamo anche visto come sia possibile, utilizzando gli oggetti, accedere alle loro proprieta' e metodi. (automobile.colore = rosso -> materiale.wire = true) Quello di cui non abbiamo ancora parlato e' di come ripetere queste operazioni un tot di volte. In questo caso ci vengono in aiuto i cicli, nello specifico i cicli FOR-NEXT. Un ciclo for ci permette di eseguire una stessa operazione un numero definito di volte, ad esempio potremmo scrivere :
for numMateriale = 1 to 3dsmax.NumeroTotaleMateriali

	messagebox materiali[numMateriale].name

next numMateriale
questo esempio scritto in pseudocodice dovrebbe essere abbastanza intuitivo, semplicemente si dice al programma di ciclare da 1 a NumeroTotaleMateriali e ad ogni ciclo di mostrarci un messagebox con il nome del materiale. il codice effettivo per fare questo e' il seguente :
numTotaleMateriali = 5

for i = 1 to numTotaleMateriali do

(

 mat = getMeditMaterial i

 messagebox mat.name

)
Per cui, tornando al nostro esempietto il codice per ciclare su tutti gli oggetti selezionati della scena sara' il seguente :
for oggetto in selection do

(

 messagebox oggetto.name

)
Se provate ad eseguire il codice di cui sopra usando il maxListener, oppure nell'editor usando Evaluate All vedrete che max vi presenta una serie di message box che mostrano il nome di tutti gli oggetti attualmente selezionati. Abbiamo per cui risolto il problema di ciclare su tutti gli oggetti selezionati della scena, non ci rimane che trovare il materiale di ogni oggetto ed impostargli la proprieta' wireframe. Come detto in precedenza ogni oggetto ha le sue proprieta', e ... pensate un po'.. gli oggetti di max tra le loro proprieta' ne possiedono una chiamata appunto material. Proviamo a vedere cosa fa questo nuovo codice :
for oggetto in selection do

(

 messagebox (oggetto.name + " : " + oggetto.material.name)

)
Cicla su tutti gli oggetti selezionati e ci segnala con un messaggio di sistema il nome oggetto, seguito dal materiale assegnatogli. Ci stiamo avvicinando alla soluzione del problemino. Come abbiamo utilizzato la proprieta' name e la proprieta' material non ci restera' che usare la proprieta' wire, della proprieta' material di ogni oggetto per raggiungere il nostro scopo. Vediamo un ulteriore pezzo di codice :
for oggetto in selection do

(

 oggetto.material.wire = true

 messagebox (oggetto.name + " : " + oggetto.material.name + " : Modificato" )

)
Ed ecco che siamo riusciti a scrivere il nostro primissimo script che modifica tutti i materiali degli oggetti selezionati rendendoli in wireframe. Vogliamo rendere ulteriormente "utile" questo inutile script ??? Aggiungiamo per cui una richiesta di conferma all'inizio dello script, per chiedere all'utente se e' sicuro di voler convertire tutti gli oggetti selezionati. Per fare questo esiste una funzione di maxScript chiamata querybox, ovvero un messaggio di sistema con i tasti YES e NO, il quale ritorna false se l'utente preme NO. Vediamo il codice finale del nostro script :
if (querybox "Convertire in wireframe ?") then

(

  for oggetto in selection do

  (

   oggetto.material.wire = true

   messagebox (oggetto.name + " : " + oggetto.material.name + " : Modificato" )

  )

)
Lo riscriveremo qui di seguito in pseudocodice per comprenderlo meglio :
if (risposta_a_domanda("Convertire in wireframe ?") = SI) then

(

   per_ogni oggetto nella selection esegui

   (

      oggetto.material.wire = true

      visualizza_messaggio (oggetto.name + oggeto.material.name + "Modificato")

   )

)

Tutto chiaro ??? Spero di si, ad ogni modo fate pure domande... saro' ben lieto di rispondere (sempre che conosca le risposte :D )

Compiti a casa : ovviamente questo script non e' la cosa piu' utile che abbiate mai visto, ma pensate se invece di modificare il wireframe decideste di attivare o disattivare il raytracing delle riflessioni e rifrazioni degli oggetti selezionati ?? Non sarebbe utile per velocizzare i rendering di prova ??? Fate un tentativo e provate a farlo voi.

Nel prossimo tutorial spero di riuscire a spiegare come fare uno script piu' complesso, con un interfaccia grafica in cui modificare alcuni parametri

dello script stesso.

Ciao ciao

post-1042-1105691200.jpg

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Ciao rIO, per prima cosa ti ringrazio per la spiegazione. Non ho ancora finito di leggerla ma credo che tornerà utile a più di qualcuno.

Ho solo una domanda, sbaglio o gli script vengono scritti in java?

:ph34r::ph34r::ph34r:

Condividi questo messaggio


Link al messaggio
Condividi su altri siti
rIO    0
Ciao rIO, per prima cosa ti ringrazio per la spiegazione. Non ho ancora finito di leggerla ma credo che tornerà utile a più di qualcuno.

Ho solo una domanda, sbaglio o gli script vengono scritti in java?

:ph34r:  :ph34r:  :ph34r:

No, non si tratta di Java nel caso di MaxScript, ma di un linguaggio a se stante, la sintassi di tutti i linguaggi ad alto livello e' simile, che sia Visualbasic, javaScript, Java o C++.... il modo di "ordinare" e scrivere le istruzioni e' piu' o meno sempre lo stesso...

Java e' un ottimo linguaggio e maxScript pur essendo molto potente non e' paragonabile a Java, inoltre Java e' un linguaggio semiinterpretato, non interpretato come maxScript.

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Bravo RIO. Questi sono tutorial importantissimi perchè aiutano a muovere i primi passi in modo semplice al contrario del manuale di MAX che invece amichevole non è sempre.

Complimenti e grazie.

Condividi questo messaggio


Link al messaggio
Condividi su altri siti
Bravo RIO. Questi sono tutorial importantissimi perchè aiutano a muovere i primi passi in modo semplice al contrario del manuale di MAX che invece amichevole non è sempre.

Complimenti e grazie.

Sono d'accordo. In questi giorni mi sto dedicando alla lettura di qualche tutorial di treddi ed anche di qualche discussione. Devo ammettere che ho trovato più spunti qui che in mesi di studio nei vari manuali che ho a casa.

Grazie ragazzi

:ph34r::ph34r::ph34r:

Condividi questo messaggio


Link al messaggio
Condividi su altri siti
rIO    0
Complimenti, sarà un buon inizio per il mio prgetto di Motion Capture.

Grazie rIO.

Questa e' una cosa che mi interessa precchio, ti va di parlarne in privato ?? Mi piacerebbe lavorarci insieme, se posso dare una mano per lo sviluppo del software (sia script che plugin o eseguibili)... vedi il mio sito e potrai capire perche' mi interessa il motion capture :D

Grazie a te

Condividi questo messaggio


Link al messaggio
Condividi su altri siti
wdr    1

Ciao rIo,

oltre ad essere un grande nel campo del video,

ricorderai i consigli utili che mi hai dato su Officine Italia,

noto con piacere che hai conoscenze di max

e nello specifico in una branca che, come molti già hanno detto,

poco conosciuta e applicata.

Grazie.

Condividi questo messaggio


Link al messaggio
Condividi su altri siti
Questa e' una cosa che mi interessa precchio, ti va di parlarne in privato ??  Mi piacerebbe lavorarci insieme, se posso dare una mano per lo sviluppo del software (sia script che plugin o eseguibili)... vedi il mio sito e potrai capire perche' mi interessa il motion capture  :D

Grazie a te

Mi aggrego, con la differenza che il tools lo ho gia' scritto per max.

Ora pero' i dati che raccolgo li sparo a motion builder poi devo fare il retargeting del mio character per passare l'animazione a character studio.

Comunque se vi interessa ad entrambi posso prepararvi un video con il demo del mio tools all'opera, anzi adesso lo preparo e ve lo metto on-line a questo URL: www.ogiva.it/mocapvideo.rar sara' on-linenel giro di un oretta.

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Complimenti rIO, tutorial interessante.... aspetto con ansia quello nuovo sulla creazione dei comandi visuali :D

ogiva, molto interessante il tuo tool.. anche se non me ne intendo molto, però è davvero affascinante il mcap...

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Grandioso il tutorial...per ora ho solo modificato il primo materiale in wire, ma come ho tempo continuo il tut, intanto grazie!

Spero che ne arrivino altri di tutorial così...PS. nn si potrebbe con il max script dirgli di generare dei picchi a caso partendo da un piano??? :ph34r:

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

ciao mi chiamo andera,innanzitutto complimenti per il tutorial,interessanti gli script.

poi volevo un'informazione se possibile. ho un progetto sul genere videogioco, ho un'aereo con una cinepresa posizionata sotto, quest'aereo passa sopra ad una certa zona,ok? bene io volevo sapere:se volessi farlo a mò di gioco, nel senso creare un ex dove io riesco a comandare il mio aereo, devo farlo tramite scripto o tramite cosa?sono un completo ignorante in questo campo....se qualcuno riuscisse a darmi qualche info ve ne sarei molto grato.buona giornata a tutti

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora

  • Navigazione recente   0 utenti

    Non ci sono utenti registrati da visualizzare in questa pagina.

×