Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

Sistema di ragdoll

Introduzione

Godot supporta la fisica di ragdoll. I ragdoll dipendono sulla simulazione della fisica per creare animazioni procedurali realistiche. Sono utilizzati per le animazioni di morte in molti giochi.

In questo tutorial, useremo la demo Platformer 3D per creare un ragdoll.

Nota

È possibile scaricare la demo Platformer 3D da GitHub oppure attraverso la Libreria dei contenuti.

Puoi anche dare un'occhiata a un esempio di configurazione completa di ragdoll nella demo Ragdoll Physics.

Configurazione del ragdoll

Creare ossa fisiche

Come molte altre funzionalità del motore, ci sono due nodi che servono per preparare un ragdoll:

  • Un nodo PhysicalBoneSimulator3D. Questo nodo è il genitore di tutte le ossa fisiche ed è responsabile di controllare la simulazione.

  • Uno o più nodi PhysicalBone3D figlio. Ogni nodo rappresenta un singolo osso nel ragdoll.

Apri la demo piattaforme in Godot, poi la scena player/player.tscn. Seleziona il nodo Skeleton3D. Un pulsante di uno scheletro appare in alto alla viewport 3D dell'editor:

Creare uno scheletro fisico nell'editor

Creare uno scheletro fisico nell'editor

Cliccaci sopra e seleziona l'opzione Crea scheletro fisico. Godot genererà nodi PhysicalBone3D e forme di collisione per ogni osso dello scheletro e giunti a perno per collegarli tra loro:

Albero di scene della scena del giocatore dopo aver creato uno scheletro fisico

Albero di scene della scena del giocatore dopo aver creato uno scheletro fisico

Alcune delle ossa generate non sono necessarie, come l'osso MASTER in questa scena. Ripuliremo lo scheletro rimuovendole.

Pulire e ottimizzare lo scheletro

Ogni PhysicalBone3D che il motore ha bisogno di simulare ha un impatto sulle prestazioni. È opportuno rimuovere ogni osso troppo piccolo per fare una differenza nella simulazione, così come tutte le ossa utilitarie.

Ad esempio, se prendiamo un umanoide, non c'è bisogno di avere ossa fisiche per ogni dito. Puoi usare un singolo osso per l'intera mano, oppure uno per il palmo, uno per il pollice e un ultimo per le altre quattro dita.

Rimuovi questi nodi PhysicalBone3D: MASTER, waist, neck, headtracker. Ciò facendo otteniamo uno scheletro ottimizzato e rende più facile controllare il ragdoll.

Regolare giunti e vincoli

Una volta aggiustate le forme di collisione, il ragdoll è quasi pronto. Basta solo regolare i giunti a perno per ottenere una simulazione migliore. Ai nodi PhysicalBone3D è predefinito un giunto a perno non vincolato. Per modificare il giunto a perno, seleziona un nodo PhysicalBone3D e modifica il tipo di vincolo nella sezione Joint nell'ispettore. Qui puoi cambiare l'orientamento e i limiti del vincolo.

Anche i giunti hanno un gizmo visibile nell'editor 3D, in modo da poter vedere i loro vincoli in azione.

Regolazione dei giunti nell'ispettore dopo aver selezionato un nodo PhysicalBone3D

Regolazione dei giunti nell'ispettore dopo aver selezionato un nodo PhysicalBone3D

Suggerimento

Per ottenere una visuale migliore durante la modifica di giunti e forme di collisione, puoi fare così:

  • Nascondi i nodi PhysicalBone3D su cui non stai lavorando, in modo da poterti concentrare su quelli che stai regolando.

  • Nascondi il MeshInstance3D del personaggio cliccando sull'icona a forma di occhio accanto ad esso nel pannello dell'albero di scene.

  • Nascondi i gizmo di Skeleton3D, in modo che i triangoli arancioni che rappresentano lo scheletro non ingombrino la viewport, lasciando il resto visibile. Per farlo, clicca su View > Gizmos > Skeleton3D in alto la viewport dell'editor 3D finché l'icona dell'occhio non appare chiusa.

  • Disattiva l'ambiente di anteprima cliccando sull'icona del globo in alto la viewport dell'editor 3D.

  • Nelle Impostazioni del progetto, imposta Default Clear Color su nero puro. Questa funziona solo se l'ambiente di anteprima è disabilitato.

  • Cambia la modalità di disegno di debug tramite il pulsante Perspective nell'angolo in alto a sinistra della viewport dell'editor 3D. Le opzioni Display Wireframe e Display Overdraw sono particolarmente utili quando si regolano le forme di collisione, poiché consentono di vedere attraverso la mesh originale.

  • Utilizza la telecamera ortografica cliccando sui pulsanti X/Y/Z nell'angolo in alto a destra della viewport dell'editor 3D.

Ecco l'elenco di giunti disponibili:

  • None: non effettua alcun vincolo.

  • ConeJoint: giunto sferico. Utile per spalle, fianchi, collo.

  • HingeJoint: fornisce un vincolo angolare; pensalo come una cerniera di una porta. Utile per gomiti e ginocchia.

  • PinJoint: mantiene due corpi collegati (predefinito). Porta alla "deformazione" delle ossa, quindi si consiglia di utilizzare altri tipi di giunto per la maggior parte dei personaggi.

  • SliderJoint: fa scorrere un osso lungo un altro su un asse specifico.

  • 6DOFJoint: il giunto più potente, che offre vincoli sia lineari sia angolari, ma anche il più complesso da configurare.

In caso di dubbio, comincia con HingeJoint e ConeJoint, poiché coprono la maggior parte dei casi d'uso:

  • Per HingeJoint, assicurati di abilitare Angular Limit nella sezione Joint Constraints dell'ispettore. Dopo averlo abilitato, potrai vedere l'angolo a cui è vincolato nella viewport. Puoi ruotare il PhysicalBone3D per cambiare l'asse in cui è vincolato il giunto, e poi regolare gli angoli.

  • Per ConeJoint, di solito è meglio limitare Swing Span tra 20 e 90 gradi e Twist Span tra 20 e 45 gradi.

Regolare le forme di collisione

Il prossimo passo è regolare la forma di collisione e le dimensioni delle ossa fisiche in modo che corrispondano alla parte del corpo che ogni osso deve simulare.

Si consiglia di regolare le forme di collisione dopo aver regolato giunti e vincoli, poiché ruotare un giunto ruota anche la forma di collisione. Per evitare di dover regolare le forme di collisione due volte, è meglio regolare prima i giunti.

Si noti che è possibile avere più forme di collisione come figlio di un nodo PhysicalBone3D. Ciò può servire per rappresentare forme particolarmente complesse di arti che altrimenti sarebbero rigidi.

Suggerimento

Per mettere in pausa la riproduzione dell'animazione mentre regoli il ragdoll, seleziona il nodo AnimationTree e disabilita la proprietà Active nell'Ispettore. Ricorda di riattivarla al termine, poiché controlla la riproduzione dell'animazione durante il gioco.

Regolare le forme di collisione nell'editor 3D

Regolare le forme di collisione nell'editor 3D

Questo è il risultato finale:

Risultato dopo aver regolato i giunti e le forme di collisione (la mesh del giocatore è nascosta per visibilità)

Risultato dopo aver regolato i giunti e le forme di collisione (la mesh del giocatore è nascosta per visibilità)

Simulare il ragdoll

Il ragdoll è ora pronto per l'uso. Per avviare la simulazione e riprodurre l'animazione del ragdoll, è necessario chiamare il metodo PhysicalBoneSimulator3D.physical_bones_start_simulation(). Allega uno script al nodo PhysicalBoneSimulator3D che è il genitore di tutti i nodi PhysicalBone3D nella nostra scena, e poi chiamalo nel metodo _ready dello script:

func _ready():
    physical_bones_start_simulation()

Per interrompere la simulazione, chiama il metodo PhysicalBoneSimulator3D.physical_bones_stop_simulation().

È anche possibile limitare la simulazione a poche ossa. Ciò può servire per creare effetti come arti o accessori che interagiscono con il mondo circostante in stile ragdoll. Per farlo, bisogna passare i nomi delle ossa (non i nomi dei nodi PhysicalBone3D) come parametro. Per visualizzare il nome dell'osso, consulta la proprietà Bone Name nell'ispettore dopo aver selezionato un nodo PhysicalBone3D.

Suggerimento

Quando si utilizza uno scheletro fisico generato automaticamente, come mostrato in questo tutorial, il nome dell'osso è incluso anche nel nome del nodo. Ad esempio, in Physical Bone l-arm, l-arm è il nome dell'osso.

func _ready():
    physical_bones_start_simulation(["l-arm", "r-arm"])

Nota che i nomi delle ossa inesistenti non stamperanno alcun errore o avviso. Se nulla accade all'avvio della simulazione (o se l'intero corpo agisce come un ragdoll anziché solo ossa specifiche), riguarda l'elenco delle ossa fornite.

Ecco un esempio di simulazione parziale di ragdoll:

Suggerimento

Per controllare l'intensità con cui la simulazione parziale di ragdoll influenza l'animazione nel complesso, è possibile regolare la proprietà Influence nel nodo PhysicalBoneSimulator3D che è il genitore di tutti i nodi PhysicalBone3D. Come predefinito, è impostato su 1.0, il che significa che la simulazione di ragdoll sovrascrive completamente il resto dell'animazione.

Strato e maschera di collisione

Assicurati di impostare correttamente gli strati e le maschere di collisione in modo che la capsula del CharacterBody3D non interferisca con la simulazione della fisica. Ricorda di regolare lo strato di collisione e la maschera anche nella scena della moneta, in modo che il giocatore possa comunque raccogliere le monete:

Gli strati e le maschere si devono regolare su questi valori nell'ispettore per ogni nodo

Gli strati e le maschere si devono regolare su questi valori nell'ispettore per ogni nodo

Puoi trovare la GridMap nella demo di piattaforme 3D in stage/grid_map.scn. Il nodo Area3D della moneta (sul quale si devono regolare gli strati e le maschere) si trova in coin/coin.tscn.

Suggerimento

Per selezionare rapidamente tutti i nodi PhysicalBone3D, digita t:PhysicalBone3D nella barra di ricerca in alto il pannello dell'albero di scene. In questo modo, l'albero di scene sarà filtrato per mostrare solo i nodi PhysicalBone3D, consentendoti di selezionarli tutti alla volta utilizzando Shift + pulsante sinistro del mouse sulla prima e sull'ultima voce.

Se non è fatto tutto ciò, le collisioni non funzioneranno correttamente poiché il giocatore si scontrerà con il proprio ragdoll (inattivo), il che può farlo rimbalzare senza controllo o bloccarlo nel mondo circostante.

Analogamente a RigidBody3D, PhysicalBone3D supporta le eccezioni di collisione tramite codice attraverso i metodi physical_bones_add_collision_exception() e physical_bones_remove_collision_exception(). Questo può servire per evitare collisioni con un oggetto specifico senza dover ricorrere a strati e maschere.

Vedi anche

Per ulteriori informazioni, consulta Strati e maschere di collisione.