Vai al contenuto
armeo555

Rotazione oggetto

Recommended Posts

Ciao a tutti,

vorrei realizzare uno script per 3ds max (in maxscript) molto semplice, ma non ci riesco.

In pratica questo script, dovrebbe effettuare la rotazione di un oggetto, in base ai gradi di un altro oggetto di riferimento.

Ho provato a farlo nel listener e funziona, in pratica ho scritto:

$box002.rotation = $box001.rotation as eulerangles

ed il box002 gira come è girato il box001.

Il problema sorge quando voglio inserire questo comando nel max script editor creando anche una interfaccia grafica.

Questo è quello che ho scritto:

rollout Myroll "Mio"

(

label lab1 "Oggetto di riferimento:"

pickbutton clic_on_obj "None" pos:[50,30] width:200

on clic_on_obj picked obj do

(

if obj != undefined do (

a = obj

clic_on_obj.text = obj.name

)

)

label lab2 "Oggetto da ruotare:"

pickbutton clic_on_obj1 "None" pos:[50,80] width:200

on clic_on_obj1 picked obj1 do

(

if obj1 != undefined do (

b = obj

clic_on_obj1.text = obj1.name

)

)

button but1 "Ruota!" pos:[50,130] width:200

on but1 pressed do

(

obj1.rotation = obj as eulerangles

)

)

createdialog Myroll width:300 height:200

In pratica con i pickbutton decido quale sono i due oggetti da prendere in considerazione, il problema sta che quando premo il button "but1", ottengo questo errore: "--Unable to convert: undefined to type: EulerAngles"

Qualcuno sa dirmi perchè ottengo questo errore? Oppure darmi un altra soluzione?

Grazie a tutti.

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

L'errore è qui:


on but1 pressed do

(

   obj1.rotation = obj as eulerangles

)

obj1 ed obj non sono definite. tu le hai definite solamente nelle altre callback, ma sono valori che esistono solo all'interno delle stesse callback. quindi devi definire delle variabili oggetto interne al rollout o anche esterne in cui salvare i riferimenti ai tuoi oggetti usando la prima opzione:
rollout Myroll "Mio"

(

local obj1,obj2

label lab1 "Oggetto di riferimento:"

pickbutton clic_on_obj "None" pos:[50,30] width:200

on clic_on_obj picked obj do

(

if obj != undefined do (

a = obj

clic_on_obj.text = obj.name

obj2 = obj

)

)

label lab2 "Oggetto da ruotare:"

pickbutton clic_on_obj1 "None" pos:[50,80] width:200

on clic_on_obj1 picked obj do

(

if obj != undefined do (

b = obj

clic_on_obj1.text = obj.name

obj1 = obj


)

)

button but1 "Ruota!" pos:[50,130] width:200


on but1 pressed do

(

	temppos = obj1.pos

obj1.rotation = (obj2.rotation) as eulerangles

	 obj1.pos = temppos

)


)

createdialog Myroll width:300 height:200
e comunque tu non puoi convertire un oggetto in eulerangles difatti l'assegnazione della rotazione l'ho cambiata in:

obj1.rotation = obj2.rotation as eulerangles

ho aggiunto anche il riposizionamento dell'oggetto.

se hai domande son qua

ciao

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Grazie della risposta, veramente molto gentile.

E' da poco che cerco di fare qualcosa in maxscript, quindi casco su cose banali (penso).

Quindi ricapitolando con l'istruzione:

local obj1,obj2

hai impostato le variabili per essere richiamate da qualsiasi parte nello scipt. Giusto?

Però ho da chiederti la secondo cosa che mi hai spiegato:

e comunque tu non puoi convertire un oggetto in eulerangles difatti l'assegnazione della rotazione l'ho cambiata in:

obj1.rotation = obj2.rotation as eulerangles

In pratica il mio errore era mettere le parentesi????

Scusa le mille domande ma non ho chiara la storia degli eulerangles.

Ultima cosa. Vedo che sei molto bravo, non è che sai dove portei trovare guide su maxscript.

Ne ho trovate poche e poco chiare.

Scusa le troppe domande.

Grazie ancora

Ciao

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

allora, nella prova che hai fatto col listener hai scritto:


$box002.rotation = $box001.rotation as eulerangles
nello script invece hai scritto
obj1.rotation = obj as eulerangles
come puoi vedere non sono uguali, nel secondo codice tu assegni un oggetto convertito in eulerangles alla rotazione di un altro oggetto. Alla rotazione di un oggetto dei assegnargli una rotazione, non un oggetto e per questo te l'ho cambiata scrivendola simile a come l'hai scritta nel listener.
obj1.rotation = (obj2.rotation) as eulerangles

le parentesi sono un mio vezzo, le ho messe perchè secondo me rendono più leggibile il codice.

per quanto riguarda i tutorial io per iniziare ho iniziato coi videotutorial qui su treddi, quelli di philix.

Poi ho spulciato le varie discussioni qui, su scriptspot e cgtalk.

Ma cosa più importante ogni volta che avevo un dubbio ho sempre guardato nell'help di maxscript che è ben fatto e copre veramente molti argomenti.

Poi se hai domande siamo sempre qua

ciao

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.

×