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.
Checking the stable version of the documentation...
Utilizzare Jolt Physics
Introduzione
Il motore di fisica Jolt è stato aggiunto come alternativa al motore di fisica Godot Physics in 4.4. Jolt è sviluppato da Jorrit Rouwe con particolare attenzione ai giochi e alle applicazioni VR. Prima era disponibile come estensione, ma ora è integrato in Godot. I nuovi progetti lo utilizzeranno come motore di fisica predefinito.
L'estensione esistente è ora considerata in modalità manutenzione. Ciò significa che saranno risolti i bug e sarà mantenuta la compatibilità con le nuove versioni di Godot fino a quando il modulo integrato non avrà raggiunto la parità di funzionalità con l'estensione. L'unica cosa che manca al momento sono i giunti correlati, di cui si può leggere in questa pagina. L'estensione è disponibile qui su GitHub e nella libreria dei contenuti di Godot.
Per cambiare il motore di fisica 3D a Jolt Physics, impostare Impostazioni del progetto > Fisica > 3D > Motore di fisica su Jolt Physics. Dopo averlo fatto, clicca sul pulsante Salva e riavvia. Quando l'editor si riapre, le scene 3D dovrebbero ora utilizzare Jolt per la fisica.
Differenze notevoli rispetto a Godot Physics
Ci sono molte differenze tra l'attuale motore di fisica Godot e Jolt.
Proprietà dei giunti
Le interfacce attuali per i nodi dei giunti 3D non sono perfettamente in linea con l'interfaccia dei giunti di Jolt. Pertanto, certe proprietà dei giunti non sono supportate, principalmente quelle relative alla configurazione dei limiti soffici dei giunti.
The proprietà non supportate sono:
PinJoint3D:
bias,damping,impulse_clampHingeJoint3D:
bias,softness,relaxationSliderJoint3D:
angular_\*,\*_limit/softness,\*_limit/restitution,\*_limit/dampingConeTwistJoint3D:
bias,relaxation,softnessGeneric6DOFJoint3D:
*_limit_*/softness,*_limit_*/restitution,*_limit_*/damping,*_limit_*/erp
Attualmente viene emesso un avviso se si impostano queste proprietà su un valore diverso da quello predefinito.
Giunti con un solo corpo
You can, in Godot, omit one of the joint bodies for a two-body joint and effectively
have "the world" be the other body. However, the node path that you assign your body
to (node_a vs node_b)
is ignored. Godot Physics will always behave as if you
assigned it to node_a, and since node_a is also what defines the frame of reference
for the joint limits, you end up with inverted limits and a potentially strange
limit shape, especially if your limits allow both linear and angular degrees of
freedom.
Jolt si comporterà come se il corpo fosse assegnato a node_b, con node_a che rappresenta "il mondo". Esiste un'impostazione del progetto chiamata Fisica > Jolt Physics 3D > Giunti > Nodo del mondo che consente di cambiare questo comportamento, se c'è bisogno di compatibilità con un progetto esistente.
Margini di collisione
Jolt (e altri motori di fisica simili) usa un concetto che Jolt chiama "raggio convesso" per migliorare le prestazioni e il comportamento dei tipi di rilevamento delle collisioni su cui Jolt si basa per le forme convesse. Altri motori di fisica (Godot incluso) potrebbero invece chiamarli "margini di collisione". Godot li espone come proprietà margin su ogni classe derivata da Shape3D, ma Godot Physics stesso non li utilizza per niente.
Questi margini di collisione, come descritto nella documentazione di Godot, a volte creano una sorta di "guscio" attorno alla forma, ingrandendola leggermente e arrotondandone gli spigoli e angoli. In Jolt, invece, questi margini sono usati prima per rimpicciolire la forma, e poi per applicare il "guscio", con il risultato che gli spigoli e gli angoli diventano arrotondati in modo simile, ma senza aumentare le dimensioni della forma.
Per evitare di dover aggiustare manualmente questa proprietà di margine, in quanto il suo valore predefinito può risultare problematico per le forme più piccole, il modulo Jolt espone un'impostazione del progetto chiamata Fisica > Jolt Physics 3D > Collisioni > Frazione del margine di collisione che è moltiplicata per l'asse più piccolo dell'AABB della forma per calcolare il margine effettivo. La proprietà di margine della forma è quindi utilizzata come limite superiore.
Questi margini, nella maggior parte dei casi, dovrebbero essere più o meno trasparenti, ma a volte possono generare normali di collisione anomale facendo query sulla forma. È possibile ridurre l'impostazione sopra menzionata per mitigare questo problema in parte, anche impostandola a 0.0, ma un margine troppo piccolo può comunque causare risultati di collisione anomali, quindi in genere non è consigliato.
Stabilizzazione di Baumgarte
La stabilizzazione di Baumgarte è un metodo per risolvere i corpi in penetrazione e spingerli fino a uno stato in cui si toccano appena. In Godot Physics, questo funziona come una molla. Ciò significa che i corpi possono accelerare, superare i punti di contatto e separarsi completamente. Con Jolt, la stabilizzazione è applicata solo alla posizione e non alla velocità del corpo. Ciò significa che non è possibile superare i punti di contatto, ma ci potrebbe volere più tempo per risolvere la penetrazione.
L'intensità di questa stabilizzazione si può regolare tramite l'impostazione del progetto Fisica > Jolt Physics 3D > Simulazione > Fattore di stabilizzazione di Baumgarte. Impostandola su 0.0 si disattiva la stabilizzazione di Baumgarte. Impostandola su 1.0 la penetrazione si risolverà in un solo passo di simulazione. Questo è veloce, ma spesso anche instabile.
Collisioni fantasma
Jolt impiega due tecniche per mitigare le collisioni fantasma, ovvero le collisioni con i bordi interni di forme/corpi che generano normali di collisione opposte alla direzione del movimento.
La prima tecnica, chiamata "rilevamento dei bordi attivi", contrassegna i bordi dei triangoli in ConcavePolygonShape3D o HeightMapShape3D come "attivi" o "inattivi", in base all'angolo con il triangolo adiacente. Quando avviene una collisione con un bordo inattivo, la normale di collisione sarà sostituita con la normale del triangolo, per ridurre l'effetto delle collisioni fantasma.
La soglia angolare per questo rilevamento dei bordi attivi è configurabile tramite l'impostazione del progetto Fisica >Jolt Fisica 3D > Collisioni > Soglia dei bordi attivi.
La seconda tecnica, chiamata "rimozione avanzata dei bordi interni", aggiunge invece verifiche in fase di esecuzione per rilevare se un bordo è attivo o inattivo, in base ai punti di contatto dei due corpi. Questo ha il vantaggio di essere applicabile non solo alle collisioni con ConcavePolygonShape3D e HeightMapShape3D, ma anche ai bordi tra qualsiasi forma dentro lo stesso corpo.
La rimozione avanzata dei bordi interni si può abilitare e disabilitare per i vari contesti a cui è applicata, tramite l'impostazione del progetto Fisica >Jolt Physics 3D > Simulazione > Usa rimozione avanzata dei bordi interni e le impostazioni simili per le richieste e richieste di movimento.
Si noti che né il rilevamento dei bordi attivi né la rimozione avanzata dei bordi interni si applicano quando si ha a che fare con collisioni fantasma tra due corpi diversi.
Utilizzo di memoria
Jolt utilizza un allocatore di stack per le allocazioni temporanee all'interno della sua fase di simulazione. Questo allocatore richiede di allocare una quantità predefinita di memoria in anticipo, che si può configurare tramite l'impostazione del progetto Fisica > Jolt Physics 3D > Limiti > Dimensione del buffer di memoria temporanea.
Indice di faccia per i raycast
La proprietà face_index restituita nei risultati di intersect_ray() e RayCast3D sarà sempre -1 normalmente con Jolt. L'impostazione del progetto Fisica > Jolt Physics 3D > Richieste > Abilita indici di facce per i raycast li abiliterà.
Si noti che abilitare questa impostazione aumenterà il requisito di memoria per ConcavePolygonShape3D di circa il 25%.
Contatti RigidBody3D con Kinematic
Quando si utilizza Jolt, un RigidBody3D bloccato con FREEZE_MODE_KINEMATIC normalmente non segnalerà i contatti provenienti da collisioni con altri corpi statici/cinematici, per motivi di prestazioni, anche impostando un max_contacts_reported diverso da zero. Se si hanno molti/grandi corpi cinematici che si sovrappongono con geometrie statiche complesse, come ConcavePolygonShape3D o HeightMapShape3D, si rischia di sprecare una quantità significativa di risorse della CPU e di memoria senza rendersene conto.
Per questo motivo, questo comportamento è facoltativo e si può abilitare tramite l'impostazione del progetto: Fisica > Jolt Physics 3D > Simulazione > Genera tutti i contatti cinematici.
Impulsi di contatto
A causa di limitazioni interne a Jolt, gli impulsi di contatto forniti da PhysicsDirectBodyState3D.get_contact_impulse() sono stimati in anticipo in base a fattori quali la varietà di contatto e le velocità dei corpi in collisione. Ciò significa che gli impulsi riportati saranno accurati solo nei casi in cui i due corpi in questione non collidono con altri corpi.
Area3D e SoftBody3D
Jolt supporta lo stesso tipo di interazioni tra SoftBody3D e Area3D di Godot Physics, come le proprietà del vento e della gravità presenti su Area3D. A differenza di Godot Physics, tuttavia, Jolt supporta anche i vari segnali e metodi di sovrapposizione presenti su Area3D, per quando un SoftBody3D entra o esce da una sovrapposizione con esso, come body_entered.
Per ritornare al comportamento di Godot Physics, in cui non vengono emessi segnali di sovrapposizione, è necessario configurare la proprietà collision_mask dell'area in modo che non vi sia sovrapposizione con la proprietà collision_layer del corpo morbido. È anche possibile filtrare manualmente qualsiasi SoftBody3D nella connessione del segnale.
WorldBoundaryShape3D
WorldBoundaryShape3D, che è concepito per rappresentare un piano infinito, è implementato in modo leggermente diverso in Jolt rispetto a Godot Physics. Entrambi i motori hanno un limite superiore per la dimensione effettiva di questo piano, ma tale limite è molto più piccolo quando si utilizza Jolt, per evitare problemi di precisione.
È possibile configurare questo limite tramite l'impostazione del progetto Fisica > Jolt Physics 3D > Limiti > Dimensione della forme di confine del mondo.
Differenze notevoli rispetto all'estensione di Godot Jolt
Sebbene il modulo Jolt integrato sia perlopiù una conversione diretta dell'estensione Jolt di Godot, ci sono alcune cose che sono diverse.
Impostazioni del progetto
Tutte le impostazioni del progetto sono state spostate dalla categoria physics/jolt_3d a physics/jolt_physics_3d.
Oltre a ciò, ci sono stati alcuni cambi di nome e revisioni delle singole impostazioni dei progetti. Tra queste:
sleep/enabledè orasimulation/allow_sleep.sleep/velocity_thresholdè orasimulation/sleep_velocity_threshold.sleep/time_thresholdè orasimulation/sleep_time_threshold.collisions/use_shape_marginsè oracollisions/collision_margin_fraction, dove un valore pari a 0 equivale a disabilitarlo.collisions/use_enhanced_internal_edge_removalè orasimulation/use_enhanced_internal_edge_removal.collisions/areas_detect_static_bodiesè orasimulation/areas_detect_static_bodies.collisions/report_all_kinematic_contactsè orasimulation/generate_all_kinematic_contacts.collisions/soft_body_point_marginè orasimulation/soft_body_point_radius.collisions/body_pair_cache_enabledè orasimulation/body_pair_contact_cache_enabled.collisions/body_pair_cache_distance_thresholdè orasimulation/body_pair_contact_cache_distance_threshold.collisions/body_pair_cache_angle_thresholdè orasimulation/body_pair_contact_cache_angle_threshold.continuous_cd/movement_thresholdora èsimulation/continuous_cd_movement_threshold, ma espresso come frazione anziché come percentuale.continuous_cd/max_penetrationora èsimulation/continuous_cd_max_penetration, ma espresso come frazione anziché come percentuale.kinematics/use_enhanced_internal_edge_removalè oramotion_queries/use_enhanced_internal_edge_removal.kinematics/recovery_iterationsè oramotion_queries/recovery_iterations, ma espresso come frazione anziché come percentuale.kinematics/recovery_amountè oramotion_queries/recovery_amount.queries/use_legacy_ray_castingè stato rimosso.solver/position_iterationsè orasimulation/position_steps.solver/velocity_iterationsè orasimulation/velocity_steps.solver/position_correctionè orasimulation/baumgarte_stabilization_factor, ma espresso come frazione anziché come percentuale.solver/active_edge_thresholdè oracollisions/active_edge_threshold.solver/bounce_velocity_thresholdè orasimulation/bounce_velocity_threshold.solver/contact_speculative_distanceè orasimulation/speculative_contact_distance.solver/contact_allowed_penetrationè orasimulation/penetration_slop.limits/max_angular_velocityè ora invece memorizzato in radianti.limits/max_temporary_memoryè oralimits/temporary_memory_buffer_size.
Nodi di giunti
I nodi di giunti esposti nell'estensione Godot Jolt (JoltPinJoint3D, JoltHingeJoint3D, JoltSliderJoint3D, JoltConeTwistJoint3D e JoltGeneric6DOFJoint) non sono stati inclusi nel modulo Jolt.
Sicurezza dei thread
A differenza dell'estensione Jolt di Godot, il modulo Jolt è in grado di essere sicuro sui thread e supporta l'impostazione del progetto Physics > 3D > Run On Separate Thread. Tuttavia, questa funzionalità non è stata testata in modo molto approfondito, quindi si dovrebbe considerare sperimentale.