Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
70MadMax

Creare Un Controllo Stretch

Recommended Posts

Stretch control tutorial

--------------------------------------------------------------------------------

Questo tutorial serve per creare un controllo che permetta lo 'stretch' dei joints di un rig, per ottenere magari un effetto 'cartoon'

(anche se poi verrà proposto anche un utilizzo alternativo).

In questa prima parte eseguiremo lo stretch su un singolo joint, mentre nella seconda parte riggheremo un 'teorico' arto di un personaggio.

Creiamo quindi 2 joints in sequenza o selezioniamone due consecutivi da una catena esistente (non necessariamente il primo o l'ultimo, anche due nel mezzo della catena).

Rinominiamoli giusto per comodità j1 e j2.

Andiamo poi dalla sezione 'Animation' nel menu Skeleton->IK Handle Tool->[]

Nella finestra del tool settings che ci si aprirà a destra scegliamo come Current solver ikSCsolver

Creiamo la nostra catena IK da j1 a j2 e rinominiamola ik.

Creiamo una semplice curva come controllo e chiamiamola ctrl

Ora due locators, rinominiamoli l1 e l2

Posizioniamo il tutto...

Selezioniamo prima j1 poi l1 ed eseguiamo un Point Constraint con le opzioni di default

Selezioniamo prima ik poi l2 ed eseguiamo un Point Constraint con le opzioni di default

'Snappiamo' ctrl ad ik, eseguiamo quindi un Freeze Transformations su ctrl poi selezioniamo prima ctrl poi ik ed eseguiamo un Point Constraint con le opzioni di default, .

Selezioniamo ctrl e scegliamo la voce di menu Modify->Add Attribute...

Aggiungiamo un attributo o_dist di tipo Float, poi un altro attributo stretchy di tipo int, dandogli 0 come Minimum e 1 come Maximum.

La teoria:

dobbiamo innanzi tutto stabilire la distanza che intercorre nella posizione di partenza tra i due joints, poi, ad ogni spostamento,

calcolare la distanza dell 'ik handle dal primo joint, così da dividerla per quella originaria e sapere così la percentuale di stretch da attribuire al primo joint, un qualcosa tipo:

j1.stretch = distanza / distanzaOriginaria.

Assumiamo che i joints, come da default, abbiano l'asse X che punta verso il joint successivo(se non dovesse essere il vostro caso cambiatelo al bisogno),

quindi il valore di stretch andrà attribuito allo ScaleX del primo joint.

Perchè i locators e il controllo?

Già in questa maniera Maya ci dà un warning di un cycle presente, cosa che possiamo ignorare, ma se non utilizzassimo questo sistema potrebbero sorgere problemi,

sia per la maniera in cui viene calcolata la posizione tra i joints, sia perchè, nel caso di una catena di joints, succede a volte che il programma metta a 0 il valore di ScaleX, salvo poi rimetterlo a posto al primo movimento.

Ora apriamo l' hypershade e andiamo nella tabella utilities, creiamo quindi un Distance Between node e un Multiply Divide node (nell' hypershade menu Create->General Utilities...)

Rinominiamo il primo db ed il secondo md, apriamo l' Attribute Editor per md e settiamo il campo Operation su divide.

Ora un po' di connessioni.

l1.translate connesso a db.point1

l2.translate connesso a db.point2

Ora il nodo db ha nel suo campo distance il valore della distanza tra il due locators(e quindi tra i due joints)

questa è la nostra distanza iniziale, possiamo o copiarla nel campo o_dist di ctrl, oppure possiamo effettuare una connessione tra db.distance e ctrl.o_dist per poi rimuovere la connessione, il valore rimarrà copiato.

Ora: db.distance connesso a md.input1X

ctrl.o_dist connesso a md.input2X

md.outputX connesso a j1.scaleX

Ora selezionando e spostando ctrl, osserveremo come non solo j1 si allungherà in base al movimento, ma i suoi assi punteranno sempre nella stessa direzione

(cioè, nel nostro caso, l'asse X punterà sempre verso j2).

Aggiungiamo un 'interruttore' per attivare o disattivare la modalità 'stretch', utilizzeremo il campo stretch di ctrl.

Riportiamo ctrl ai valori di traslate 0 0 0, potremmo notare che j1 non ritorna alla sua lunghezza iniziale, possiamo non tenerne conto per ora,

oppure possiamo settare una key per i valori di traslate di ctrl al frame 1, e un' altra al frame 2 dove ctrl è a 0 0 0.

Azionando la timeline tutto tornerà normale, possiamo così rimuovere le 2 keys create e riprendere il nostro tutorial.

Sempre nell' Hypershade creiamo un condition node e chiamiamolo c.

ctrl.stretchy connesso a c.firstTerm

di default le impostazioni di c sono 'Equal' e il secondTerm è 0, lasciamole così

Settiamo manualmente (dal Channel Box ad esempio) ColorIfTrueR a 1

md.outputX connesso a c.colorIfFalseR

In questa maniera, se ctrl.stretchy è uguale a 0, il valore di j1.scaleX sarà 1, mentre in caso contrario sarà il risultato ottenuto dalle operazioni precedenti

c.outColorR connesso a j1.scaleX

Ora riproviamo, muovendo il nostro ctrl avendo stretchy = 0 avremo una semplice catena ik, mentre con stretchy = 1 osserveremo il risultato del nostro lavoro.

Ho utilizzato questo sistema quando ho creato uno script per un auto-rig, veniva creato uno skeleton che poi riposizionavo per adeguarlo al character, e ruotare i joints era lungo, muovendoli perdevo l'orientamento degli assi e un aim constraint non sempre era possibile, con questo sistema, semplicemente spostavo ad esempio

l'ossatura delle dita e, una volta rimossi i nodi inutili ed eseguendo un Freeze Transformations tutto era ok.

--------------------------------------------------------------------------------

--------------------------------------------------------------------------------

Seconda Parte, il rigging di un braccio

--------------------------------------------------------------------------------

In questa seconda parte creeremo un controllo 'stretch' per un arto, nel nostro esempio un braccio.

Dobbiamo tenere conto di due cose fondamentali:

- per avere una distorsione ottimale distribuiremo lo stretch su due ossa diverse (Braccio e Avambraccio)

- dobbiamo considerare una distanza minima (pari a quella iniziale) alla quale annullare automaticamente lo stretch, altrimenti non riusciremo più a piegare il nostro braccio, ma semplicemente continuerà ad accorciarsi.

Naturalmente per avere un braccio 'stretchabile' dobbiamo usare un tipo di rig IK, e non FK.

Facciamo finta di avere già un braccio composto da 3 joints, spalla, gomito e polso (j1, j2, j3)

applichiamogli una ik handle chiamata ik (stavolta un ikRPsolver, ricordiamoci però di settare il preferred angle al gomito)

creiamo un controllo per il Pole Vector (un locator andrà bene)

Assicuriamoci che il tutto sia settato a dovere e funzioni...possiamo iniziare.

Il tutto è molto simile all'esempio precedente, solo con qualche aggiunta...

Creiamo una curva di controllo ctrl e due locators, l1 e l2.

come prima:

Selezioniamo prima j1 poi l1 ed eseguiamo un Point Constraint con le opzioni di default

Selezioniamo prima ik poi l2 ed eseguiamo un Point Constraint con le opzioni di default

'Snappiamo' ctrl ad ik, eseguiamo quindi un Freeze Transformations su ctrl poi selezioniamo prima ctrl poi ik ed eseguiamo un Point Constraint con le opzioni di default, .

Selezioniamo ctrl e scegliamo la voce di menu Modify->Add Attribute...

Aggiungiamo un attributo o_dist di tipo Float, e due altri attributi, sempre Float, di nome ratio1 e ratio2(saranno i coefficienti per cui moltiplicheremo le scaleX

dei due joints, così che, volendo, potremo scalarli non proporzionalmente)settiamo di default i loro valori ambedue a 0.5(la somma darà 1)

Aggiungiamo un ulteriore attributo o_distH di tipo Float, questo non sarà altro che la metà di o_dist (H sta per half).

Ora apriamo l' hypershade e andiamo nella tabella utilities, creiamo quindi un Distance Between node (db)e due Multiply Divide nodes (md e md_ratios), ricordiamoci di settare su divide il valore operation di md.

Creiamo inoltre un condition node(c_min), settiamo ad 1 i valori per ColorIfTrue(sia R che G) e come Operation mettiamo Less or Equal.

Ora un po' di connessioni.

l1.translate connesso a db.point1

l2.translate connesso a db.point2

Ora il nodo db ha nel suo campo distance il valore della distanza tra il due locators(e quindi tra i due joints)

questa è la nostra distanza iniziale, possiamo o copiarla nel campo o_dist di ctrl, oppure possiamo effettuare una connessione tra db.distance e ctrl.o_dist per poi rimuovere la connessione, il valore rimarrà copiato, dividiamo per due tale distanza e scriviamola in o_distH.

Ora: db.distance connesso a md.input1X

ctrl.o_distH connesso a md.input2X

md.outputX connesso a md_ratios.input1X

md.outputX connesso(anche) a md_ratios.input1Y

ctrl.ratio1 connesso a md_ratios.input2X

ctrl.ratio2 connesso a md_ratios.input2Y

Avremo così nell'output di md_ratios i valori da attribuire allo scaleX dei due joints.

Se la distanza attuale è minore o uguale alla distanza iniziale, smettiamo di utilizzare lo stretch ed attribuiamo sempre 1 come valore di scale.

db.distance connesso a c_min.firstTerm

ctrl.o_dist connesso a c_min.secondTerm

md_ratios.outputX connesso a c_min.colorIfFalseR

md_ratios.outputY connesso a c_min.colorIfFalseG

c_min.outcolorR connesso a j1.scaleX

c_min.outcolorG connesso a j2.scaleX

Ora muovendo ctrl e allontanandolo il braccio si allungherà, mentre avvicinandolo ritornerà

fino alla lunghezza iniziale per poi piegarsi...

--------------------------------------------------------------------------------

That's all folks...

post-33670-1271970081,4456_thumb.jpg


Edited by nicolce

Share this post


Link to post
Share on other sites

ahahah...Grazie huber...

bè, per questo tutorial le immagini sarebbero state solo dei nodi e le loro connessioni...ho pensato che avrebbero distratto e basta...penso troppo? :)

ahahaha probabile :P

no scherzo era solo per capire un po come veniva...quando avrò un buon modello lo proverò :D

complimenti ancora :Clap03: :Clap03:

Share this post


Link to post
Share on other sites

gironzolando per il sito mi e' capito di vedere questo tutorial, ben fatto bel lavoro ;) ma ci sono un paio di appunti.

questo e' sicuramente un metodo ma se posso dare un consiglio, se si vuole ottenere un effetto di solo stretch non conviene usare la scala di un joint ( senza entrare nei dettagli ) :).

Alla fine stai usando la scala per far translare sull'asse primario ( se non sbaglio qui usi la x ) l'osso figlio.

quindi x' gia' che ci sei non transli direttamente l'osso ;) . Il concetto e' sempre lo stesso, con il distance calcoli la "percentuale" di "movimento" solo che al posto di andare ad influenzare la scala vai a influenzare la posizione del figlio ( X0 * ValoreDiScalatura ) non ci sono passaggi in piu' o in meno da fare, ma e' piu' corretto.

Ad esempio nei video giochi una cosa da evitare sono le scalature non uniformi ( tipo questo metodo di strecth ) perche' l'engine deve ricostruirsi per ogni frame di ogni animzione la matrice inversa deli joint con scalatura non uniforme. ;)

my2c

Share this post


Link to post
Share on other sites

gironzolando per il sito mi e' capito di vedere questo tutorial, ben fatto bel lavoro ;)

Ciao, grazie :)

Alla fine stai usando la scala per far translare sull'asse primario ( se non sbaglio qui usi la x ) l'osso figlio.

Non esattamente...io traslo l'osso figlio dove voglio, senza vincoli di asse, è l'osso padre che deve mantenere il collegamento con il figlio, permettendogli di 'allontanarsi' e mantenendo lo stesso orientamento(soprattutto)...(io non traslo l'osso sull'asse primario, è l'asse primario che deve rimanere verso l'osso figlio, in coseguenza di un qualsiasi suo movimento)

Per fare come dici tu sarebbe da:

1) sapere dove voglio arrivare con il figlio per potere:

2) orientarci il padre(e di conseguenza il figlio si muove), solo ora posso:

3) traslare il figlio lungo la x

Non così immediato quindi(e neanche facile mi sa, sicuramente molto più dispendioso come calcolo)...

quindi x' gia' che ci sei non transli direttamente l'osso ;) . Il concetto e' sempre lo stesso, con il distance calcoli la "percentuale" di "movimento" solo che al posto di andare ad influenzare la scala vai a influenzare la posizione del figlio ( X0 * ValoreDiScalatura ) non ci sono passaggi in piu' o in meno da fare, ma e' piu' corretto.

Forse sbaglio, ma...mica tanto(nel senso che il concetto secondo me non è lo stesso)...io non voglio traslare solo in x il figlio(ricordiamoci che io è il figlio che muovo),per essere più precisi la x del padre, non è detto che sia anche la x del figlio...se il figlio è l'ultimo osso della catena l'orientamento degli assi non è vincolato da un osso successivo, quindi la sua x potrebbe puntare ovunque(e anche in quei casi dove dall'osso partono più figli, io non so dove punta, è questo l'obiettivo: generalizzare il più possibile).

Anche settando a dovere la x del figlio(e io non voglio, voglio una cosa completamente automatica indipendentemente da come è costruita la catena), io lo voglio poter spostare in alto, in basso, in obliquo...

e questo influenza l'orientamento del padre, e non sempre un aim constraint è così stabile e sicuro(tipo quando ti dice che il nodo diventa 'history dependent' o roba del genere, forse addirittura ci vorrebbe un terzo oggetto a cui far puntare l'asse y del padre, e quindi calcolare dove creare questo oggetto), e comunque così 'automaticamente' settabile senza dover per forza ogni volta controllare quale asse punta dove.

Es.

sposto il figlio in basso(diciamo asse y)...calcolato lo spostamento...devo eseguire i tre punti che ho scritto sopra per ottenere l'effetto secondo il metodo del 'traslare solo su x', perchè la x del padre ancora punta dove era prima il figlio.

Ad esempio nei video giochi una cosa da evitare sono le scalature non uniformi ( tipo questo metodo di strecth ) perche' l'engine deve ricostruirsi per ogni frame di ogni animzione la matrice inversa deli joint con scalatura non uniforme. ;)

my2c

Penso(non faccio videogiochi quindi non mi sono mai posto il problema, rispondo a...intuito) che basta creare una catena influenzata nell'orientamento e nella posizione(quindi non dalla scala)dalla catena che stretcherò, e a questo punto posso anche stretcharla uniformemente, se voglio, tanto la mesh non verrà deformata da questa ma dall'altra.

Resta inteso che se riesci a dimostrarmi fattibile il tuo metodo, io sono sempre pronto ad imparare cose nuove.

:hello:


Edited by 70MadMax

Share this post


Link to post
Share on other sites

-----------

Non esattamente...io traslo l'osso figlio dove voglio, senza vincoli di asse, è l'osso padre che deve mantenere il collegamento con il figlio, permettendogli di 'allontanarsi' e mantenendo lo stesso orientamento(soprattutto)...(io non traslo l'osso sull'asse primario, è l'asse primario che deve rimanere verso l'osso figlio, in coseguenza di un qualsiasi suo movimento)

Per fare come dici tu sarebbe da:

1) sapere dove voglio arrivare con il figlio per potere:

2) orientarci il padre(e di conseguenza il figlio si muove), solo ora posso:

3) traslare il figlio lungo la x

Non così immediato quindi(e neanche facile mi sa, sicuramente molto più dispendioso come calcolo)...

-----------

quanto tu scali l'asse del padre quello ceh ottieni e' una nuova posizione del figlio, indi stai muovendo il figlio. Qual'e' l-idea dello stretch e' cambiare la distanza che c'e' tra il padre ed il figlio e quindi facilmente rimpiazzabile con la transazione del figlio.

1) NO, scalare il padre( ad esempio ) di 0.5 corrisponde alla posizione del figlio P0 * 0.5, questa non e' una mia teoria ma matematica.

2) di solito, e si fa sempre in produzione, si tiene l'orient dei joint sempre uguale...maya lo fa in automatico, tranne nell'ultimo figlio che con un semplicissimo orientJoint impostato sul None.

3) e' la stessa procedura che usi...anche te con la scala sti traslando il figlio.

se l'orient dei joint padre non punta il figlio anche con il sistema della scala lo stretch non funziona, fa effetto shear.

-------------

Forse sbaglio, ma...mica tanto(nel senso che il concetto secondo me non è lo stesso)...io non voglio traslare solo in x il figlio(ricordiamoci che io è il figlio che muovo),per essere più precisi la x del padre, non è detto che sia anche la x del figlio...se il figlio è l'ultimo osso della catena l'orientamento degli assi non è vincolato da un osso successivo, quindi la sua x potrebbe puntare ovunque(e anche in quei casi dove dall'osso partono più figli, io non so dove punta, è questo l'obiettivo: generalizzare il più possibile).

Anche settando a dovere la x del figlio(e io non voglio, voglio una cosa completamente automatica indipendentemente da come è costruita la catena), io lo voglio poter spostare in alto, in basso, in obliquo...

e questo influenza l'orientamento del padre, e non sempre un aim constraint è così stabile e sicuro(tipo quando ti dice che il nodo diventa 'history dependent' o roba del genere, forse addirittura ci vorrebbe un terzo oggetto a cui far puntare l'asse y del padre, e quindi calcolare dove creare questo oggetto), e comunque così 'automaticamente' settabile senza dover per forza ogni volta controllare quale asse punta dove.

Es.

sposto il figlio in basso(diciamo asse y)...calcolato lo spostamento...devo eseguire i tre punti che ho scritto sopra per ottenere l'effetto secondo il metodo del 'traslare solo su x', perchè la x del padre ancora punta dove era prima il figlio.

----------

No, sbagliato!

o meglio incorretto.

----------

Penso(non faccio videogiochi quindi non mi sono mai posto il problema, rispondo a...intuito) che basta creare una catena influenzata nell'orientamento e nella posizione(quindi non dalla scala)dalla catena che stretcherò, e a questo punto posso anche stretcharla uniformemente, se voglio, tanto la mesh non verrà deformata da questa ma dall'altra.

-----------

si, come ci sono tanti modi, ma x' fare 2 catene quando si puo' direttamente farlo corretto?

di solito noi abbiamo 3 skeletri attaccati ( ma e' una lunga storia ).

Il mio era solo un consiglio, poi sei libero di ascoltarlo o meno... ogni giorno cerco sempre di imparare qualcosa dai miei colleghi ( siamo circa 12 td ). Ma se deve essere questa la tua reazione a me non interessa convincerti. Se pensi che questo sia il metodo migliore ben venga :)

a me piace conoscere i vari metodi che esistono perche' poi secondo dell'occasione posso utilizarne al posto di un altro ;)

cheers

Marco

marcodambros.com

Share this post


Link to post
Share on other sites

di solito noi abbiamo 3 skeletri attaccati ( ma e' una lunga storia ).

più che lunga è la solita :)

Mi sono riletto il tutto con un po' più di caffè.

Diciamo che io sposto il controllo(che si porta dietro l'ik),

Grazie all'ik ottengo che il padre sia ancora orientato verso il figlio, ma non alla stessa distanza,

per ottenere questo basta traslare il figlio lungo l'asse x fino alla posizione dell'ik, e questo dovrebbe essere quello che dici tu.

Corretto.

Il mio era solo un consiglio, poi sei libero di ascoltarlo o meno... ogni giorno cerco sempre di imparare qualcosa dai miei colleghi ( siamo circa 12 td ). Ma se deve essere questa la tua reazione a me non interessa convincerti. Se pensi che questo sia il metodo migliore ben venga :)

a me piace conoscere i vari metodi che esistono perche' poi secondo dell'occasione posso utilizarne al posto di un altro ;)

cheers

Marco

marcodambros.com

Ora veniamo al punto dolente...

Tu mi hai scritto esponendomi il tuo pensiero e le tue ragioni.

Io sono un essere umano e sul momento non avevo capito bene.

Mi sembra di aver fatto quello che hai fatto tu, cioè ti ho risposto mostrandoti il mio pensiero e le mie ragioni, che, visto che hai più esperienza di me, potevano farti capire che non avevo ben compreso la tua soluzione (o consiglio, è lo stesso).

La mia ultima frase è stata:

"Resta inteso che se riesci a dimostrarmi fattibile il tuo metodo, io sono sempre pronto ad imparare cose nuove."

Un estratto della tua ultima dice:

"ogni giorno cerco sempre di imparare qualcosa dai miei colleghi"

Tu non sei un mio collega, e questa è l'unica differenza (secondo me) tra le nostre due frasi, per il resto mi sembra dicano la stessa(positiva)cosa.

Se dico: "se riesci a dimostrarmi fattibile il tuo metodo"

per me significa "con le parole che hai già detto non mi torna il discorso, se me lo dimostri può essere che lo capisca meglio"

Se capissimo tutti tutto con la prima frase penso che le lezioni di qualsiasi genere durerebbero un quarto del tempo :)

Tu: "Ma se deve essere questa la tua reazione a me non interessa convincerti"

quindi la mia reazione che è quella di uno che ti dice che non ritiene di possedere la verità assoluta, ma che semplicemente le tue parole non lo hanno convinto(non ci ero arrivato all'inizio, fustigatemi pure)ma che comunque pensa che potresti farglielo capire meglio è sbagliata...

Non sto qui per offendere nè per dimostrare la mia superiorità in alcunchè(anche perchè in questo campo non ne ho, forse in statura, quello sì penso), ma per imparare cose che magari in molti tutorial danno per scontate.

Non mi è mai capitato di trovare un tutorial di controllo stretch con il metodo da te proposto, ma solo con quello detto da me, quindi l'ho fatto secondo le mie conoscenze.

Possiamo metterla così, ci siamo capiti male ambedue, io per la tua soluzione tecnica, tu per la mia ultima frase, 1 pari e palla al centro.

Ti ringrazio naturalmente perchè mi hai insegnato un metodo nuovo che metterò subito sotto rodaggio, e magari rimetterò una versione aggiornata del tutorial.

Share this post


Link to post
Share on other sites

No no, ma non fraintendermi.. ( tolto che il mio italiano e' quello che e' :D ). Non volevo avere il tono 'cattivo' e' una cosa che in chat effettivamente si capisce sempre poco.

E' vero ho parlato di colleghi ma intendo qualsiasi fonte che mi possa dare qualcosa in piu' ;) e con questo non voglio dire che sia io, ANZI :D ... leggendo leggendo qualcosa si scopre :). Come si dice, 'un idea sbagliata e' sempre un idea' e non sai quante volte da un idea sbagliata e' nato un systema ( tra cui l'ultima versione dell'auto rig :D )

Appena avro' un po' di tempo faro' ( mi sono appena trasferito nella casa nuova e non ho internet quindi scrivo da lavoro). cmq se vuoi provare sono gli stessi passaggi solo che al posto di modificare la scala vai a moltiplicare il valore di partenza della x del figlio per il rapporto tra distanza originale e distanza reale.

Beh diciamo che non e' una cosa assoluta di usare 3 scheletri ma diciamo abbastanza comune. ovvio c'e' sempre il primo skeletro per lo skin il secondo che supporta il sistema di rig ( nel nostro caso il sistama di mocap e controlli e' insieme ) e' poi abbiamo un terzo che non mi e' dato sapere l'esistenza :D no no scherzp :) il terzo lo usiamo per un secondo rig, e' per questo che dicevo che questa e' una storia lunga :) solamente x' non posso spiegare come mai ci sono due rig differenti sopra uno skeletro ( e c'e' una ragione :) giurin giuretta :D )

Share this post


Link to post
Share on other sites

No no, ma non fraintendermi.. ( tolto che il mio italiano e' quello che e' :D ). Non volevo avere il tono 'cattivo' e' una cosa che in chat effettivamente si capisce sempre poco.

Infatti per me quel tipo di questione è chiusa lì :)

cmq se vuoi provare sono gli stessi passaggi solo che al posto di modificare la scala vai a moltiplicare il valore di partenza della x del figlio per il rapporto tra distanza originale e distanza reale.

Share this post


Link to post
Share on other sites

ahhhh scusami hai frainteso ( e io non avevo capito ) quando parlavo di 3 skeletri non parlavo ( ad esmepio ) delle 3 catene per fare l'ik/fk ma proprio di 3 sistemi di skeleton concatenati tra di loro ( e ognuno porta con se ad esempio per il braccio le 3, beh in questo caso 2, catene per ik fk ). Sono proprio 2 sistemi di rig separati, piu' uno per lo skin....

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...
Aspetta! x