Roblox 엔진의 각 조립체는 단일 강체에 해당합니다. 각 강체의 위치와 속도는 해당 강체가 위치한 곳과 이동 속도를 설명하며, 엔진의 주요 작업 중 하나는 각 조립체의 위치와 속도를 업데이트하는 것입니다.
조립체는 기계적 제약 조건과 이동 제약 조건으로 연결하여 자동차나 비행기와 같은 메커니즘을 형성할 수 있습니다. 메커니즘의 조립체와 제약 조건의 수가 증가하면, 메커니즘을 시뮬레이션하는 데 필요한 시간도 증가합니다. 다행히, 수면 시스템은 엔진이 움직이지 않는 조립체의 시뮬레이션을 건너뛰어도 된다고 판단할 때 이 증가를 상쇄합니다.
수면 상태
각 조립체는 깨움, 잠자는 중, 또는 수면 검사 중 중 하나의 세 상태 중 하나에 있을 수 있습니다.
깨움
깨워진 조립체는 움직이거나 가속하고 있으므로 시뮬레이션됩니다. 조립체는 잠자는 중 및 수면 검사 중 상황에서 이 상태로 진입하며, 추가 깨움 상황에서도 진입할 수 있습니다.
잠자는 중
잠자는 중인 조립체는 움직이거나 가속하지 않으므로 시뮬레이션되지 않습니다.
조립체가 움직이지 않는 것으로 판단되기 위해서는 선형 속도와 회전 속도를 확인합니다. 선형 속도가 선형 속도 임계값보다 작고 회전 속도가 회전 속도 임계값보다 작으면 그 조립체는 움직이지 않는 것으로 간주됩니다.
어떤 경우에는 단순히 움직이지 않는지 확인하는 것만으로 조립체가 잘못하여 잠자는 상태로 들어가는 경우가 있을 수 있습니다. 예를 들어, 공이 직선으로 위로 던져질 때 최대 높이에 도달하면 속도가 0에 가까워져 잠자는 후보가 되어 다시 떨어지지 않게 됩니다. 이러한 경우를 처리하기 위해 엔진은 조립체의 선형 가속도나 회전 가속도가 각각 선형 가속도와 회전 가속도 임계값보다 크면 조립체가 가속중으로 간주하며, 조립체가 잠들지 않도록 합니다.
수면 검사 중
움직이지 않는 조립체가 최소한 하나의 깨워진 이웃 조립체와 제약 조건을 공유하고 있는 경우 수면 검사 중 상태로 들어가며 시뮬레이션되지 않습니다. 각 월드 스텝에서 수면 검사 중인 조립체는 다음을 확인합니다:
- 자신의 선형 가속도가 깨움 선형 가속도 임계값보다 큽니다.
- 자신의 회전 가속도가 깨움 회전 가속도 임계값보다 큽니다.
- 이웃 조립체의 선형 속도가 이웃 선형 속도 임계값보다 큽니다.
- 이웃 조립체의 회전 속도가 이웃 회전 속도 임계값보다 큽니다.
이 조건 중 하나라도 참이면, 또는 추가 깨움 상황 중 하나에 해당하면, 수면 검사 중인 조립체는 깨움 상태로 진입합니다.
임계값 참조
다음 표는 조립체가 움직이거나 가속하는지 판단하는 데 사용되는 다양한 속도 및 가속 임계값을 제공합니다.
| 임계값 | 값 | 상태 변화 |
|---|---|---|
| 선형 속도 | 0.33 스터드/초 | 깨움 ⟩ 잠자는 중 |
| 회전 속도 | 0.42 스터드/초 | 깨움 ⟩ 잠자는 중 |
| 선형 가속도 | 0.24 스터드/초² | 깨움 ⟩ 잠자는 중 |
| 회전 가속도 | 0.24 스터드/초² | 깨움 ⟩ 잠자는 중 |
| 이웃 선형 속도 | 0.48 스터드/초 | 수면 검사 중 ⟩ 깨움 |
| 이웃 회전 속도 | 0.59 스터드/초 | 수면 검사 중 ⟩ 깨움 |
| 깨움 선형 가속도 | 16.9 스터드/초² | 깨움 ⟩ 잠자는 중 |
| 깨움 회전 가속도 | 16.9 스터드/초² | 깨움 ⟩ 잠자는 중 |
회전 속도와 가속도 임계값은 조립체 경계 구(조립체의 모든 부분을 포함하는 구) 위에 위치한 점의 속도와 가속도를 반영하며, 해당 점은 조립체와 함께 강직하게 이동합니다.
구동 조인트
때때로 개발자는 구동 조인트를 사용하여 매우 느리게 부품을 움직이고 싶어합니다. 구동 조인트는 연결된 부품에 힘이나 운동을 적용하여 구동하는 제약 조건으로, HingeConstraint가 Motor를 사용하는 경우와 같습니다. 이러한 시나리오를 지원하기 위해, 구동 조인트에 연결된 조립체는 더 엄격한 수면 속도 임계값을 사용하여 느리게 움직이는 경우에도 물리 시스템이 조립체를 조기에 잠들지 않도록 합니다.
다음은 구동 조인트로 간주되는 것들입니다:
추가 깨움 상황
수면 검사 중 및 잠자는 중에 설명된 상황 외에도, 조립체는 다음 조건에서 깨움 상태로 진입합니다:
1 스터드/초보다 빨리 움직이는 다른 조립체와 충돌합니다.
조립체 내의 모든 BasePart의 물리 관련 속성이 변경됩니다. 여기에는 다음이 포함됩니다:
BasePart 내의 어떤 개체에도 비제로 임펄스가 적용됩니다, ApplyImpulse(), ApplyImpulseAtPosition(), 또는 ApplyAngularImpulse()를 통해.
조립체에 영향을 줄 수 있는 Workspace에서 물리 관련 속성이 변경됩니다. 여기에는 다음이 포함됩니다:
조립체 내의 BasePart에 연결된 Attachment와 함께 새로운 Constraint가 생성됩니다.
조립체 내의 BasePart에 연결된 Attachment가 있는 Constraint의 모든 속성 변경됩니다.
조립체 내의 BasePart에 연결된 Motor의 CurrentAngle 속성이 변경됩니다.
조립체에는 플레이어 캐릭터가 앉아 있는 VehicleSeat가 포함되어 있습니다.
조립체는 BlastRadius 내에 있습니다.
디버그 시각화
플레이 테스트 중에 조립체의 수면 상태를 시각화하려면 3D 뷰포트의 오른쪽 상단에 있는 시각화 옵션 위젯에서 깨워진 부품을 활성화합니다.

활성화되면, 시뮬레이션된 부품은 현재 수면 상태에 따라 윤곽이 표시되며, 깨워진 부품은 빨간색으로, 수면 검사 중 부품은 주황색으로, 잠자는 중 부품은 윤곽 표시가 없습니다.