Vai al contenuto
Francesco Tundo

Espressione rotazione - velocità

Recommended Posts

Ciao a tutti, devo animare un oggetto rotante su y che rallenta fino a fermarsi con velocità precise in tre momenti precisi; quindi ho creato un parametro Speed arbitrario e l'ho messo in Attribute Holder, qundi ho fatto wire parameter e ho settato l'espressione Speed*S. Fino ad un certo punto si comporta come deve, cioè parte con una certa velocità e rallenta, ma non capisco perché ad un certo punto si ferma e torna indietro per poi fermarsi del tutto. Non ho trovato nulla che mi aiuti online.

Suggerimenti?

Grazie mille :)

Francesco

Speed.JPG

Rotazione Y con funzione.JPG

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Non posso postare la scena nè mostrare il pezzo, è materiale riservato. Ma puoi considerarlo un semplice cilindro a tutti gli effetti, pivot al centro e quant'altro.

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Analogo a questo allegato, anche come orientamento - Edit, scusa, è verso la X, non la Y. In questo momento non ho il file sottomano

cylinder.JPG


Modificato da tfrancesco70

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Ho creato la funzione RPS (rounds per second) nell' Attribute Holder (range: 0-100), ho settato la rotazione y con il controller Expression (RPS*S) e l'ho linkata. La funzione animata con keyframes va da 10 a 5 ad 1 a 0. Se usi valori costanti (non animati) come test vedi che la velocità è corretta, se invece rallenta si ferma e torna indietro, per poi continuare a rallentare e fermarsi.

Rotazione.max

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Se imposto RPS che va da 10 a 5 l'oggetto rallenta fino a fermarsi e poi riparte a velocità 5.

Mi sembra folle.

Qualcuno ha qualche idea su come controllare in modo preciso una velocità?

Rotazione 10 5.JPG

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Ho provato ed effettivamente con valori che vanno al negativo (10>0) si crea una curva di animazione nell'asse di rotazione (ecco il perché rallenta per poi ruotare al contrario). Con valori positivi (0>10) fila tutto liscio, compreso l'aumento e diminuzione della velocità. Ora non vorrei che fosse un problema data dalla rotazione Bezier, l'unica accettata con questo tipo di controlli di espressioni... Ho ricreato da zero più e più scene, e sempre questo problema si presenta. Secondo me l'espressione da scrivere (speed*S) è incompleta in un certo senso (anche se giusta). Comunque sono curioso di questa cosa, e continuo a vedere di trovare soluzione...

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

@tfrancesco70

Allora sono arrivato ad una soluzione, certamente un po forzata, ma appare funzionare :D 

Come detto nel post sopra, c'è qualcosa nella funzione che manca, quindi in accordo con l'help di MaxScript, invece di usare uno Float Expression ho pensato di utilizzare un Script Expression. Se leggi nell'help "How do I link the rotation of an object to the scene time?" ci sono una serie di casi spiegati molto bene. 

 

Quindi ci sono i pro e i contro: Appare non funzionare sull'asse Y (penso che sia un bug di Max) e la rotazione deve essere controllata in pieno. Puoi fare ciò che ti serve per la tua animazione, inserendo chiavi di animazioni, rallentare, accelerare ecc. Un'altra cosa importante, visto che la curva Bezier si comporta male, ho usato "degToRad" la quale trasforma la rotazione in gradi

 

In script expression inserisci:

degToRad ($.rotation.x_rotation + $.modifiers[#Attribute_Holder].Custom_Attributes.Speed)

Il segno "$" sta per il nome del tuo oggetto, quindi ".rotatio.x_rotation" e l'asse di rotazione riferito all'oggetto stesso, mentre " $.modifiers[#Attribute_Holder].Custom_Attributes." è il collegamento con il tuo spinner, metre "Speed" è il nome dello spinner stesso.  Importante, per determinare una rotazione negativa (es. -100), devi creare lo spinner con Attribute Holder  con valori minimi in negativo (es: -100 > +100).

 

Spero che ti possa essere di aiuto, ha me ha fatto impazzire sta cosa...


Modificato da Michele71
aggiunto testo mancante

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Comunque, ho consultato anche altri siti in merito, e mi è stato detto che il comportamento dato da "Speed*S" è ciò che avviene poi nell'animazione. Infatti: 

 

Tempo (S) nel secondi va da 0 a 3,333
Velocità (controller float) va da10,0 a 0

 

Se fai Speed*S il risultato è 10.0 * 0.0 = 0.0 e 0.0 * 3.333 = 0.0
Impostando la rotazione in 100 fotogrammi (in modo che parte da 0 e finisca a 0), nel fotogramma 50 si ottiene il valore più alto ~ 8.33 dove la velocità è 5.0 e  lo Speed è 1,67 (se si mette un CA float). I valori sono impostati per creare questo tipo di animazione.

 

 

 

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Ho messo x rotation da Float Expression a Float Script; l'oggetto si chiama Ctrl_Sp01_Rotore. Effettivamente il mio oggetto ruota in x, quindi dovrebbe essere appropriato. Ma da errore 

Unknown Property: "rotation" in undefined

L'espressione viene

degToRad (Ctrl_Sp01_Rotore.rotation.x_rotation + Ctrl_Sp01_Rotore.modifiers[#Attribute_Holder].Custom_Attributes.Speed)

Premetto che sono totalmente a digiuno di maxscript, è la prima volta che mi trovo a smanettare con testo :)

 

Condividi questo messaggio


Link al messaggio
Condividi su altri siti
55 minuti fa, Michele71 ha scritto:

Comunque, ho consultato anche altri siti in merito, e mi è stato detto che il comportamento dato da "Speed*S" è ciò che avviene poi nell'animazione. Infatti: 

 

Tempo (S) nel secondi va da 0 a 3,333
Velocità (controller float) va da10,0 a 0

 

Se fai Speed*S il risultato è 10.0 * 0.0 = 0.0 e 0.0 * 3.333 = 0.0
Impostando la rotazione in 100 fotogrammi (in modo che parte da 0 e finisca a 0), nel fotogramma 50 si ottiene il valore più alto ~ 8.33 dove la velocità è 5.0 e  lo Speed è 1,67 (se si mette un CA float). I valori sono impostati per creare questo tipo di animazione.

 

 

 

Capisco! Grazie mille! Pare proprio che debba affrontare il maxscript.

Possibile che non esista proprio un modo semplice per definire una velocità? Mi sembra strano che non esista neanche un'interfaccia a nodi per l'animazione.

Condividi questo messaggio


Link al messaggio
Condividi su altri siti
2 ore fa, Francesco Tundo ha scritto:

[...]Effettivamente il mio oggetto ruota in x, quindi dovrebbe essere appropriato. Ma da errore 

Unknown Property: "rotation" in undefined

L'espressione viene

degToRad (Ctrl_Sp01_Rotore.rotation.x_rotation + Ctrl_Sp01_Rotore.modifiers[#Attribute_Holder].Custom_Attributes.Speed)

[...]

 

 

La rotazione è indefinita perché non riconosce l'oggetto. Quindi davanti al controllo e oggetto metti il segno "$" esempio: $Ctrl_Sp01_Rotore. e $Ctrl_Sp01_Rotore e ricordadi di nominare bene l'attributo de CA. Sotto la stringa "magica" :D 

 

degToRad($Ctrl_Sp01_Rotore.rotation.x_rotation + $Ctrl_Sp01_Rotore.modifiers[#Attribute_Holder].Custom_Attributes.Ctrl_Sp01_Rotore)

 

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

@Francesco Tundo 

 

Se sei interessato ancora al discorso sopra, finalmente "siamo" arrivati ad una bella conclusione, ovvero a determinare ciò che si vuole usando una espressione decente e funzionante.

if(F < nFrames,Speed * ((nFrames-F)/nFrames)^2,0.0)

Per maggiori informazioni sul suo utilizzo e spiegazione matematica, vedi QUI dato che è molto complicato spiegarlo in due parole semplici semplici :D 

 

N.B: Per usare i secondi nella animazione, devi sostituire la "F" con "S"

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Ciao! Scusa se non mi sono fatto sentire in questi giorni, ho dovuto seguire altri lavori. Sì, sono molto interessato e oggi proverò ad applicarla! Penso anche che sia ora di imparare maxscript, ho incontrato molte situazioni in cui avrei potuto risolvere in questo modo e ho dovuto simulare alla meno peggio.

Intanto grazie mille, sei stato gentilissimo!

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

la prima

degToRad($Ctrl_Sp01_Rotore.rotation.x_rotation + $Ctrl_Sp01_Rotore.modifiers[#Attribute_Holder].Custom_Attributes.Ctrl_Sp01_Rotore)

la seconda

if(F < nFrames,Speed * ((nFrames-F)/nFrames)^2,0.0)

se ho capito bene devo aggiungerla alla prima? scusa ma non ho proprio idea di come funzioni lo scripting, e farò le prove nel we, ora sono al lavoro

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Puoi vedere come funziona dall'allegato inserito nella discussione di riferimento postato sopra. La prima formula ha il problema che se cambi assi di rotazione, essi si sommano creando un bordello totale, e in più, sull'asse Y non funziona. La seconda espressione, deve essere associata allo speed e va inserita nel constant (non scale), ovvero un parametro lineare nel tempo. Comunque ti consiglio di leggere la spiegazione matematica per capirne il motivo ;)

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.

×