Lập trình phương tiện trong game
(wassimulator.com)- Việc triển khai phương tiện trong game ưu tiên trải nghiệm người chơi hơn là tái hiện chính xác động cơ vật lý thực
- Mỗi game đua xe và mô phỏng đều có sự khác biệt về cách điều khiển xe và mức độ nhập vai
- Mô phỏng phương tiện gồm ba thành phần chính: động cơ/hộp số, lốp xe, khung gầm
- Mô hình hóa lốp xe và khái niệm slip là chìa khóa để tạo ra cảm giác lái chân thực
- Nhà phát triển cần tự xác định mức độ đơn giản hóa và trừu tượng hóa phù hợp với concept của game
Vì sao phương tiện lại đặc biệt trong game
Phương tiện trong game được dùng như một yếu tố trải nghiệm quan trọng ở nhiều thể loại khác nhau
Cả kiểu điều khiển phi thực tế lẫn mô phỏng lái xe chân thực đều truyền tải được “cảm giác đang lái”
Ví dụ, Mario Kart và Assetto Corsa hướng tới những trải nghiệm hoàn toàn khác nhau, nhưng bản chất của lập trình phương tiện thì vẫn giống nhau
Thay vì cố tái hiện chính xác các định luật vật lý ngoài đời thực, trọng tâm là truyền đạt cảm giác lái mà người dùng mong đợi
Mục tiêu của nhà phát triển không phải là “mô phỏng chính xác” mà là thiết kế trải nghiệm đã được chủ đích
Những thử nghiệm ban đầu và bài học: AV Racer
Ở giai đoạn đầu phát triển AV Racer, xe được vận hành bằng mô hình cơ học Newton đơn giản, nhưng không tạo ra được cảm giác như xe thật
Việc hard-code các yếu tố như quay đầu, drift, vận tốc góc và tinh chỉnh tham số đã được lặp đi lặp lại
Dù có thể tạo ra cảm giác “trượt” theo hướng trải nghiệm, nó vẫn không đáp ứng được các tình huống cực đoan hay kỳ vọng của người lái thực tế
Nếu thiếu hiểu biết về vật lý xe thực và trải nghiệm của người lái, sớm muộn cũng sẽ chạm tới giới hạn căn bản
Cuối cùng, để triển khai bài bản, tác giả đã phải nghiên cứu các nguyên lý động lực học phương tiện trong thế giới thực
Cấu trúc của mô phỏng phương tiện dùng trong game
Phương tiện trong game có thể được chia thành ba thành phần khái niệm: động cơ (và hộp số), bánh/lốp xe, khung gầm
Động cơ (bao gồm hộp số)
- Nhận các đầu vào như ga, sang số
- Tính ra mô-men xoắn và RPM, rồi chuyển đổi theo tỷ số truyền
- Tương tác phản hồi với bánh xe (tức là đồng bộ hai chiều giữa động cơ và bánh xe)
Lốp xe (bao gồm bánh xe)
- Nhận nhiều loại đầu vào như mô-men từ động cơ, phanh, lái, tải trọng, ma sát mặt đường
- Mọi lực đều phát sinh tại điểm tiếp xúc giữa lốp và mặt đường
- Dùng mô hình lốp (ví dụ: Pacejka Magic Formula) để tái hiện lực một cách chân thực
Khung gầm
- Đóng vai trò rigid body trong động cơ vật lý
- Phản ứng với các tác động bên ngoài như lực từ lốp, lực cản không khí, trọng lực, va chạm
- Quyết định chuyển động tổng thể của xe và ảnh hưởng đến biến thiên tải trọng lên lốp
| Thành phần | Đầu vào chính | Đầu ra chính |
|---|---|---|
| Động cơ/hộp số | Ga, đầu vào hộp số, tốc độ bánh xe | Mô-men quay, RPM |
| Lốp xe | Mô-men động cơ, phanh, lái, tải trọng, ma sát | Lực tác dụng lên khung gầm, đồng bộ động cơ-bánh xe |
| Khung gầm | Lực từ lốp, kết quả khí động học | Tải trọng bánh xe, chuyển động tổng thể |
Việc tái hiện chính xác 100% mọi chi tiết vật lý như xe thật là không thực tế
Trừ khi bạn là phòng nghiên cứu của một hãng xe thực thụ, phần lớn game và mô phỏng sẽ dùng các mô hình hộp đen, công thức và cách tiếp cận đã được đơn giản hóa
Vì vậy, điều cốt lõi là nhà thiết kế phải quyết định nên lược bỏ gì và nhấn mạnh điều gì
Thiết kế động cơ và hệ truyền động
Động cơ (trung tâm tạo mô-men)
- Ngoài đời thực thì rất phức tạp, nhưng trong code có thể được xây dựng như một mô hình hộp đen đơn giản: đầu vào (RPM, ga) → đầu ra mô-men xoắn
- Đường cong mô-men/công suất có thể được tham số hóa bằng số liệu hoặc đồ thị để mô phỏng nhiều kiểu động cơ khác nhau
- Ví dụ: có thể tự thiết kế đường cong bằng Desmos để điều chỉnh “tính cách của động cơ”
Hộp số
- Có thể triển khai đơn giản bằng bảng tỷ số truyền
- Việc sang số quyết định đặc tính tăng tốc, tốc độ tối đa, v.v. của xe
- Đơn giản nhưng ảnh hưởng rất lớn đến trải nghiệm chơi
| Số | Tỷ lệ |
|---|---|
| R | -2.92 |
| N | 0 |
| 1 | 2.50 |
| 2 | 1.61 |
| 3 | 1.10 |
| 4 | 0.81 |
| 5 | 0.68 |
Đồng bộ RPM động cơ và RPM bánh xe
- RPM động cơ và vận tốc góc của bánh dẫn động liên kết với nhau
- Có thể tính toán số bằng phương trình vi phân dựa trên chênh lệch giữa hai biến trạng thái này
- Triển khai theo kiểu “đuổi tới giá trị mục tiêu”, để chúng dần khớp nhau qua từng frame
Nhờ đó có thể mở rộng theo cả hướng arcade lẫn simulator
Khi người chơi điều chỉnh các tham số động cơ (ví dụ: profile cam, turbo, v.v.), có thể liên kết chúng với thay đổi về âm thanh hoặc đường cong công suất
Ngay cả khi không mô phỏng chuyển động nội tại của động cơ y như ngoài đời thực, vẫn có thể truyền tải mối quan hệ nguyên nhân-kết quả rõ ràng và tăng cường trải nghiệm tương tác
Mô hình lốp xe
Vai trò của lốp xe
- Là phần duy nhất của xe tiếp xúc trực tiếp với mặt đường thực tế
- Mọi lực như tăng tốc, phanh, vào cua đều được tạo ra tại vùng tiếp xúc của lốp
- Lực được sinh ra chủ yếu từ biến dạng đàn hồi và đặc tính ma sát
Lực dọc (tăng tốc/phanh) & tỷ lệ trượt (Slip Ratio)
- Lốp cung cấp độ bám tối đa ở trạng thái ma sát tĩnh, và khi vượt ngưỡng sẽ chuyển sang ma sát động (trượt)
- Tỷ lệ trượt được tính từ chênh lệch giữa tốc độ quay bánh xe (khi dẫn động/phanh) và tốc độ di chuyển trên mặt đất
- Tỷ lệ trượt = (vận tốc góc bánh xe - vận tốc góc quay tự do) / vận tốc góc quay tự do
- Nói chung, khi tăng tốc bánh xe quay nhanh hơn mặt đất, còn khi phanh thì quay chậm hơn, từ đó phát sinh slip
- Sự thay đổi lực bám theo tỷ lệ trượt có thể được biểu diễn bằng đồ thị đường cong
- Lực bám thường tăng tới một khoảng nhất định, đạt cực đại rồi giảm mạnh sau điểm đỉnh
Công thức tính lực có xét tỷ lệ trượt (Pacejka Magic Formula, v.v.)
- Dùng tỷ lệ trượt làm đầu vào cho công thức sinh ra đường cong phức tạp (tham số hóa bằng sin/arctangent)
- Cần tính riêng cho từng lốp
Lực ngang (vào cua) & góc trượt (Slip Angle)
- Khi vào cua, vùng tiếp xúc bị biến dạng và sinh ra góc trượt
- Góc trượt = độ chênh góc giữa hướng chuyển động thực của lốp và hướng mà bánh xe đang chỉ tới
- Khi góc trượt tăng lên, lực bám cũng tăng dần, nhưng vượt quá giới hạn thì lốp sẽ trượt
- Quan hệ giữa góc trượt và lực bám cũng tạo thành một đường cong đặc trưng
- Nhiều tham số như tải trọng, ma sát, biến thiên động lực học, v.v. đều có ảnh hưởng
Các hiện tượng như understeer/oversteer
- Understeer: khi góc trượt của bánh trước lớn hơn bánh sau, xe quay ít hơn mong muốn
- Oversteer: khi góc trượt của bánh sau lớn hơn, phần đuôi xe trượt văng ra ngoài
- Chỉ cần có mô hình lốp phù hợp, những đặc tính điều khiển này sẽ xuất hiện một cách tự nhiên
Giới hạn tương hỗ giữa lực dọc/lực ngang (Friction Circle)
- Khi lốp dùng lực theo đồng thời hai hướng là tăng tốc/phanh và vào cua, mức tối đa ở mỗi hướng sẽ ảnh hưởng lẫn nhau
- Vòng tròn ma sát (circle/ellipse): tổng của hai vector lực không được vượt quá giới hạn
- (F_{x}^2 + F_{y}^2 \le (\mu F_{z})^2)
- Ví dụ: khi vừa phanh gấp vừa đánh lái gấp thì rất dễ mất kiểm soát
- Lốp ngoài đời thực có đặc tính cong/phi tuyến, nên cần hiệu chỉnh tham số theo dữ liệu thực tế
Triển khai trong code
- Tính riêng lực dọc/lực ngang ở từng lốp
- Gộp hai vector lại rồi chuẩn hóa (scaling) chúng vào trong một vòng tròn ma sát giả định
- Nếu điều chỉnh tham số một cách động, có thể dễ dàng thử nghiệm cả những thay đổi handling ở mức cao
Tích hợp vào toàn bộ động cơ vật lý của xe
- Tổng hợp vào khung gầm lực từ lốp + đầu ra của hệ treo + các tác động bên ngoài (trọng lực, drag, v.v.)
- Cập nhật gia tốc/vận tốc theo từng frame dựa trên các định luật chuyển động của Newton
Các yếu tố bổ sung có thể mở rộng
- Hình học hệ treo: camber, caster, v.v.
- Động lực học lốp nâng cao: nhiệt độ, độ mòn, độ phồng, thay đổi tải trọng, v.v.
- Khí động học: downforce, drag, cánh gió tự điều chỉnh
- Hệ truyền động/vi sai, ABS, ESP, giới hạn lái v.v.
- Khi cần có thể tham khảo nhiều sách như Race Car Vehicle Dynamics(Milliken), Mechanics of Pneumatic Tires(S.K. Clark)
Kết luận
Chỉ với các mô hình trên thôi cũng đã có thể xây dựng nền tảng cho một phương tiện trong game vận hành tương tự xe thực
Các chi tiết bổ sung có thể được mở rộng tùy theo mục tiêu phát triển và nhu cầu
Điểm cốt lõi là triết lý thiết kế lấy trải nghiệm chơi làm trung tâm, cùng với việc đơn giản hóa/trừu tượng hóa các nguyên lý cơ bản rút ra từ thực tế
Nếu có câu hỏi, ý kiến hay đề xuất chỉnh sửa, xin hãy liên hệ
2 bình luận
Tôi lại đọc nhầm thành 'lập trình phương tiện trên phương tiện', rồi nghĩ kiểu này có hơi nguy hiểm không nhỉ?
Ý kiến trên Hacker News
Điều thú vị tôi muốn nói là dù ngoài đời động cơ có nhiều bộ phận chuyển động nhất, trong code nó lại là phần đơn giản nhất của toàn bộ mô phỏng ô tô. Vì vai trò cốt lõi của động cơ thực chất là một bộ tính mô-men xoắn. Nó giống như một hộp đen nhận nhiều đầu vào và chỉ tạo ra một đầu ra là mô-men quay. Tôi rất muốn giới thiệu loạt video mô phỏng động cơ của AngeTheGreat. Thật sự ấn tượng khi thấy nó được tối ưu tốt đến mức chạy được theo thời gian thực, thậm chí còn tạo ra âm thanh động cơ rất giống thật. Xem video mô phỏng động cơ của AngeTheGreat
Game Automation có phần dựng/mô phỏng động cơ được triển khai rất sâu. Thử nghiệm đủ kiểu động cơ trong đó thực sự rất vui, và phần mô phỏng âm thanh cũng vay mượn một phần các khái niệm được đề cập trong video của AngeTheGreat
Điều này làm tôi nhớ đến ví dụ kinh điển về animate một khối lập phương trong Houdini. Có cái thú rất riêng khi những điều bất ngờ xảy ra trong mô phỏng động cơ đốt trong thời gian thực. Ví dụ animate khối lập phương trong Houdini
Lý do tôi bắt đầu học lập trình là vì cha tôi từng viết một trình mô phỏng động cơ bằng BASIC. Ông là kỹ sư cơ khí và muốn so sánh các đường cong mô-men xoắn của nhiều thiết kế động cơ khác nhau. Khi ông dùng các lệnh CIRCLE và LINE để vẽ wireframe của piston, cụm trục khuỷu và trục khuỷu chuyển động ở tốc độ dưới 1 giây mỗi khung hình, việc thấy máy tính có thể vẽ và làm chuyển động thứ gì đó đã gây sốc cho tôi. Thật ấn tượng khi biết người này đã làm điều tương tự để tạo ra âm thanh xe đua tốt hơn
Chẳng phải mô-tơ EV thực ra đơn giản hơn rất nhiều sao? Động cơ thì đắt đỏ và phức tạp vì nó dùng các vụ nổ nhỏ để tạo ra mô-men xoắn. Nên tôi tự hỏi có phải phần lớn ô tô trong game thực ra chuyển động giống EV không, trừ khi bạn mô phỏng ICE chính xác hơn
Tôi từng phụ trách toàn bộ mô phỏng xe cộ trong Army of Two. Bài này là một tài liệu nhập môn tốt. Việc áp dụng mô hình lốp Pacejka và vi sai trong hộp số đã giúp ích rất nhiều. Ngoài ra, điều khá bất ngờ là mô phỏng vật lý thanh chống lật và hệ thống treo cực kỳ quan trọng để tạo ra cảm giác lái “vui”. Thiếu chúng thì cảm giác chạy sẽ trơn tuột và khó nhập tâm. Tôi cũng thấy cảm giác đó trong video demo. Nếu không triển khai thanh chống lật và hệ thống treo, xe sẽ rất dễ lật, khiến bạn cứ phải loay hoay chỉnh độ trượt lốp hay ma sát bề mặt, nhưng trải nghiệm lái lại còn tệ hơn
Cảm ơn thông tin này rất nhiều! Tôi không biết thanh chống lật lại quan trọng đến vậy trong một mô hình cơ bản. Tôi định tìm hiểu thêm về phần này, và nếu triển khai tốt sẽ cập nhật vào bài viết
Gần đây xe của tôi bị trục trặc ở hệ thống treo nên tôi đã trực tiếp trải nghiệm thế nào là “lái xe không vui”. Càng thấy đồng cảm với nhận xét này hơn
Nội dung này rất giống với điều tôi tự rút ra khi làm game Flightle. Tôi làm một game mô phỏng bay cuộn ngang cho di động, nhưng chuyển động máy bay quá kỳ cục nên trong cơn bực mình tôi kiểu như “cái này thì có gì khó chứ?” và bắt tay tự làm. Trong lúc học về nguyên lý bay, tôi nhận ra mức độ trừu tượng phù hợp là rất quan trọng. Quá phi thực tế thì không vui, nhưng quá chân thực thì rất khó cân bằng gameplay. Liên kết Flightle
Dù giờ đã quá muộn để sửa bình luận, tôi có gom lại phần trải nghiệm chi tiết thành một bài riêng. Mong mọi người xem quá trình làm trình mô phỏng bay cuộn ngang. Nhân tiện, sau này tôi thử đổi máy bay từ một điểm thành cấu trúc hai cánh nối bằng thanh, và đã vất vả kinh khủng để tinh chỉnh cho vui. Chắc người có chuyên môn sẽ làm tốt hơn tôi nhiều
Tôi đã chơi game và thấy rất vui. Nếu là người dùng desktop, có lẽ nên cho phép điều khiển thanh trượt bằng bánh xe cuộn chuột
Trước đây tôi từng làm một game mô phỏng xe và drift cho iOS. Nó dùng SpriteKit, nhưng với engine game 2D thì có thể triển khai khá dễ ở bất kỳ đâu. Ý tưởng cơ bản là nối hai bánh trước vào thân xe hình chữ nhật bằng pin joint, rồi áp lực lên bánh xe. Góc của lực được tính như sau: x = force * cos(bodyRotation + wheelRotation) y = force * sin(bodyRotation + wheelRotation) Rồi tôi thêm cả particle vệt trượt. Phần drift được làm bằng cách điều chỉnh giá trị damping của bánh xe và thân xe. Ứng dụng Drift Mania Infinite Car Racer
Game rất có chất! Tôi thích việc vào chơi gần như ngay lập tức. Particle vệt trượt rất hữu ích. Hình ảnh cũng đẹp. Nhưng với tôi thì độ khó hơi cao. Nếu thêm một kiểu “chế độ zen” không bị reset khi đâm vào tường, có lẽ tôi sẽ chơi nhiều hơn
Game rất tuyệt. Thị trường app cạnh tranh dữ dội như vậy mà nhận được tới 22 đánh giá là đáng nể. Tôi tò mò bạn đã quảng bá nó như thế nào
“Trò chơi này mang đến đồ họa tuyệt vời...” kiểu hài tự trào này thật đáng yêu. Tôi đang tải xuống ngay đây
Bài này thật sự rất thú vị. Chỉ riêng phần mô hình lốp thôi cũng đủ để tôi đọc đi đọc lại nhiều lần. Nếu không cần mô phỏng hay tính chân thực gì cả mà chỉ cần vui, thì chẳng gì vượt được game arcade thập niên 1980 Super Sprint. Thông tin game Super Sprint
Tôi copy/paste lại một phần các tài liệu bài nói chuyện liên quan mà tôi lưu trong ghi chú của mình: Hamish Young, vật lý xe cộ và động lực học lốp trong ‘Just Cause 4’ Vehicle Physics and Tire Dynamics in 'Just Cause 4' Jan Erik Steel & Patrick Donnelly, vật lý xe supercharged trong ‘Skylanders’ Supercharged! Vehicle Physics in 'Skylanders' Edward Pereira, bài nói về khoa học off-road The Science of Off-Roading Jared Cone, vật lý của ‘Rocket League’ It IS Rocket Science! The Physics of 'Rocket League' Detailed
Bản thân bài viết rất hay, nhưng phần mở đầu hơi gây bối rối. Nó nói rằng ô tô mang lại nhiều trải nghiệm phi thực tế trong game, trong khi súng thì không, và tôi thấy điều đó khó hiểu. Thực tế trong game có vô số loại súng phi thực tế. Hơn nữa, bài viết lập luận rằng kỳ vọng của chúng ta về việc lái xe đến từ trải nghiệm gián tiếp qua truyền thông hay văn hóa chứ không phải trải nghiệm trực tiếp, nhưng chẳng phải điều đó còn đúng với súng hơn sao? Cả việc nhảy nữa, trong game cũng được xử lý theo rất nhiều cách khác nhau, nhưng kỳ vọng của tôi về chuyện nhảy lại đến mạnh hơn nhiều từ trải nghiệm “từng tự mình nhảy” ngoài đời thực
Có vẻ bạn không có nhiều kinh nghiệm làm game FPS. Súng thật rất khác so với trải nghiệm trong game. Nếu game làm súng y như ngoài đời thì nó sẽ kém vui và gây khó chịu hơn nhiều. Game đua xe cũng vậy, bạn phải bẻ cong hiện thực vừa đủ để tạo niềm vui
Tôi nghĩ chủ đề này không phải là “chủ nghĩa hiện thực” mà là vấn đề của “tính thuyết phục” (verisimilitude). Điều quan trọng là tạo ra một trải nghiệm mà người chơi có thể “tin được”. Súng trong game khác ngoài đời, nhưng vẫn ưu tiên fantasy trông mạnh mẽ và đầy đe dọa. Nhảy cũng vậy, không có cơ sở hiện thực rõ ràng nhưng được thiết kế theo cách phù hợp nhất với mục tiêu của game. Ngược lại, với những lĩnh vực có thể hệ thống hóa và gắn với tính vật lý như ô tô, người ta hướng đến mô tả thực tế hơn, đến mức có thể đem so với các mô phỏng công nghiệp. Nhưng chuyển động con người, hệ thống kinh tế hay nhịp độ chiến đấu thì khó tiếp cận hiện thực ở mức đó, nên thường được biểu đạt hoạt hình hóa hơn nhiều. Nhà thiết kế game phải đưa ra sự thỏa hiệp phù hợp với kỳ vọng của người chơi và mục tiêu tổng thể của trò chơi. Chỉ chăm chăm theo đuổi chủ nghĩa hiện thực quá chi tiết rồi làm hỏng toàn bộ cấu trúc là một cái bẫy rất phổ biến
Ví dụ về FPS là thứ tôi vội nghĩ ra trên sân khấu, nhưng nghĩ kỹ lại thì đúng là không phải ví dụ hay. Cảm ơn vì đã chỉ ra điều đó
Có vẻ như đang thiếu các yếu tố như đồi dốc, ramp và hệ thống treo. Unreal Engine có cả demo xe rất đơn giản lẫn demo có mô hình hệ thống treo thực thụ
Trong phần cuối của buổi trình bày và bài viết có một đoạn video ngắn cho thấy tình trạng hiện tại của engine, và trong video có nhiều loại địa hình như đồi dốc và ramp. Trong phần trình bày thì dùng một lưới phẳng đơn giản. Hệ thống treo cũng đã được triển khai, nhưng vì nó không hẳn là vấn đề đặc thù chỉ riêng ô tô mà chỉ là một tính năng tổng quát để đỡ trọng lượng, nên xét về thời lượng và mạch trình bày tôi không đi sâu vào nó
Như Wassim đã nói trong phần hỏi đáp, hệ thống treo được physics engine tự xử lý, và tác động của nó được phản ánh vào tải trọng lốp, từ đó cũng ảnh hưởng tự nhiên đến lực lốp
Có một bài nói chuyện GDC rất hay về vật lý xe trong Rocket League. Xem bài nói về vật lý Rocket League. Nhân tiện, tôi là một thành viên trong đội từng làm việc ở một phần khác chứ không phải game client của Rocket League
Đọc bài này làm tôi nhớ đến một bài nói chuyện rất hay về vật lý đua xe. Xem Andre Marziali - Physics of Racing