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

---
Questo articolo è stato importato automaticamente dal forum il 31/lug/2014
Per vedere il post originale e/o i commenti sul forum prima di quella data clicca qui