Jump to content
acamporota

Script Per Interpolare Le Kiavi Maunalmente

Recommended Posts

ciao a tutti con l'aiuto di un programmatore stiamo facendo uno script (MAXSCRIPT) per interpolare manualmente le kiavi di un oggetto..

mi spiego meglio

io ho un cubo che al fotogramma 1 si trova in posizione x=0 e ruotato in x=0 e al fotogramma 30 ho posizione x=100 e rotazione in x= 280 gradi

adesso tramite questo script io voglio creare una chiave al fotogramma 15 per interpolare manualmente la sua posizione

per esempio se la voglio interpolare al 20% tra le tue chiavi il cubo dovra essere in x=20 se interpolo all'80% percento X sarebbe a 80

con la posizione funziona tutto ok il problema è quando ruota..... perchè se devo interpolare il cubo tra 0 e 280... se interpolo del 50% lui non mi gira di 140 gradi... ma gira nella direzione opposta.....

credo perchè voglia raggiungere l'angolo nella direzione piu breve

avete idea di come si possa fare??

grazie a tutti

Share this post


Link to post
Share on other sites

Per quel che so di animazione (molto poco) letto dal libro di Max, il problema dell'interpolazione per la via più breve è risolvibile soltanto creando chiavi intermedie per far capire a Max quale percorso prendere....

Non so se con lo script ci siano soluzioni altrenative.

Share this post


Link to post
Share on other sites
non si puo interpolare via numerica?? oppure passando dal curve editor??

certo che si può.... :-)

come stai dicendo te è un "normalissima" interpolazione lineare.... ma ci sono più "vie" che si possono prendere....

spiega meglio cosa intendi per la rotazione...

Share this post


Link to post
Share on other sites
certo che si può.... :-)

come stai dicendo te è un "normalissima" interpolazione lineare.... ma ci sono più "vie" che si possono prendere....

spiega meglio cosa intendi per la rotazione...

che praticamente se io metto 2 chiavi una in cui l'oggetto è ruotato in X 0 e l'altra in cui ruoto in X 280 gradi e gli dico di

farmi una chiave al 50% lui non mi da 140 gradi.... ma tipo 320 perchè gira all'incontrario...perchè per lui il modo piu veloce per arrivare a chiudere al'angolo non è tornare a 0 ma è andare verso 360 .... io invece voglio che mi faccia una interpolazione del 50% tra 0 e 280..e cioè 140

spero di aver spiegato bene...

scusate ma non sono molto ferrato in programmazione

Share this post


Link to post
Share on other sites
che praticamente se io metto 2 chiavi una in cui l'oggetto è ruotato in X 0 e l'altra in cui ruoto in X 280 gradi e gli dico di

farmi una chiave al 50% lui non mi da 140 gradi.... ma tipo 320 perchè gira all'incontrario...perchè per lui il modo piu veloce per arrivare a chiudere al'angolo non è tornare a 0 ma è andare verso 360 .... io invece voglio che mi faccia una interpolazione del 50% tra 0 e 280..e cioè 140

spero di aver spiegato bene...

scusate ma non sono molto ferrato in programmazione

ok...xò se la fai te l'interpolazione ( e quindi tramite script te lo calcoli ) ti trovi 140 .

interpolazione lineare ( grezza :-) ):

listValori[]

listValori[i - 1] + listValori / 2 -> e hai la nuova chiave.

quindi se hai 0 e 280 il risultato è 140 ... non 320. Sei te che ti devo trovare i valori e non il sw...

spero di essermi spiegato...

Share this post


Link to post
Share on other sites

Ciao a tutti! :D

Mi presento, sono Tiziano, amico di acamporota e lo sto aiutando con questo script.

Tempo fa avevo fatto parecchie prove ma non sono riuscito ad ottenere risultati soddisfacente.

Poi il lavoro (faccio il programmatore di videogiochi) ha preso il sopravvento e non ho potuto piu' metterci mano.

Effettivamente uno dei primi test era proprio usare l'interpolazione lineare.

Pero' per poter interpolare bene le rotazioni ho usato i quaternioni ma Max restituisca lo stesso quaternione per una rotazione (ad esempio) di 0 gradi o di 360 gradi attorno ad un generico asse. Il punto medio quindi diventa 0 invece di essere 180.

Anche se dovessi prendere i valori sulle rotazioni X, Y, Z (con i gradi euleriani quindi?) mi trovo in difficolta' cmq. perche' non so esattamente come rendermi conto se la rotazione segue il percorso minore o quello maggiore (anche se potrei prendere alcuni punti guardando i valori che da max per capire in che intervallo si trovano) e poi non so esattamente come devo fare per creare una nuova rotation partendo da 3 angoli. Quale e' l'ordine giusto? Se non sbaglio puo' anche cambiare. :o

Ho provato ad aggiungere i keyframe intermedi facendolo fare a 3DS Max (addnewkey), ma sorgono molti problemi quando poi devo spostarli (una feature che serve al tool e' poi spostare i keyframe per accostarli piu' ad un estremo o all'altro).

Credo mi sfugga una soluzione banale perche' non puo' essere cosi' complicato! <_<

Magari c'e' una idea elegantissima che non so?

Grazie mille in anticipo!

Share this post


Link to post
Share on other sites
Ciao a tutti! :D

Mi presento, sono Tiziano, amico di acamporota e lo sto aiutando con questo script.

Tempo fa avevo fatto parecchie prove ma non sono riuscito ad ottenere risultati soddisfacente.

Poi il lavoro (faccio il programmatore di videogiochi) ha preso il sopravvento e non ho potuto piu' metterci mano.

Effettivamente uno dei primi test era proprio usare l'interpolazione lineare.

Pero' per poter interpolare bene le rotazioni ho usato i quaternioni ma Max restituisca lo stesso quaternione per una rotazione (ad esempio) di 0 gradi o di 360 gradi attorno ad un generico asse. Il punto medio quindi diventa 0 invece di essere 180.

Anche se dovessi prendere i valori sulle rotazioni X, Y, Z (con i gradi euleriani quindi?) mi trovo in difficolta' cmq. perche' non so esattamente come rendermi conto se la rotazione segue il percorso minore o quello maggiore (anche se potrei prendere alcuni punti guardando i valori che da max per capire in che intervallo si trovano) e poi non so esattamente come devo fare per creare una nuova rotation partendo da 3 angoli. Quale e' l'ordine giusto? Se non sbaglio puo' anche cambiare. :o

Ho provato ad aggiungere i keyframe intermedi facendolo fare a 3DS Max (addnewkey), ma sorgono molti problemi quando poi devo spostarli (una feature che serve al tool e' poi spostare i keyframe per accostarli piu' ad un estremo o all'altro).

Credo mi sfugga una soluzione banale perche' non puo' essere cosi' complicato! <_<

Magari c'e' una idea elegantissima che non so?

Grazie mille in anticipo!

ciao,

scusa il ritardo ma sono stato impegnato...

allora una via mooootlo semplice è quella di prendere il valore ( delle rotazioni ) in gimbal, che per riassumere e semplificare, ti da il valore in X Y Z "reali" che vai a mettere come "animazione".... e da li hai il valore 0 e 360 ....

per prendere i valori in gimabal usa "in coordsys gimbal $nomeOggetto"

questo è un piccolo esempio

poi per la gestione delle chiavi e muoverle posso consigliarti di guardare i controller sul maxScript reference... da li puoi muovere e gestire tranquillamente tutte le chiavi. usando MAXKeyArray ecc...

per qualsiasi domanda sono a disposizione :-)

ciao

ps: non per farmi gli affari tuoi ( non sei obbligato a rispondermi) per che società lavori? :-)

Share this post


Link to post
Share on other sites
ciao,

scusa il ritardo ma sono stato impegnato...

allora una via mooootlo semplice è quella di prendere il valore ( delle rotazioni ) in gimbal, che per riassumere e semplificare, ti da il valore in X Y Z "reali" che vai a mettere come "animazione".... e da li hai il valore 0 e 360 ....

per prendere i valori in gimabal usa "in coordsys gimbal $nomeOggetto"

questo è un piccolo esempio

poi per la gestione delle chiavi e muoverle posso consigliarti di guardare i controller sul maxScript reference... da li puoi muovere e gestire tranquillamente tutte le chiavi. usando MAXKeyArray ecc...

per qualsiasi domanda sono a disposizione :-)

ciao

ps: non per farmi gli affari tuoi ( non sei obbligato a rispondermi) per che società lavori? :-)

ti ringraziamo entrambi per la risposta

io non sono programmatore quindi non so ancora se funzionera ma diro a tiziano (l'altro ragazzo) di provare e di farti sapere

cmq lavora per gd-mind una societa di roma

Share this post


Link to post
Share on other sites
ciao,

scusa il ritardo ma sono stato impegnato...

allora una via mooootlo semplice è quella di prendere il valore ( delle rotazioni ) in gimbal, che per riassumere e semplificare, ti da il valore in X Y Z "reali" che vai a mettere come "animazione".... e da li hai il valore 0 e 360 ....

per prendere i valori in gimabal usa "in coordsys gimbal $nomeOggetto"

questo è un piccolo esempio

poi per la gestione delle chiavi e muoverle posso consigliarti di guardare i controller sul maxScript reference... da li puoi muovere e gestire tranquillamente tutte le chiavi. usando MAXKeyArray ecc...

per qualsiasi domanda sono a disposizione :-)

ciao

ps: non per farmi gli affari tuoi ( non sei obbligato a rispondermi) per che società lavori? :-)

Ciao OneMan, grazie mille per la risposta.

Ho fatto una prova semplice ed i risultati sono effettivamente incoraggianti.

Questo e' lo script:

clearListener()
r0 = at time 0 in coordsys gimbal $.rotation
r1 = at time 50 in coordsys gimbal $.rotation
f = 0.5
x = r0.x + (r1.x - r0.x) * f
y = r0.y + (r1.y - r0.y) * f
z = r0.z + (r1.z - r0.z) * f
r = eulerAngles x y z
in coordsys gimbal $.rotation = r
[/codebox]

Sembra funzionare. Appena ho un attimo di tempo lo provo sullo script piu' complesso, sperando che fra gerarchie e cose strane non esploda tutto. :D

A presto!

p.s. come diceva alessandro, lavoro in gd-mind dove tra le altre cose, mi sono dovuto cimentare in max scripting per i nostri grafici e gli script da fare in 5 secondi per alessandro ;)


Edited by Tx77

Share this post


Link to post
Share on other sites
Ciao OneMan, grazie mille per la risposta.

Ho fatto una prova semplice ed i risultati sono effettivamente incoraggianti.

Questo e' lo script:

clearListener()
r0 = at time 0 in coordsys gimbal $.rotation
r1 = at time 50 in coordsys gimbal $.rotation
f = 0.5
x = r0.x + (r1.x - r0.x) * f
y = r0.y + (r1.y - r0.y) * f
z = r0.z + (r1.z - r0.z) * f
r = eulerAngles x y z
in coordsys gimbal $.rotation = r
[/codebox]

Sembra funzionare. Appena ho un attimo di tempo lo provo sullo script piu' complesso, sperando che fra gerarchie e cose strane non esploda tutto. :D

A presto!

p.s. come diceva alessandro, lavoro in gd-mind dove tra le altre cose, mi sono dovuto cimentare in max scripting per i nostri grafici e gli script da fare in 5 secondi per alessandro ;)

io sono passato da maya a max... quindi anche io ho tanto da imparare ;-)

cmq per qualsiasi cosa chiedi pure che se posso do volentieri una mano

o fai vedere il risultato ottenuto che fa sempre bene leggere :-)

ciauz

ps: "ti saluta Daniele" ( un mio collega dice di conoscerti :-) )

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...