Tại sao OnCollision Entry của Unity không cung cấp cho tôi quy tắc bề mặt và cách đáng tin cậy nhất để có được chúng là gì?


11

Sự kiện va chạm của Unity cung cấp cho bạn một đối tượng Va chạm cung cấp cho bạn một số thông tin về vụ va chạm đã xảy ra (bao gồm danh sách các Contactpoint với các quy tắc nhấn).

Nhưng những gì bạn không nhận được là quy tắc bề mặt cho máy va chạm mà bạn đạt được. Đây là một ảnh chụp màn hình để minh họa. Dòng màu đỏ là từ ContactPoint.normalvà dòng màu xanh là từ RaycastHit.normal.

nhập mô tả hình ảnh ở đây

Đây có phải là một ví dụ về Unity ẩn thông tin để cung cấp API đơn giản hóa không? Hoặc các kỹ thuật phát hiện va chạm thời gian thực 3D tiêu chuẩn chỉ không thu thập thông tin này?

Và đối với phần thứ hai của câu hỏi, đâu là cách chắc chắn và tương đối hiệu quả để có được bề mặt bình thường khi va chạm?

Tôi biết rằng việc phát sóng mang lại cho bạn các quy tắc bề mặt, nhưng có vẻ như tôi cần phải thực hiện một số lần phát sóng để thực hiện điều này cho tất cả các kịch bản (có thể là một điểm tiếp xúc / kết hợp thông thường bỏ qua máy va chạm trên diễn viên đầu tiên, hoặc có thể bạn cần thực hiện trung bình tất cả quy tắc của các điểm tiếp xúc để có kết quả tốt nhất).

Phương pháp hiện tại của tôi:

  1. Sao lưu Collision.contacts[0].pointcùng với hit của nó bình thường

  2. Raycast xuống hit phủ định bình thường cho float.MaxValue, trênCollision.collider

  3. Nếu thất bại, lặp lại bước 1 và 2 với bình thường không phủ định

  4. Nếu thất bại, hãy thử các bước từ 1 đến 3 với Collision.contacts[1]

  5. Lặp lại 4 cho đến khi thành công hoặc cho đến khi tất cả các điểm tiếp xúc cạn kiệt.

  6. Từ bỏ, trở về Vector3.zero.

Điều này dường như bắt được tất cả mọi thứ, nhưng tất cả các chương trình phát sóng đó làm tôi thấy khó chịu và tôi không chắc làm thế nào để kiểm tra xem điều này có hiệu quả với đủ trường hợp không. Có cách nào tốt hơn?

EDIT Nếu đây thực sự chỉ là cách mọi thứ xảy ra với xung đột 3D, thì tổng quan về lý do tại sao trong trường hợp chung sẽ được chào đón như một điều gì đó cụ thể đối với Unity.


Đây chỉ là vì tò mò, hay bạn đang cố gắng làm gì đó và bị mắc kẹt? Đó là, tại sao bạn nghĩ rằng bạn cần bề mặt bình thường? Đặt câu hỏi về hiệu quả mà bạn đang cố gắng đạt được, thay vì cách "khắc phục" giải pháp cho một vấn đề không xác định và ai đó có thể giúp bạn giải quyết. :)
Sean Middleditch

@SeanMiddleditch Tôi không đồng ý. Câu hỏi được đặt ra và chính xác là tôi đang tìm kiếm. Câu hỏi này và câu trả lời của nó đã giúp tôi sửa một số thứ tôi đang làm sai.
SteakOverflow

Câu trả lời:


12

Đây thực sự chỉ là cách mọi thứ với sự va chạm. Không chỉ 3D, mà cả 2D. Lấy ví dụ sau:

Các AABB chồng chéo

Các AABB màu xanh lá cây và đỏ đang va chạm và đa tạp tiếp xúc là khu vực màu xanh. Các điểm tiếp xúc sẽ nằm trong khu vực màu xanh ở đâu đó (chính xác là nơi có thể thay đổi theo thuật toán, nhưng các góc mà màu xanh / đỏ / xanh gặp nhau là lý tưởng-ish).

Bề mặt nào bình thường nên được trả lại? Cạnh trên của AABB màu đỏ hay cạnh trái? Nếu hộp màu xanh lá cây rơi xuống, có lẽ chúng ta có thể đoán được cạnh trên một cách hợp lý. Nếu nó di chuyển sang phải, có lẽ chúng ta có thể đoán được cạnh trái một cách hợp lý. Điều gì nếu nó được di chuyển xuống và phải? Chúng ta có trục ít thâm nhập nhất? Trục vận tốc của tốc độ lớn nhất? Một số heuristic của cả hai? Điều gì nếu các hộp sẽ va chạm chính xác vào các góc?

Mở rộng điều này đến một bề mặt 3D phức tạp có khả năng tạo thành từ 100 tris / khuôn mặt. Bạn vẫn sẽ chỉ có một số lượng nhỏ các điểm liên lạc lý tưởng. Bề mặt nào bình thường nên được trả lại? Bề mặt trung bình bình thường trên toàn bộ ba lưới (không có ý nghĩa đối với hầu hết các đối tượng)? Các điểm trực tiếp "bên dưới" các góc của hộp va chạm (không được xác định rõ cho hầu hết các hình dạng khác)? Bạn có cố gắng tìm mặt gần nhất với các điểm tiếp xúc được tạo không (sẽ yêu cầu vượt qua lần thứ hai, vì các điểm tiếp xúc không được tính trực tiếp từ bất kỳ mặt lưới nào)? Nếu bạn tìm thấy khuôn mặt gần nhất, bạn có lấy khuôn mặt bình thường hay bạn nội suy các đỉnh của khuôn mặt tại điểm tiếp xúc để lấy chính xác bình thường cho các đối tượng "mịn"?

Thực sự, vấn đề chính là các điểm liên lạc không phải là tất cả các điểm liên lạc. Trong nhiều trường hợp, đó sẽ là một tập hợp điểm vô hạn, sau tất cả. Chúng chỉ là một vài điểm được phân phối tốt giúp khả năng phản ứng vật lý gần đúng bằng cách áp dụng các lực tại các điểm đã nói để đẩy các vật thể va chạm xung quanh theo cách thức reaslitic. Các điểm / vị trí cụ thể của liên hệ đối tượng thực tế được trừu tượng hóa đằng sau một mô hình toán học đơn giản hóa. Do đó, ý tưởng về một bề mặt cụ thể của tiếp xúc đơn giản là không có ý nghĩa nhiều trong trường hợp chung.

Tất nhiên, với các ràng buộc và giới hạn cụ thể hơn đối với các đối tượng, thế giới và chuyển động của bạn, bạn có thể tạo các thuật toán va chạm thay thế có thể cho bạn biết về bề mặt bình thường. Trong trường hợp 2D ở trên, nếu chúng ta giả sử rằng các hộp không bao giờ xoay và chúng ta biết vận tốc tương đối và vị trí cuối cùng của mỗi cái, thì có thể sử dụng phát hiện va chạm liên tục để tìm ra chính xác khi nào chúng va chạm và tính năng nào va chạm, cung cấp cho chúng ta tính năng chính xác khi xảy ra va chạm, sau đó có thể được sử dụng như một tiếp xúc / va chạm / bề mặt bình thường. Các trò chơi platformer được xây dựng hoàn toàn dựa trên các giả định và các thủ thuật đặc biệt như vậy (Đó là lý do tại sao sử dụng thư viện vật lý nói chung như Box2D hoặc Havok hoặc ánh sáng không bao giờ tạo ra loại điều khiển chặt chẽ, chính xác mà bạn tìm thấy trong các nền tảng cổ điển như Mario hoặc Sonic; muốn nói điều đó '

Các thư viện vật lý chung của Newton, giống như các thư viện được sử dụng trong Unity3D, không thể tạo ra các loại đơn giản hóa và giả định đó. Do đó, bạn không nhận được các quy tắc bề mặt va chạm, bạn nhận được một đa tạp liên lạc, thường được đơn giản hóa thành các điểm liên lạc, và đó là điều đó.


Đây là một câu trả lời tuyệt vời, và chính xác những gì tôi đang tìm kiếm, cảm ơn bạn. Vấn đề cụ thể là có được một vectơ phản xạ thuyết phục trên một vật cứng động học khi va chạm. Là cách tiếp cận thông thường nếu bạn muốn loại thông tin này chọn xem bạn muốn chiếu hoặc lấy 3 điểm tiếp xúc (nếu có) và lấy sản phẩm chéo?
michael.bartnett
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.