Lesson 10 — Friction, Resting & Stacking
Ba phòng thí nghiệm tương tác cho phần khó nhất của physics engine: ma sát tiếp tuyến, tiếp xúc nghỉ, hiệu chỉnh vị trí, xếp chồng ổn định và sleeping. Mỗi sim chạy realtime — kéo slider để thấy hệ vỡ hoặc đứng yên.
1. Xếp chồng & số iteration giải/frame
Chồng nhiều hộp. Slider chọn số iteration giải tiếp xúc mỗi frame. Ít iteration → sai số dồn xuống đáy, tháp rung rồi sụp. Nhiều iteration → hội tụ, tháp đứng yên.
Thử Iterations = 1 với 6+ hộp → quan sát tháp lảo đảo. Tăng dần lên 8–10 → tháp đứng vững (Box2D mặc định 8). Đây là sequential impulse.
2. Ma sát trên dốc — định luật Coulomb
Một khối trên mặt nghiêng. Trọng lực có thành phần kéo trượt dọc dốc và thành phần
ép xuống (pháp tuyến). Khối đứng yên chừng nào lực ma sát tĩnh tối đa μ·N còn ≥ lực kéo trượt.
Ranh giới trượt: khối đứng yên khi μ ≥ tan(θ). Vd θ=25° → tan≈0.466 →
cần μ ≥ 0.47. Hạ μ dưới ngưỡng → khối bắt đầu trượt (động lực Coulomb hãm bớt nhưng không giữ nổi).
3. Positional correction & sleeping
Trọng lực mỗi frame đẩy hộp lún vào sàn. Tắt correction → hộp chìm xuyên sàn.
Bật → correction (slop + percent) đẩy lên, hộp đứng đúng mặt sàn rồi ngủ. Đẩy percent lên 1.0 với slop 0 → jitter do over-correction.
Thử: tắt correction → hộp tụt dần qua sàn (lún tăng mãi). Bật, percent=0.2 slop=0.01 → đứng yên rồi 💤. Đặt percent=1.0, slop=0 → hộp rung "nhảy disco" quanh sàn (over-correction).
4. Tham số tham khảo (kiểu Box2D)
| Tham số | Giá trị điển hình | Vai trò |
|---|---|---|
| velocity iterations | 8 | số lượt giải vận tốc (impulse) / frame |
| position iterations | 3 | số lượt giải vị trí (correction) / frame |
| linear slop | 0.005 m | cho phép lún nhỏ, chống jitter quanh 0 |
| baumgarte (percent) | 0.2 | tỉ lệ sửa lún mỗi frame |
| μ (gỗ/bê tông) | 0.4 – 0.6 | hệ số ma sát Coulomb |
| sleep |v| threshold | ≈ 0.05 m/s | dưới ngưỡng đủ lâu → ngủ |
| time to sleep | 0.5 s | thời gian bất động trước khi ngủ |