Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

I Joint

Definire cerniere, giunture, articolazioni per i personaggi dei i giochi.
Definire cerniere, giunture, articolazioni per i personaggi dei i giochi.
Link copiato negli appunti

I Joint sono lo strumento tramite il quale Unity permette di utilizzare oggetti e modelli tridimensionali come se fossero marionette. Il motore fisico di Unity permette infatti di creare diversi tipi di giunture (Joint appunto) per ottenere effetti particolari, di solito per limitare il movimento di un corpo nello spazio.

I Joint ed il motore fisico

Esiste un componente per ogni tipo di Joint, e per assegnarli si può seguire la solita procedura da menu Component > Physics > Hinge Joint (ad esempio), o dal tasto Add Component dell'Inspector.

Per assegnare un Joint, è necessario che il corpo abbia anche un Rigidbody, ma non deve per forza avere un Collider: il corpo potrebbe ubbidire alle leggi della fisica, ma essere intangibile. Niente vieta di aggiungere al corpo spinte e forze varie in programmazione (come visto nella lezione sui Rigidbody) e venir limitato dai Joint.

I Joint si possono vedere in azione solo quando la scena è in Play. Se i corpi influenzati da Joint vengono mossi quando la scena è in Pausa, è possibile che al Play li si vedrà scattare in posizione per recuperare la posizione selezionata nelle proprietà dei Joint stessi.

Prima di andare avanti fissiamo bene in mente che quasi tutte le proprietà dei Joint che esaminiamo sono accessibili, oltre che dall'Inspector, anche in programmazione, semplicemente utilizzando la funzione GetComponent per accedere al Joint, e operando su di esso come già visto con i componenti Transform, Collider, Rigidbody, etc.

FixedJoint

Il FixedJoint è una giunzione di tipo fisso che funziona in maniera molto simile all'imparentamento fra GameObject, creando un collegamento fisso fra il GameObject e lo spazio, o fra due GameObject. Quando viene applicato un FixedJoint ad un corpo, questi cerca di mantenere la propria posizione nello spazio.

Ecco come appare nell'Inspector:

Il FixedJoint, come molti altri Joint, ha una proprietà chiamata Connected Body, che può essere nulla o contenere un riferimento ad un Rigidbody presente su un altro oggetto. Se non è nulla, il corpo con il Fixed Joint cercherà di seguire i movimenti del GameObject connesso. In alcuni casi può succedere che per urti e compenetrazioni il corpo non riesca a mantenere la posizione relativa: in questo caso si comporterà come se fosse legato da una molla, cercando di tornare alla posizione in cui si trovava.

NOTA: Quando un corpo è connesso ad un altro con Connected Body, smette di collidere con questo.

Se il corpo limitato dal Joint prende un urto, i valori Break Force e Break Torque indicano i limiti massimi al di sopra dei quali il Joint si rompe, e viene rimosso. Di default questi due campi hanno come valore Infinity, che sta a significare che il Joint è indistruttibile. I limiti di rottura non sono specifici del FixedJoint, ma ricorrono un po' in tutti i Joint.

I cardini - HingeJoint

Gli HingeJoint, come dice il nome, sono giunture utilizzate per creare connessioni simili ai cardini di una porta, dove un corpo viene forzato a ruotare su un asse (che non per forza deve passare per il suo centro).

Poiché è costretto a ruotare su quest'asse, il corpo non si può muovere liberamente nello spazio. Fa eccezione il caso in cui il corpo sia legato ad un altro (mediante imparentamento o selezionando un corpo ConnectedBody), permettendo il movimento insieme al suo parent.

Assegnamo un HingeJoint ad un corpo. L'Inspector si presenterà in maniera simile:

I campi fondamentali sono:

  • Anchor: è un vettore che indica la posizione nello spazio dell'asse su cui l'oggetto ruota, in coordinate locali. In quest'esempio, essendo l'oggetto un cubo da un unità, 0.5 sull'asse Y vuol dire che l'oggetto ruota come se avesse un cardine applicato al suo lato superiore.
  • I valori di Axis definiscono l'orientamento dell'asse di rotazione, e sono un vettore che indica una direzione: quel (0, 0, 1) in figura indica una rotazione lungo l'asse Z. Anche qui l'orientamento è locale, quindi anche se l'oggetto viene ruotato nello spazio, una volta in Play inizierà ad oscillare lungo il suo asse Z, e non quello del mondo.

Altro esempio: un valore di (1, 0, 1) indica un asse a 45° fra Z e X. Per inciso, un valore di (0.5, 0, 0.5) avrebbe lo stesso effetto.

Nella scena vedremo una situazione simile:

In questo setup, al cubo blu è stato assegnato un HingeJoint, che lo costringe a ruotare su un asse rappresentato nell'immagine da una piccola freccia arancione che punta verso destra, parallela al suo asse Z. La freccia arancione è piccola e potrebbe essere difficile vederla, ma è un'utile indicazione per capire su quale asse è costretto il corpo e dove si trova il centro della rotazione.

NOTA: Meglio non modificare i valori di Connected Anchor, e lasciare la spunta su Auto Configure Connected Anchor. In questo modo Unity sceglierà in autonomia dove posizionare l'asse di rotazione per l'oggetto connesso, e non ci saranno effetti indesiderati. Configurare questo valore a mano è il più delle volte inutile.

Assegniamo il parallelepipedo giallo nella proprietà ConnectedBody, e mettiamo il suo Rigidbody come isKinematic, in modo che non cada per la gravità e non si sposti. Il cubo blu è ora ancorato lungo un cardine orizzontale, e "pende" letteralmente da quello giallo.

NOTA: legare un Joint ad un altro oggetto che abbia il Rigidbody su isKinematic e che non si muove, è un po' come non legarlo a nessun oggetto, con l'unica differenza (come detto sopra) che se gli oggetti sono legati fra loro, non collidono.

Se mandiamo la scena in Play e muoviamo l'oggetto arancione in orizzontale, il cubo blu penzolerà ed è possibile che ad angoli estremi compenetri il suo parent, così:

Per evitare questo effetto, possiamo limitare la libertà di movimento sull'asse fino ad un angolo limite. Spuntiamo Use Limits, ed assegnamo questi valori: Min -80, Max 80. In questo modo, il corpo girerà intorno all'asse Z solo di 80 gradi in entrambi i sensi. Se vogliamo, possiamo assegnare i valori di Min Bounce e Max Bounce, per far rimbalzare il corpo in caso arrivi a questo angolo massimo.

Altra proprietà utile degli HingeJoint, è Use Motor. Attivando questa spunta, l'oggetto inizierà a girare intorno all'asse di moto proprio, come se avesse un motore. Grazie alle proprietà Target Velocity e Force, possiamo definire la forza del motore e la velocità rotazionale da raggiungere. Free Spin indica se il motore agisce solo da acceleratore del corpo o lo frena anche.

C'è anche la possibilità di trattare il cardine come se fosse 'a molla'. Spuntando Use Spring, l'oggetto tenderà a tornare ad un certo angolo (ammesso che ce la faccia, visto che un oggetto o la gravità potrebbero bloccarlo). L'angolo si può scegliere con Target Position, mentre Spring e Damper definiscono rispettivamente la forza della molla, e la tendenza della molla ad andare oltre il valore limite.

Chiaramente, se il valore di Target Position è fuori dai limiti imposti da Use Limits, si otterranno effetti indesiderati. Il consiglio in questi casi è di testare i vari limiti (Limits, Spring ma anche Motor) in maniera indipendente, prima di attivarli insieme, per capire meglio se stanno funzionando nella maniera desiderata o no.

In ultimo, precisiamo che se è attivo Use Motor, l'oggetto non si comporterà come una molla anche se Use Spring è spuntato: in pratica, motore e molla sono incompatibili. Use Limits invece funziona in entrambi i casi.

Le molle - Spring Joint

Molto simili agli HingeJoint, le molle sono una giuntura che crea un collegamento molleggiato, per cui il corpo, che in generale può muoversi e ruotare su tutti gli assi, cerca comunque di tornare ad una posizione impostata dall'Anchor del HingeJoint.

Sostituendo uno SpringJoint all'HingeJoint al cubo di prima, la situazione sarà questa:

Come si vede in figura, un piccolo cubetto giallo indica la posizione dell'Anchor da raggiungere (1), ed un altro quella attuale del cubo blu (2). La molla applicherà la sua forza (il parametro Strength) per cercare di far combaciare i due cubetti, con un'elasticità indicata dal parametro Damper.

In questo scenario, di nuovo, entrano in gioco gli altri oggetti che potrebbero urtare il corpo, e la gravità, che potrebbero fare in modo che il corpo non torni mai alla posizione di partenza se il valore di Strength non è abbastanza alto.

In più, i valori di Max Distance e Min Distance indicano l'area di azione della molla: il corpo cercherà di raggiungere l'Anchor solo se si trova ad una distanza inferiore a Min Distance, e ad una superiore a Max Distance. Ad esempio, se i valori sono rispettivamente 0 e 1, la molla verrà attivata solo se il corpo è più lontano di 1 unità dall'Anchor. Quando il corpo si è avvicinato fino ad essere a meno di un unità di distanza, la molla si disattiva (attenzione: si disattiva, non viene distrutta come nel caso di Break Force e Break Torque).

Character Joint

Il Character Joint non è altro che un Hinge Joint su due assi piuttosto che uno, e perciò si può utilizzare per simulare le giunture di un personaggio, come gomiti e ginocchia. L'Inspector si presenta così:

Questo Joint possiede un asse di rotazione (Axis) come l'Hinge Joint, ed un secondo asse di libertà chiamato Swing Axis. Entrambi gli assi hanno dei limits (sempre attivi), chiamati rispettivamente Low/High Limit per l'Axis (che qui vanno da -20 a 70 gradi), e Swing1/Swing2 Limit per lo Swing Axis (qui a 0), ed ogni limite ha la sua Bounciness, Spring e Damper (si veda sopra).

In pratica, un ginocchio avrà un Axis il cui limite positivo sarà quasi 180° (gamba piegata) mentre quello negativo prossimo a zero (si spezzerebbe il ginocchio!), mentre il suo Swing Axis avrà valori su entrambi i lati ma molto piccoli, per permettere una piccola torsione della gamba. Un braccio invece avrà un Axis simile ma uno Swing Axis con limiti molto superiori.

Se Swing1/Swing2 Limit sono impostati entrambi a 0 come nella figura sopra, non potendosi muovere sullo Swing Axis questo Joint si comporta di fatto esattamente come l'HingeJoint.

In caso di personaggio morto per un impatto, si potrebbe pensare di agire in programmazione aumentando i limiti del Joint, per permettere valori impossibili che facciano sembrare che il personaggio ha subito una frattura di un arto.

Configurable Joint

Il Configurable Joint è, come dice il nome, una giuntura completamente configurabile in tutti i suoi aspetti. L'Inspector appare così:

Il Configurable Joint dà massima libertà di configurazione, permettendo di settare un asse di rotazione, un motore (i valori di Drive) e dei limiti come nel caso dell'HingeJoint, ma anche un molleggiamento come per lo SpringJoint, ed ancora di impostare un limite massimo al di sopra del quale il Joint si resetta (le proprietà Projection), e infine di settare tutti i valori in World Space piuttosto che come valori locali.

Di fatto, questo Joint permette di ricreare tutti gli altri ed anche di più, ma è così complesso che si sconsiglia l'utilizzo se non si è molto esperti e/o si vuole ottenere un risultato davvero particolare. La descrizione dei singoli parametri esula dal campo di questa guida. Per i dettagli su tutte le proprietà, potete andare sulla descrizione del componente nella guida di Unity.

Ti consigliamo anche