Ogni assemblaggio nel Roblox Engine corrisponde a un singolo corpo rigido. La posizione e la velocità di ogni corpo rigido descrivono dove si trova e con quale velocità si muove, e uno dei principali compiti del motore è aggiornare le posizioni e le velocità di ciascun assemblaggio.
Gli assemblaggi possono essere collegati tra loro con vincoli meccanici e vincoli di movimento per formare meccanismi come auto o aerei. Man mano che il numero di assemblaggi e vincoli in un meccanismo aumenta, aumenta anche il tempo necessario per simulare il meccanismo. Fortunatamente, questo aumento è compensato quando il sistema di sonno determina che il motore può saltare la simulazione degli assemblaggi non in movimento.
Stati di sonno
Ogni assemblaggio può trovarsi in uno dei tre stati: sveglio, dormiente o in-controllo-del-sonno.
Sveglio
Un assemblaggio sveglio è in movimento o in accelerazione e quindi viene simulato. Gli assemblaggi entrano in questo stato da situazioni descritte in dormiente e in-controllo-del-sonno, oltre a ulteriori situazioni di risveglio.
Dormiente
Un assemblaggio dormiente non è né in movimento né in accelerazione e quindi non viene simulato.
Un assemblaggio viene determinato come non in movimento controllando la sua velocità lineare e velocità rotazionale. Se la sua velocità lineare è inferiore alla soglia di Velocità Lineare e la sua velocità rotazionale è inferiore alla soglia di Velocità Rotazionale, l'assemblaggio è considerato non in movimento.
In alcuni casi, controllare semplicemente la mancanza di movimento potrebbe far entrare un assemblaggio nello stato dormiente in modo errato. Ad esempio, se una palla viene lanciata dritto verso l'alto, la sua velocità si avvicina a zero man mano che raggiunge la sua massima altezza, rendendola un candidato per il sonno e mai più per tornare giù. Per gestire tali casi, il motore considera un assemblaggio in accelerazione se la sua accelerazione lineare o accelerazione rotazionale sono superiori ai valori di soglia di Accelerazione Lineare e Accelerazione Rotazionale, rispettivamente, e impedirà all'assemblaggio di addormentarsi.
In-controllo-del-sonno
Un assemblaggio non in movimento che condivide un vincolo con almeno un assemblaggio sveglio viene messo nello stato di in-controllo-del-sonno e non viene simulato. In ogni passo del mondo, un assemblaggio in controllo del sonno verifica se:
- La sua accelerazione lineare è superiore alla soglia di Wake Linear Acceleration.
- La sua accelerazione rotazionale è superiore alla soglia di Wake Rotational Acceleration.
- La velocità lineare di un assemblaggio vicino è superiore alla soglia di Neighbor Linear Velocity.
- La velocità rotazionale di un assemblaggio vicino è superiore alla soglia di Neighbor Rotational Velocity.
Se una di queste condizioni è vera, o sotto una delle ulteriori situazioni di risveglio, l'assemblaggio in controllo del sonno passa allo stato sveglio.
Riferimento soglia
La seguente tabella fornisce le varie soglie di velocità e accelerazione utilizzate per determinare se un assemblaggio è in movimento o in accelerazione.
| Soglia | Valore | Cambiamento di stato |
|---|---|---|
| Velocità Lineare | 0.33 studs/s | sveglio ⟩ dormiente |
| Velocità Rotazionale | 0.42 studs/s | sveglio ⟩ dormiente |
| Accelerazione Lineare | 0.24 studs/s² | sveglio ⟩ dormiente |
| Accelerazione Rotazionale | 0.24 studs/s² | sveglio ⟩ dormiente |
| Velocità Lineare del Vicino | 0.48 studs/s | in-controllo-del-sonno ⟩ sveglio |
| Velocità Rotazionale del Vicino | 0.59 studs/s | in-controllo-del-sonno ⟩ sveglio |
| Accelerazione Lineare di Risveglio | 16.9 studs/s² | sveglio ⟩ dormiente |
| Accelerazione Rotazionale di Risveglio | 16.9 studs/s² | sveglio ⟩ dormiente |
Le soglie di velocità e accelerazione rotazionale riflettono la velocità e l'accelerazione di un punto situato sulla sfera di delimitazione dell'assemblaggio (una sfera che contiene tutte le parti di un assemblaggio) che si muove rigidamente con l'assemblaggio.
Giunti attuati
A volte gli sviluppatori vogliono muovere le parti molto lentamente utilizzando un giunto attuato, un vincolo che applica forze o movimenti per azionare le parti collegate, come un HingeConstraint utilizzando un Motor. Per supportare questi scenari, gli assemblaggi collegati a giunti attuati utilizzano una soglia di velocità di sonno più rigorosa. Questo ritarda quando quegli assemblaggi si addormentano, consentendo un movimento lento e controllato senza che il sistema fisico li metta a dormire prematuramente.
I seguenti sono considerati giunti attuati:
| Vincolo | Configurazione | Proprietà non nulle richieste |
|---|---|---|
| AlignOrientation | RigidityEnabled = false | |
| AlignPosition | RigidityEnabled = false | |
| AngularVelocity | — | |
| AnimationConstraint | IsKinematic = false | |
| CylindricalConstraint | ActuatorType = Motor | |
| ActuatorType = Servo | ||
| CylindricalConstraint | AngularActuatorType = Motor | |
| AngularActuatorType = Servo | ||
| HingeConstraint | ActuatorType = Motor | |
| ActuatorType = Servo | ||
| LinearVelocity | VelocityConstraintMode = Line |
|
| VelocityConstraintMode = Plane | ||
| VelocityConstraintMode = Vector | ||
| PrismaticConstraint | ActuatorType = Motor | |
| ActuatorType = Servo | ||
| RopeConstraint | WinchEnabled = true |
Ulteriori situazioni di risveglio
Oltre alle situazioni descritte in in-controllo-del-sonno e dormiente, un assemblaggio entra nello stato sveglio quando:
Collide con un altro assemblaggio che si muove più veloce di 1 studs/s.
Qualsiasi proprietà relativa alla fisica di qualsiasi BasePart all'interno dell'assemblaggio cambia, inclusi:
Viene applicata un'impulso non nullo a qualsiasi BasePart all'interno dell'assemblaggio tramite ApplyImpulse(), ApplyImpulseAtPosition() o ApplyAngularImpulse().
Qualsiasi modifica relativa alla fisica sulle Workspace che influenzerebbe l'assemblaggio, incluso:
Viene creato un nuovo Constraint con un Attachment che è parentato a un BasePart all'interno dell'assemblaggio.
Qualsiasi modifica di proprietà per un Constraint con un Attachment che è parentato a un BasePart all'interno dell'assemblaggio.
La proprietà CurrentAngle cambia per un Motor che è collegato a un BasePart all'interno dell'assemblaggio.
L'assemblaggio contiene un VehicleSeat con un personaggio giocatore seduto.
L'assemblaggio si trova all'interno del BlastRadius di un Explosion.
Visualizzazione del debug
Durante il playtesting, puoi visualizzare gli stati di sonno degli assemblaggi attivando le Parti sveglie dal widget delle Opzioni di Visualizzazione situato nell'angolo in alto a destra del viewport 3D.

Una volta abilitato, le parti simulate saranno delineate dallo stato attuale di sonno, con le parti sveglie delineate in rosso, le parti in-controllo-del-sonno delineate in arancione e le parti dormienti non delineate.