Ogni assemblaggio nel motore Roblox corrisponde a un singolo corpo rigido. La posizione e la velocità di ciascun corpo rigido descrivono dove si trova e quanto velocemente si sta muovendo, e uno dei compiti principali 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 automobili 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 di 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 si sta muovendo o accelerando, ed è quindi simulato. Gli assemblaggi entrano in questo stato da situazioni descritte in dormiente e in controllo del sonno, così come da ulteriori situazioni di risveglio.
Dormiente
Un assemblaggio dormiente non si sta muovendo né accelerando, ed è quindi non simulato.
Un assemblaggio è considerato 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 il non movimento causerebbe l'ingresso errato di un assemblaggio nello stato di dormiente. Ad esempio, se una palla viene lanciata verticalmente, la sua velocità si avvicina a zero quando raggiunge la sua massima altezza, rendendola un candidato per il sonno e mai più in grado di cadere. Per gestire tali casi, il motore considera un assemblaggio in accelerazione se la sua accelerazione lineare o accelerazione rotazionale sono superiori alle soglie 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 è simulato. Ad ogni passo del mondo, un assemblaggio in controllo del sonno verifica se:
- La sua accelerazione lineare è superiore alla soglia di Risveglio Accelerazione Lineare.
- La sua accelerazione rotazionale è superiore alla soglia di Risveglio Accelerazione Rotazionale.
- La velocità lineare di un assemblaggio vicino è superiore alla soglia di Vicino Velocità Lineare.
- La velocità rotazionale di un assemblaggio vicino è superiore alla soglia di Vicino Velocità Rotazionale.
Se una di queste condizioni è vera, o in qualsiasi delle ulteriori situazioni di risveglio, l'assemblaggio in controllo del sonno entra nello stato sveglio.
Riferimento soglia
La seguente tabella fornisce le varie soglie di velocità e accelerazione utilizzate per determinare se un assemblaggio si sta muovendo o accelerando.
| Soglia | Valore | Cambio 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 |
| Vicino Velocità Lineare | 0.48 studs/s | in controllo del sonno ⟩ sveglio |
| Vicino Velocità Rotazionale | 0.59 studs/s | in controllo del sonno ⟩ sveglio |
| Risveglio Accelerazione Lineare | 16.9 studs/s² | sveglio ⟩ dormiente |
| Risveglio Accelerazione Rotazionale | 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 in 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 forza o movimento per guidare 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 prematuramente a dormire.
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ù velocemente di 1 studs/s.
Qualsiasi proprietà relativa alla fisica di qualsiasi BasePart all'interno dell'assemblaggio cambia, inclusi:
Un impulso non nullo viene applicato a qualsiasi BasePart all'interno dell'assemblaggio tramite ApplyImpulse(), ApplyImpulseAtPosition(), o ApplyAngularImpulse().
Qualsiasi cambiamento di proprietà relativa alla fisica sulla Workspace che influenzerebbe l'assemblaggio, inclusi:
Un nuovo Constraint viene creato con un Attachment che è parentato a un BasePart all'interno dell'assemblaggio.
Qualsiasi cambiamento 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 è all'interno del BlastRadius di un Explosion.
Visualizzazione di debug
Durante il playtesting, puoi visualizzare gli stati di sonno degli assemblaggi attivando le Parti Sveglie dal widget Opzioni di Visualizzazione nell'angolo in alto a destra della vista 3D.

Una volta abilitato, le parti simulate saranno contornate dal loro stato di sonno attuale, con le parti sveglie contornate in rosso, le parti in controllo del sonno contornate in arancione e le parti dormienti non contornate.