Chaque assemblage dans le moteur Roblox correspond à un corps rigide unique. La position et la vitesse de chaque corps rigide décrivent où il est situé et à quelle vitesse il se déplace, et l'une des tâches principales du moteur est de mettre à jour les positions et les vitesses de chaque assemblage.
Les assemblages peuvent être connectés ensemble par des contraintes mécaniques et des contraintes de déplacement pour former des mécanismes tels que des voitures ou des avions. À mesure que le nombre d’assemblages et de contraintes dans un mécanisme augmente, le temps nécessaire pour simuler le mécanisme augmente également. Heureusement, cette augmentation est compensée lorsque le système de sommeil détermine que le moteur peut ignorer la simulation des assemblages non mobiles.
États de sommeil
Chaque assemblage peut être dans l'un des trois états : éveillé, endormi ou vérification du sommeil.
Éveillé
Un assemblage éveillé est en mouvement ou en accélération, et est donc simulé. Les assemblages entrent dans cet état à partir des situations décrites dans endormi et vérification du sommeil, ainsi que dans des situations d'éveil supplémentaires.
Endormi
Un assemblage endormi n'est ni en mouvement ni en accélération, et n'est donc pas simulé.
Un assemblage est déterminé comme non-mouvant en vérifiant sa vitesse linéaire et sa vitesse angulaire. Si sa vitesse linéaire est inférieure au seuil de vitesse linéaire et sa vitesse angulaire est inférieure au seuil de vitesse angulaire, l’assemblage est considéré comme non-mouvant.
Dans certains cas, vérifier simplement l'absence de mouvement ferait qu'un assemblage entrerait incorrectement dans l'état endormi. Par exemple, si une balle est lancée directement vers le haut, sa vitesse approche zéro lorsqu'elle atteint sa hauteur maximale, ce qui en fait un candidat potentiel pour s'endormir et ne jamais retomber. Pour gérer de tels cas, le moteur considère qu'un assemblage est en accélération si son accélération linéaire ou accélération angulaire sont supérieures aux seuils de vitesse d'accélération linéaire et accélération angulaire, respectivement, et empêchera l’assemblage de s'endormir.
Vérification du sommeil
Un assemblage non-mouvant qui partage une contrainte avec au moins un assemblage éveillé est mis dans l'état de vérification du sommeil et n'est pas simulé. À chaque étape de monde, un assemblage en vérification du sommeil vérifie si :
- Son accélération linéaire est supérieure au seuil de wake linear acceleration.
- Son accélération angulaire est supérieure au seuil de wake rotational acceleration.
- La vitesse linéaire d'un assemblage voisin est supérieure au seuil de neighbor linear velocity.
- La vitesse angulaire d'un assemblage voisin est supérieure au seuil de neighbor rotational velocity.
Si l'une de ces conditions est vraie, ou sous l'une des situations d'éveil supplémentaires, l’assemblage en vérification du sommeil entre dans l'état éveillé.
Référence de seuil
Le tableau suivant fournit les divers seuils de vitesse et d'accélération utilisés pour déterminer si un assemblage est en mouvement ou en accélération.
| Seuil | Valeur | Changement d'état |
|---|---|---|
| Vitesse Linéaire | 0.33 studs/s | éveillé ⟩ endormi |
| Vitesse Angulaire | 0.42 studs/s | éveillé ⟩ endormi |
| Accélération Linéaire | 0.24 studs/s² | éveillé ⟩ endormi |
| Accélération Angulaire | 0.24 studs/s² | éveillé ⟩ endormi |
| Vitesse Linéaire Voisin | 0.48 studs/s | vérification du sommeil ⟩ éveillé |
| Vitesse Angulaire Voisin | 0.59 studs/s | vérification du sommeil ⟩ éveillé |
| Accélération Linéaire d’Éveil | 16.9 studs/s² | éveillé ⟩ endormi |
| Accélération Angulaire d’Éveil | 16.9 studs/s² | éveillé ⟩ endormi |
Les seuils de vitesse et d'accélération angulaires reflètent la vitesse et l'accélération d'un point situé sur la sphère englobante de l'assemblage (une sphère qui contient toutes les parties d'un assemblage) qui se déplace rigoureusement avec l’assemblage.
Joints actionnés
Parfois, les développeurs souhaitent déplacer des parties très lentement à l'aide d'un joint actionné, une contrainte qui applique une force ou un mouvement pour déplacer des parties connectées, comme un HingeConstraint utilisant un Motor. Pour soutenir ces scénarios, les assemblages connectés à des joints actionnés utilisent un seuil de vitesse de sommeil plus strict. Cela retarde le moment où ces assemblages s’endorment, permettant un mouvement lent et contrôlé sans que le système physique les mette prématurément à l'endormissement.
Les éléments suivants sont considérés comme des joints actionnés :
| Contrainte | Configuration | Propriétés non nulles requises |
|---|---|---|
| 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 |
Situations d'éveil supplémentaires
En plus des situations décrites dans vérification du sommeil et endormi, un assemblage entre dans l'état éveillé lorsqu’il :
Entre en collision avec un autre assemblage se déplaçant plus vite que 1 studs/s.
Toute propriété liée à la physique d'une BasePart dans l'assemblage change, y compris :
Une impulsion non nulle est appliquée à une BasePart dans l'assemblage via ApplyImpulse(), ApplyImpulseAtPosition(), ou ApplyAngularImpulse().
Des changements sur des propriétés liées à la physique dans le Workspace affectant l'assemblage, y compris :
Un nouveau Constraint est créé avec une Attachment parentée à une BasePart dans l'assemblage.
Tous les changements de propriétés pour une Constraint avec une Attachment parentée à une BasePart dans l'assemblage.
La propriété CurrentAngle change pour un Motor connecté à une BasePart dans l'assemblage.
L'assemblage contient un VehicleSeat avec un personnage joueur assis.
L'assemblage se trouve dans le BlastRadius d'une Explosion.
Visualisation de débogage
Pendant les tests de jeu, vous pouvez visualiser les états de sommeil des assemblages en activant les Pièces éveillées depuis le widget des Options de Visualisation dans le coin supérieur droit de la vue 3D.

Une fois activé, les pièces simulées seront délimitées par leur état de sommeil actuel, les pièces éveillées étant délimitées en rouge, les pièces en vérification de sommeil en orange, et les pièces endormies sans délimitation.