Nội dung trên trang web này đã được dịch bằng trí tuệ nhân tạo (AI) hoặc công nghệ dịch máy và có thể có lỗi.

Skip to content

Nâng cao mô phỏng và hiệu suất với bộ giải vật lý tiên tiến

Vào giữa năm 2015, Roblox đã công bố một bản nâng cấp lớn cho động cơ vật lý của mình: bộ giải vật lý Projected Gauss-Seidel (PGS). Trong năm đầu tiên, bộ giải mới này là tùy chọn và mang lại độ chính xác cao hơn cùng hiệu suất tốt hơn so với bộ giải lò xo được sử dụng trước đó.

Năm 2016, chúng tôi đã bổ sung hỗ trợ cho một loạt các ràng buộc vật lý mới đa dạng, khuyến khích các nhà phát triển chuyển sang bộ giải mới và mở rộng khả năng sáng tạo của động cơ vật lý. Mọi vị trí mới đều sử dụng bộ giải PGS theo mặc định, với tùy chọn quay trở lại bộ giải cổ điển.

Chúng tôi đã khắc phục một số vấn đề về độ ổn định liên quan đến sự chênh lệch khối lượng lớn và các cơ chế phức tạp bằng cách giới thiệu bộ giải quyết lai LDL-PGS vào giữa năm 2018. Điều này khiến bộ giải quyết cũ trở nên lỗi thời và nó đã bị vô hiệu hóa hoàn toàn vào năm 2019, tự động chuyển tất cả các địa điểm sang PGS.

Năm 2019, hiệu suất đã được cải thiện hơn nữa nhờ sử dụng đa luồng, chia mô phỏng thành các tác vụ gồm các vùng mô phỏng liên kết với nhau. Chúng tôi vẫn gặp một số vấn đề về hiệu suất liên quan đến LDL, nhưng cuối cùng đã giải quyết được vào đầu năm 2020.

Công cụ vật lý vẫn đang được cải thiện và tối ưu hóa về hiệu suất, và chúng tôi có kế hoạch thêm các tính năng mới trong tương lai gần.

Áp dụng các định luật vật lý

Mục tiêu chính của một công cụ vật lý là mô phỏng chuyển động của các vật thể trong môi trường ảo. Trong công cụ vật lý của chúng tôi, chúng tôi quan tâm đến các vật thể cứng, va chạm và có các ràng buộc với nhau.

Một động cơ vật lý được tổ chức thành hai giai đoạn: phát hiện va chạm và giải quyết. Phát hiện va chạm tìm các điểm giao nhau giữa các hình học liên quan đến các vật thể cứng, tạo ra thông tin va chạm thích hợp như điểm va chạm, phương vuông góc và độ sâu xâm nhập. Sau đó, bộ giải quyết cập nhật chuyển động của các vật thể cứng dưới ảnh hưởng của các va chạm đã được phát hiện và các ràng buộc do người dùng cung cấp.

Chuyển động là kết quả của việc bộ giải quyết diễn giải các định luật vật lý, chẳng hạn như định luật bảo toàn năng lượng và động lượng. Tuy nhiên, việc thực hiện điều này với độ chính xác 100% là rất tốn kém, và bí quyết để mô phỏng nó trong thời gian thực là sử dụng phương pháp xấp xỉ để tăng hiệu suất, miễn là kết quả vẫn hợp lý về mặt vật lý. Miễn là các định luật cơ bản về chuyển động được duy trì trong một mức dung sai hợp lý, sự cân bằng này là hoàn toàn chấp nhận được đối với mô phỏng trò chơi máy tính.

Thực hiện các bước nhỏ

Ý tưởng chính của động cơ vật lý là phân chia chuyển động thành các bước thời gian. Các phương trình chuyển động của các vật thể cứng bị ràng buộc và không bị ràng buộc rất khó tích phân trực tiếp và chính xác. Việc phân chia này chia chuyển động thành các khoảng thời gian nhỏ, nơi các phương trình được đơn giản hóa và tuyến tính hóa, cho phép giải chúng một cách xấp xỉ. Điều này có nghĩa là trong mỗi bước thời gian, chuyển động của các phần liên quan của vật thể cứng tham gia vào ràng buộc được xấp xỉ tuyến tính.

drift.gif

Mặc dù một bài toán tuyến tính dễ giải hơn, nhưng nó sẽ tạo ra độ lệch trong mô phỏng có chứa các hành vi phi tuyến tính, như chuyển động quay. Sau này, chúng ta sẽ xem xét các phương pháp giảm thiểu giúp giảm độ lệch và làm cho mô phỏng trở nên hợp lý hơn.

Giải quyết

Sau khi tuyến tính hóa các phương trình chuyển động cho một bước thời gian, chúng ta cần giải một hệ phương trình tuyến tính hoặc bài toán bổ sung tuyến tính (LCP). Các hệ này có thể có quy mô tùy ý và việc giải chính xác vẫn có thể tốn kém. Một lần nữa, bí quyết là tìm ra một giải pháp gần đúng bằng cách sử dụng một phương pháp nhanh hơn. Một phương pháp hiện đại để giải quyết gần đúng một LCP với các đặc tính hội tụ tốt là Projected Gauss-Seidel (PGS). Đây là một phương pháp lặp đi lặp lại, có nghĩa là với mỗi lần lặp lại, giải pháp gần đúng sẽ được đưa đến gần hơn với giải pháp thực, và độ chính xác cuối cùng của nó phụ thuộc vào số lần lặp lại.

Đoạn phim hoạt hình này cho thấy cách bộ giải PGS thay đổi vị trí của các vật thể ở mỗi bước của quá trình lặp, với mục tiêu là tìm ra các vị trí tuân thủ các ràng buộc bóng và ổ cắm đồng thời duy trì trọng tâm ở mỗi bước (đây là một loại bộ giải vị trí được sử dụng bởi bộ kéo IK). Mặc dù ví dụ này có giải pháp phân tích đơn giản, nó là minh họa tốt cho ý tưởng đằng sau thuật toán PGS. Tại mỗi bước, thuật toán cố định một trong các ràng buộc và cho phép ràng buộc còn lại bị vi phạm. Sau vài lần lặp, các vật thể đã rất gần với vị trí chính xác của chúng. Một đặc điểm của phương pháp này là một số vật thể cứng dường như rung lắc quanh vị trí cuối cùng của chúng, đặc biệt khi tương tác với các vật thể nặng hơn. Nếu chúng ta không thực hiện đủ số lần lặp, phần màu vàng có thể bị bỏ lại trong trạng thái rõ ràng là không hợp lệ, trong đó một trong hai ràng buộc của nó bị vi phạm nghiêm trọng. Điều này được gọi là vấn đề tỷ lệ khối lượng cao, và nó đã là nỗi ám ảnh của các công cụ vật lý vì nó gây ra sự mất ổn định và nổ. Nếu chúng ta thực hiện quá nhiều lần lặp, bộ giải sẽ trở nên quá chậm, còn nếu không thì nó sẽ trở nên không ổn định. Cân bằng hai mặt này là một quá trình dài và đầy khó khăn.

Các chiến lược giảm thiểu

Một bộ giải có hai nguồn chính gây ra sự không chính xác: bước thời gian và giải lặp (còn có sự trôi dạt số thập phân nhưng nó không đáng kể so với hai yếu tố đầu tiên). Những sự không chính xác này gây ra lỗi trong mô phỏng khiến nó lệch khỏi quỹ đạo chính xác. Một số sự lệch này có thể chấp nhận được như tốc độ hơi khác nhau hoặc mất năng lượng, nhưng một số thì không như sự mất ổn định, tăng năng lượng lớn hoặc các ràng buộc bị lệch.

Do đó, phần lớn độ phức tạp trong bộ giải xuất phát từ việc triển khai các phương pháp nhằm giảm thiểu tác động của sai số tính toán. Triển khai cuối cùng của chúng tôi sử dụng một số chiến lược giảm thiểu truyền thống và một số chiến lược mới:

  1. Khởi động ấm: bắt đầu với giải pháp từ bước thời gian trước đó để tăng tốc độ hội tụ của bộ giải lặp
  2. Ổn định sau: chiếu lại hệ thống trở lại đa tạp ràng buộc để ngăn chặn sự trôi dạt của ràng buộc
  3. Chuẩn hóa: thêm tính tuân thủ vào các ràng buộc để đảm bảo giải pháp tồn tại và duy nhất
  4. Điều kiện tiên quyết: sử dụng giải pháp chính xác cho một hệ thống con tuyến tính, cải thiện tính ổn định của các cơ chế phức tạp

Các chiến lược 1, 2 và 3 khá truyền thống, nhưng chiến lược 3 đã được chúng tôi cải tiến và hoàn thiện. Ngoài ra, mặc dù chiến lược 4 không phải là chưa từng có, nhưng chúng tôi chưa thấy bất kỳ triển khai thực tế nào về nó. Chúng tôi sử dụng một phương pháp phân tích nhân tử độc đáo cho các ma trận ràng buộc thưa thớt lớn và một cách kết hợp mới hiệu quả với PGS. Ứng dụng thu được chỉ chậm hơn một chút so với PGS thuần túy nhưng đảm bảo rằng hệ thống tuyến tính xuất phát từ các ràng buộc bằng nhau được giải quyết chính xác. Do đó, các ràng buộc bằng nhau chỉ chịu ảnh hưởng của sự trôi dạt đến từ việc phân chia thời gian. Chi tiết về các phương pháp của chúng tôi được trình bày trong bài thuyết trình GDC 2020 của tôi. Hiện tại, chúng tôi đang nghiên cứu các phương pháp trực tiếp áp dụng cho các ràng buộc bất đẳng thức và va chạm.

Tìm hiểu thêm chi tiết

Theo truyền thống, có hai mô hình toán học cho các cơ chế khớp nối: phương pháp tọa độ giảm do Featherstone dẫn đầu, tham số hóa các bậc tự do tại mỗi khớp nối, và phương pháp tọa độ đầy đủ sử dụng công thức Lagrange.

Chúng tôi sử dụng công thức thứ hai vì nó ít hạn chế hơn và yêu cầu toán học cũng như việc triển khai đơn giản hơn nhiều.

Engine Roblox sử dụng các phương pháp phân tích để tính toán phản ứng động học của các ràng buộc, thay vì các phương pháp phạt được sử dụng trước đây. Các phương pháp phân tích ban đầu được giới thiệu trong Baraff 1989, nơi chúng được sử dụng để xử lý cả các ràng buộc bằng và không bằng một cách nhất quán. Baraff nhận thấy rằng mô hình tiếp xúc có thể được biểu diễn bằng lập trình bậc hai, và ông đã cung cấp một phương pháp giải heuristic (không phải là phương pháp chúng tôi sử dụng trong bộ giải của mình).

Thay vì sử dụng phương pháp định dạng dựa trên lực, chúng tôi sử dụng phương pháp định dạng dựa trên xung trong không gian vận tốc, ban đầu được giới thiệu bởi Mirtich-Canny 1995 và được cải tiến thêm bởi Stewart-Trinkle 1996, phương pháp này thống nhất cách xử lý các loại tiếp xúc khác nhau và đảm bảo sự tồn tại của giải pháp cho các tiếp xúc có ma sát. Tại mỗi bước thời gian, các ràng buộc và va chạm được duy trì bằng cách áp dụng các thay đổi tức thời trong vận tốc do các xung ràng buộc gây ra. Một giải thích xuất sắc về lý do tại sao mô phỏng dựa trên xung vượt trội hơn được trình bày trong bài thuyết trình GDC của Catto năm 2014.

Các tiếp xúc không ma sát được mô hình hóa bằng một bài toán bổ sung tuyến tính (LCP) như được mô tả trong Baraff 1994. Ma sát được thêm vào dưới dạng một phép chiếu phi tuyến lên hình nón ma sát, xen kẽ với các lần lặp của phương pháp Projected Gauss-Seidel.

Sự trôi số gây ra sai số vị trí trong các ràng buộc được giải quyết bằng kỹ thuật ổn định sau (post-stabilization) sử dụng vận tốc giả (pseudo-velocities) do Cline-Pai 2003 đề xuất. Phương pháp này bao gồm việc giải một bài toán LCP thứ hai trong không gian vị trí, giúp chiếu hệ thống trở lại mặt phẳng ràng buộc.

Các bài toán LCP được giải bằng phương pháp PGS / Impulse Solver được phổ biến bởi Catto 2005 (xem thêm Catto 2009). Phương pháp này là lặp, xem xét từng ràng buộc riêng lẻ theo thứ tự và giải quyết chúng độc lập. Sau nhiều lần lặp và trong điều kiện lý tưởng, hệ thống hội tụ đến giải pháp toàn cục.

Ngoài ra, các vấn đề về tỷ lệ khối lượng cao trong các ràng buộc bằng nhau được giải quyết bằng cách tiền điều kiện hóa PGS sử dụng phân tích LDL thưa thớt của ma trận ràng buộc bằng nhau. Các ma trận con dày đặc của ma trận ràng buộc được làm thưa thớt bằng một phương pháp mà chúng tôi gọi là Body Splitting. Điều này tương tự như phân tích LDL được sử dụng trong Baraff 1996, nhưng cho phép các hệ thống cơ học tổng quát hơn và giải hệ thống trong không gian ràng buộc. Để biết thêm thông tin, bạn có thể xem bài thuyết trình của tôi tại GDC 2020.

Kiến trúc của bộ giải của chúng tôi tuân theo ý tưởng của Guendelman-Bridson-Fedkiw, trong đó bước tốc độ và vị trí được tách biệt bằng việc giải quyết ràng buộc. Trình tự thời gian của chúng tôi là:

  1. Tăng tốc độ
  2. Giải quyết ràng buộc trong không gian vận tốc và không gian vị trí
  3. Tiến vị trí

Sơ đồ này có ưu điểm là chỉ tích hợp các vận tốc hợp lệ và hạn chế độ trễ trong việc áp dụng lực bên ngoài, nhưng cho phép một lượng nhỏ vi phạm ràng buộc do sai lệch số.

Một tài liệu tham khảo tuyệt vời về mô phỏng vật thể cứng là cuốn sách Erleben 2005, gần đây đã được phát hành miễn phí. Bạn có thể tìm thấy các bài giảng trực tuyến về hoạt hình dựa trên vật lý, blog của Nilson Souto về việc xây dựng một công cụ vật lý, bài thuyết trình GDC rất hay của Erin Catto về các phương pháp giải quyết hiện đại, và các diễn đàn như Bullet Physics ForumGameDev, những nơi tuyệt vời để đặt câu hỏi.

Kết luận

Lĩnh vực mô phỏng vật lý trong game mang lại nhiều vấn đề thú vị, vừa hấp dẫn vừa thách thức. Có cơ hội để học hỏi một lượng lớn toán học và vật lý thú vị, cũng như áp dụng các kỹ thuật tối ưu hóa hiện đại. Đây là một lĩnh vực phát triển game kết hợp chặt chẽ giữa toán học, vật lý và kỹ thuật phần mềm.

Mặc dù Roblox đã có một engine vật lý cơ thể cứng tốt, vẫn còn những khía cạnh có thể được cải thiện và tối ưu hóa. Ngoài ra, chúng tôi đang phát triển các dự án mới thú vị như mô phỏng vỡ vụn, biến dạng, vật thể mềm, vải, khí động học và mô phỏng nước.

Cả Roblox Corporation lẫn blog này đều không ủng hộ hay hỗ trợ bất kỳ công ty hay dịch vụ nào. Ngoài ra, chúng tôi không đảm bảo hay hứa hẹn về tính chính xác, độ tin cậy hay tính đầy đủ của thông tin trong blog này.

Bài đăng trên blog này ban đầu được xuất bản trên Roblox Tech Blog.