Setiap rangkaian dalam Roblox Engine mendapat pasangan dari satu badan kaku. Posisi dan kecepatan setiap badan kaku menggambarkan di mana ia berada dan seberapa cepat ia bergerak, dan salah satu tugas utama mesin adalah memperbarui posisi dan kecepatan setiap rangkaian.
Rangkaian dapat dihubungkan satu sama lain dengan konstraint mekanik dan konstraint penggerak untuk membentuk mekanisme seperti mobil atau pesawat. Seiring dengan meningkatnya jumlah rangkaian dan konstraint dalam suatu mekanisme, waktu yang dibutuhkan untuk mensimulasikan mekanisme juga meningkat. Untungnya, peningkatan ini diimbangi ketika sistem tidur menentukan bahwa mesin dapat melewatkan simulasi rangkaian yang tidak bergerak.
Status Tidur
Setiap rangkaian dapat berada dalam salah satu dari tiga status: terbangun, tidur, atau memeriksa-tidur.
Terbangun
Rangkaian yang terbangun sedang bergerak atau mempercepat, dan oleh karena itu disimulasi. Rangkaian memasuki status ini dari situasi yang dijelaskan dalam tidur dan memeriksa-tidur, serta situasi bangun tambahan.
Tidur
Rangkaian yang tidur tidak bergerak maupun mempercepat, dan oleh karena itu tidak disimulasi.
Suatu rangkaian dianggap tidak bergerak dengan memeriksa kecepatan linier dan kecepatan rotasinya. Jika kecepatan liniernya kurang dari ambang batas Kecepatan Linier dan kecepatan rotasinya kurang dari ambang batas Kecepatan Rotasi, rangkaian dianggap tidak bergerak.
Dalam beberapa kasus, cukup memeriksa non-gerakan dapat menyebabkan rangkaian secara salah memasuki status tidur. Misalnya, jika bola dilempar vertikal ke atas, kecepatannya mendekati nol saat mencapai ketinggian maksimum, menjadikannya kandidat untuk tidur dan tidak pernah jatuh kembali. Untuk menangani kasus seperti ini, mesin menganggap rangkaian sedang mempercepat jika percepatan linier atau percepatan rotasi lebih besar dari ambang batas Percepatan Linier dan Percepatan Rotasi, masing-masing, dan akan mencegah rangkaian dari tidur.
Memeriksa-tidur
Rangkaian yang tidak bergerak dan berbagi suatu konstraint dengan setidaknya satu rangkaian terbangun tetangga dipindahkan ke status memeriksa-tidur dan tidak disimulasi. Pada setiap langkah dunia, rangkaian yang memeriksa-tidur memeriksa apakah:
- percepatan liniernya lebih besar dari ambang batas Bangun Percepatan Linier.
- percepatan rotasinya lebih besar dari ambang batas Bangun Percepatan Rotasi.
- kecepatan linier rangkaian tetangga lebih besar dari ambang batas Kecepatan Linier Tetangga.
- kecepatan rotasi rangkaian tetangga lebih besar dari ambang batas Kecepatan Rotasi Tetangga.
Jika salah satu dari kondisi ini benar, atau dalam salah satu dari situasi bangun tambahan, rangkaian yang memeriksa-tidur memasuki status terbangun.
Referensi ambang batas
Tabel berikut menyediakan berbagai ambang kecepatan dan percepatan yang digunakan untuk menentukan apakah suatu rangkaian sedang bergerak atau mempercepat.
| Ambang Batas | Nilai | Perubahan status |
|---|---|---|
| Kecepatan Linier | 0.33 studs/s | terbangun ⟩ tidur |
| Kecepatan Rotasi | 0.42 studs/s | terbangun ⟩ tidur |
| Percepatan Linier | 0.24 studs/s² | terbangun ⟩ tidur |
| Percepatan Rotasi | 0.24 studs/s² | terbangun ⟩ tidur |
| Kecepatan Linier Tetangga | 0.48 studs/s | memeriksa-tidur ⟩ terbangun |
| Kecepatan Rotasi Tetangga | 0.59 studs/s | memeriksa-tidur ⟩ terbangun |
| Bangun Percepatan Linier | 16.9 studs/s² | terbangun ⟩ tidur |
| Bangun Percepatan Rotasi | 16.9 studs/s² | terbangun ⟩ tidur |
Ambang tingkat kecepatan dan percepatan rotasi mencerminkan kecepatan dan percepatan dari titik yang terletak pada bola pembatas rangkaian (sebuah bola yang mencakup semua bagian dalam sebuah rangkaian) yang bergerak kokoh dengan rangkaian tersebut.
Sendi yang Digerakkan
Kadang-kadang pengembang ingin menggerakkan bagian-bagian dengan sangat lambat menggunakan sendi yang digerakkan, suatu konstraint yang menerapkan gaya atau gerakan untuk menggerakkan bagian-bagian yang terhubung, seperti HingeConstraint menggunakan Motor. Untuk mendukung skenario ini, rangkaian yang terhubung ke sendi yang digerakkan menggunakan ambang kecepatan tidur yang lebih ketat. Ini menunda ketika rangkaian tersebut masuk tidur, memungkinkan gerakan lambat yang terkontrol tanpa sistem fisika yang terlalu cepat menidurkan mereka.
Berikut ini yang dianggap sebagai sendi yang digerakkan:
| Konstraint | Konfigurasi | Properti non-nol yang diperlukan |
|---|---|---|
| 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 |
Situasi bangun tambahan
Selain situasi yang dijelaskan dalam memeriksa-tidur dan tidur, suatu rangkaian memasuki status terbangun ketika:
Ia bertabrakan dengan rangkaian lain yang bergerak lebih cepat dari 1 studs/s.
Properti terkait fisika dari setiap BasePart dalam rangkaian berubah, termasuk:
Sebuah impuls non-nol diterapkan pada setiap BasePart dalam rangkaian melalui ApplyImpulse(), ApplyImpulseAtPosition(), atau ApplyAngularImpulse().
Setiap perubahan properti terkait fisika di Workspace yang akan mempengaruhi rangkaian, termasuk:
Sebuah Constraint baru dibuat dengan sebuah Attachment yang diparent pada sebuah BasePart dalam rangkaian.
Setiap perubahan properti untuk sebuah Constraint dengan sebuah Attachment yang diparent pada sebuah BasePart dalam rangkaian.
Properti CurrentAngle berubah untuk sebuah Motor yang terhubung dengan BasePart dalam rangkaian.
Rangkaian tersebut berisi VehicleSeat dengan karakter pemain yang duduk.
Rangkaian tersebut berada dalam BlastRadius dari sebuah Explosion.
Visualisasi debug
Saat pengujian permainan, Anda dapat memvisualisasikan status tidur rangkaian dengan mengaktifkan Bagian Tertidur dari widget Opsi Visualisasi di sudut kanan atas viewport 3D.

Setelah diaktifkan, bagian yang disimulasi akan digarisbawahi oleh status tidur saat ini, dengan bagian terbangun digarisbawahi dengan warna merah, bagian memeriksa-tidur digarisbawahi dengan warna oranye, dan bagian tidur tidak digarisbawahi.