Có một sự khác biệt lớn giữa động cơ va chạm và động cơ vật lý. Họ không làm điều tương tự, mặc dù động cơ vật lý thường dựa vào động cơ va chạm.
Động cơ va chạm sau đó được chia thành hai phần: phát hiện va chạm và phản ứng va chạm. Cái sau nói chung là một phần của động cơ vật lý. Đây là lý do tại sao động cơ va chạm và động cơ vật lý thường được đưa vào cùng một thư viện.
Phát hiện va chạm có hai dạng, rời rạc và liên tục. Động cơ tiên tiến hỗ trợ cả hai, vì chúng có các thuộc tính khác nhau. Nói chung, phát hiện va chạm liên tục là rất tốn kém và chỉ được sử dụng khi thực sự cần thiết. Phần lớn va chạm và vật lý được xử lý bằng các phương pháp rời rạc. Trong các phương pháp riêng biệt, các vật thể cuối cùng sẽ thâm nhập lẫn nhau, và động cơ vật lý sau đó hoạt động để đẩy chúng ra xa nhau. Vì vậy, động cơ không thực sự ngăn người chơi đi một phần qua tường hoặc sàn, nó chỉ sửa nó sau khi phát hiện ra rằng người chơi đang ở một phần trên tường / sàn. Tôi sẽ tập trung vào phát hiện va chạm rời rạc ở đây, vì đó là điều tôi có nhiều kinh nghiệm nhất khi thực hiện từ đầu.
Phát hiện va chạm
Phát hiện va chạm là tương đối dễ dàng. Mỗi đối tượng có một biến đổi và một hình dạng (có thể nhiều hình dạng). Các cách tiếp cận ngây thơ sẽ có động cơ va chạm thực hiện một vòng lặp O (n ^ 2) thông qua tất cả các cặp đối tượng và kiểm tra nếu có sự chồng chéo giữa các cặp. Trong các cách tiếp cận thông minh hơn, có nhiều cấu trúc dữ liệu không gian (ví dụ: đối với các đối tượng tĩnh so với động), hình dạng giới hạn cho từng đối tượng và hình dạng con lồi đa phần cho mỗi đối tượng.
Các cấu trúc dữ liệu không gian bao gồm những thứ như cây KD, cây AABB động, cây Octrees / Quadtrees, cây phân vùng không gian nhị phân, v.v. Mỗi cái đều có ưu điểm và nhược điểm, đó là lý do tại sao một số động cơ cao cấp hơn sử dụng nhiều hơn một. Chẳng hạn, cây AABB động thực sự rất nhanh và tốt để xử lý nhiều đối tượng chuyển động trong khi Cây KD có thể phù hợp hơn với hình dạng mức tĩnh mà các đối tượng va chạm. Có những lựa chọn khác là tốt.
Pha rộng sử dụng các cấu trúc dữ liệu không gian và khối lượng giới hạn trừu tượng cho từng đối tượng. Một khối lượng giới hạn là một hình dạng đơn giản bao quanh toàn bộ đối tượng, thường với mục tiêu bao quanh nó là "chặt chẽ" nhất có thể trong khi vẫn rẻ để thực hiện các thử nghiệm va chạm. Các hình dạng giới hạn phổ biến nhất là Hộp giới hạn theo trục, Hộp giới hạn đối tượng, Hình cầu và Viên nang. AABB thường được coi là nhanh nhất và dễ nhất (Sphere dễ dàng hơn và nhanh hơn trong một số trường hợp, nhưng nhiều cấu trúc dữ liệu không gian đó sẽ yêu cầu chuyển đổi hình cầu thành AABB), nhưng chúng cũng có xu hướng phù hợp với nhiều đối tượng khá kém. Viên nang là phổ biến trong các công cụ 3D để xử lý các va chạm ở cấp độ nhân vật. Một số động cơ sẽ sử dụng hai hình dạng giới hạn,
Giai đoạn cuối cùng của phát hiện va chạm là phát hiện chính xác nơi hình học đang giao nhau. Điều này thường ngụ ý sử dụng lưới (hoặc đa giác trong 2D), mặc dù không phải lúc nào cũng vậy. Mục đích của giai đoạn này là tìm hiểu xem các vật thể có thực sự va chạm hay không, nếu cần một mức độ chi tiết tốt (giả sử, va chạm đạn trong một game bắn súng, nơi bạn muốn có thể bỏ qua những phát bắn mà hầu như không bỏ lỡ), và cũng để tìm ra chính xác nơi các đối tượng va chạm, điều này sẽ ảnh hưởng đến cách các đối tượng phản ứng. Ví dụ, nếu một hộp đang ngồi trên cạnh của bàn, động cơ phải biết tại điểm nào mà bàn đang đẩy vào hộp; tùy thuộc vào khoảng cách của hộp treo, hộp có thể bắt đầu nghiêng và rơi ra.
Liên hệ thế hệ Manifold
Các thuật toán được sử dụng ở đây bao gồm các thuật toán sàng lọc Cổng thông tin GJK và Minkowski phổ biến, cũng như thử nghiệm Trục tách. Bởi vì các thuật toán phổ biến thường chỉ hoạt động cho các hình dạng lồi, nên cần phải chia nhiều đối tượng phức tạp thành các đối tượng phụ lồi và thực hiện các thử nghiệm va chạm cho từng cá nhân. Đây là một trong những lý do tại sao các lưới đơn giản hóa thường được sử dụng để va chạm, cũng như giảm thời gian xử lý để sử dụng ít hình tam giác hơn.
Một số thuật toán này không chỉ cho bạn biết rằng các vật thể đã va chạm chắc chắn, mà là nơi chúng va chạm - chúng cách nhau bao xa và "điểm tiếp xúc" là gì. Một số thuật toán yêu cầu các bước bổ sung, chẳng hạn như cắt đa giác, để có được thông tin này.
Phản ứng vật lý
Tại thời điểm này, một liên hệ đã được phát hiện và có đủ thông tin để động cơ vật lý xử lý liên hệ. Việc xử lý vật lý có thể rất phức tạp. Các thuật toán đơn giản hơn hoạt động cho một số trò chơi, nhưng ngay cả một thứ gì đó có vẻ đơn giản như việc giữ một chồng hộp ổn định hóa ra lại khá khó khăn và đòi hỏi nhiều công việc và hack không rõ ràng.
Ở cấp độ cơ bản nhất, động cơ vật lý sẽ làm một cái gì đó như thế này: nó sẽ lấy các vật thể va chạm và đa tạp tiếp xúc của chúng và tính toán các vị trí mới cần thiết để tách các vật thể va chạm. Nó sẽ di chuyển các đối tượng đến các vị trí mới. Nó cũng sẽ tính toán sự thay đổi vận tốc do lực đẩy này, kết hợp với sự phục hồi (độ nảy) và giá trị ma sát. Động cơ vật lý cũng sẽ áp dụng bất kỳ lực nào khác tác dụng lên các vật thể, chẳng hạn như trọng lực, để tính vận tốc mới của vật thể, và sau đó (khung tiếp theo) vị trí mới của chúng.
Phản ứng vật lý tiên tiến hơn trở nên phức tạp một cách nhanh chóng. Cách tiếp cận ở trên sẽ bị phá vỡ trong nhiều tình huống, bao gồm một đối tượng ngồi trên hai đối tượng khác. Đối phó với mỗi cặp tự nó sẽ gây ra "jitter" và các đối tượng sẽ nảy xung quanh rất nhiều. Kỹ thuật cơ bản nhất là thực hiện một số lần lặp hiệu chỉnh vận tốc trên các cặp vật thể va chạm. Ví dụ: với hộp "A" nằm trên hai hộp khác "B" và "C", va chạm AB sẽ được xử lý trước, khiến hộp A nghiêng thêm vào hộp C. Sau đó, va chạm AC được xử lý, buổi tối ra khỏi hộp một chút, nhưng kéo A xuống và vào B. Sau đó, một lần lặp khác được thực hiện, do đó lỗi AB gây ra bởi hiệu chỉnh AC được giải quyết một chút, tạo ra một chút lỗi trong phản hồi AC. Mà được xử lý khi AC được xử lý lại. Số lần lặp được thực hiện không cố định và không có điểm nào mà nó trở nên "hoàn hảo", mà chỉ là bất cứ số lần lặp nào dừng lại đều cho kết quả có ý nghĩa. 10 lần lặp là lần thử đầu tiên điển hình, nhưng cần phải điều chỉnh để tìm ra con số tốt nhất cho một công cụ cụ thể và nhu cầu của một trò chơi cụ thể.
Liên lạc bộ nhớ đệm
Có những thủ thuật khác hóa ra thực sự tiện dụng (ít nhiều cần thiết) khi xử lý nhiều loại trò chơi. Liên lạc bộ nhớ đệm là một trong những người hữu ích hơn. Với bộ đệm liên hệ, mỗi bộ đối tượng va chạm được lưu trong bảng tra cứu. Mỗi khung hình, khi phát hiện xung đột, bộ đệm này được truy vấn để xem các đối tượng trước đó có tiếp xúc hay không. Nếu các đối tượng trước đây không tiếp xúc, thì có thể tạo ra sự kiện "va chạm mới". Nếu các đối tượng trước đây đã tiếp xúc, thông tin có thể được sử dụng để cung cấp phản hồi ổn định hơn. Bất kỳ mục nào trong bộ đệm liên hệ không được cập nhật trong khung cho biết hai đối tượng được phân tách và có thể tạo sự kiện "tách đối tượng". Logic trò chơi thường có sử dụng cho các sự kiện này.
Logic trò chơi cũng có thể phản ứng với các sự kiện va chạm mới và gắn cờ chúng là bị bỏ qua. Điều này thực sự hữu ích để triển khai một số tính năng phổ biến trong các nền tảng, như các nền tảng mà bạn có thể nhảy qua nhưng vẫn đứng vững. Việc triển khai ngây thơ có thể chỉ cần bỏ qua các va chạm có nền tảng hướng xuống-> va chạm nhân vật bình thường (biểu thị đầu của người chơi chạm vào đáy của nền tảng), nhưng không có bộ nhớ đệm tiếp xúc, điều này sẽ bị phá vỡ nếu đầu của người chơi chọc qua nền tảng và sau đó anh ta bắt đầu ngã. Tại thời điểm đó, liên lạc bình thường có thể sẽ hướng lên trên, khiến người chơi bật lên thông qua nền tảng khi anh ta không nên. Với bộ nhớ đệm liên hệ, động cơ có thể nhìn vào sự va chạm ban đầu bình thường và bỏ qua tất cả các sự kiện liên hệ tiếp theo cho đến khi nền tảng và trình phát tách rời nhau một lần nữa.
Ngủ
Một kỹ thuật rất hữu ích khác là đánh dấu các đối tượng là "ngủ" nếu chúng không được tương tác. Các vật thể ngủ không được cập nhật vật lý, không va chạm với các vật thể ngủ khác và về cơ bản chỉ cần ngồi đó đông cứng kịp thời cho đến khi một vật thể không ngủ khác va chạm với chúng.
Tác động là tất cả các cặp đối tượng va chạm chỉ ngồi đó không làm gì mà không mất thời gian xử lý. Ngoài ra, vì không có số lượng hiệu chỉnh vật lý nhỏ liên tục, các ngăn xếp sẽ ổn định.
Một đối tượng là một ứng cử viên cho giấc ngủ khi nó có vận tốc gần như bằng không trong hơn một khung hình. Lưu ý rằng epsilon bạn sử dụng để kiểm tra vận tốc gần như bằng không này có thể sẽ cao hơn một chút so với epsilon so sánh điểm nổi thông thường, vì bạn sẽ mong đợi một số jitter với các đối tượng xếp chồng lên nhau và bạn muốn toàn bộ các đối tượng ngủ thiếp đi nếu chúng ngủ Đang ở "đủ gần" để ổn định. Ngưỡng tất nhiên sẽ yêu cầu điều chỉnh và thử nghiệm.
Những ràng buộc
Điểm chính cuối cùng của nhiều động cơ vật lý là bộ giải hạn chế. Mục đích của một hệ thống như vậy là để tạo thuận lợi cho việc thực hiện những thứ như lò xo, động cơ, trục bánh xe, thân mềm mô phỏng, vải, dây thừng và dây chuyền, và đôi khi cả chất lỏng (mặc dù chất lỏng thường được thực hiện như một hệ thống hoàn toàn khác).
Ngay cả những điều cơ bản của việc giải quyết ràng buộc cũng có thể trở nên rất chuyên sâu về toán học và vượt xa chuyên môn của tôi trong vấn đề này. Tôi khuyên bạn nên kiểm tra loạt bài viết xuất sắc về vật lý của Randy Gaul để có giải thích sâu hơn về chủ đề này.