Di chuyển các vật thể va chạm khi sử dụng tránh va chạm (lái) không được chỉ định


9

Tôi gặp rắc rối với việc tránh va chạm không được phân bổ cho những gì tôi nghĩ là một trường hợp hiếm gặp. Tôi đã đặt hai đối tượng di chuyển về phía nhau nhưng với độ lệch nhẹ, vì vậy một trong các đối tượng đang di chuyển lên trên một chút và một trong các đối tượng đang di chuyển xuống dưới một chút.

Trong thuật toán điều khiển tránh va chạm không được sắp xếp của tôi, tôi đang tìm các điểm trên đường chuyển tiếp của đối tượng và đường chuyển tiếp của đối tượng khác trong đó hai đường thẳng này là gần nhất. Nếu các điểm gần nhất này nằm trong khoảng cách tránh va chạm và nếu khoảng cách giữa chúng nhỏ hơn hai bán kính của hai quả cầu giới hạn của hai vật thể, thì các vật thể sẽ lái đi theo hướng thích hợp.

Vấn đề là trong trường hợp của tôi, các điểm gần nhất trên các đường được tính toán thực sự rất xa so với điểm va chạm thực tế. Điều này là do hai dòng chuyển tiếp cho mỗi đối tượng đang di chuyển ra xa nhau khi các đối tượng đi qua. Vấn đề là vì điều này, không có chỉ đạo diễn ra, và hai đối tượng va chạm một phần.

Ảnh chụp màn hình của các dòng chuyển tiếp đối tượng.

Có ai có bất cứ đề nghị nào về cách tôi có thể tính toán chính xác điểm va chạm không? Có lẽ bằng cách nào đó có tính đến kích thước của hai đối tượng?


Lưu ý rằng trong ảnh chụp màn hình, các đường màu lục, đỏ và xanh lam chỉ là các trục của thế giới 3D.
James Bedford

Câu trả lời:


6

Đây là bài viết phát hiện va chạm bóng tốt nhất mà tôi đã đi qua.

Bài học tại Pool Hall: Phát hiện va chạm nhanh, chính xác giữa các vòng tròn hoặc hình cầu


Tôi biết làm thế nào để làm một bài kiểm tra va chạm hình cầu. Vấn đề của tôi là cố gắng tìm vị trí mà sự va chạm này sẽ xảy ra trong tương lai. Cảm ơn.
James Bedford

@James bài viết đó sẽ giải quyết vấn đề của bạn. Nhìn vào trang 2 và bạn có thể sử dụng một số cao tùy ý cho "vận tốc" trên một trong những quả cầu của bạn để xác định điểm va chạm "trong tương lai".
Tết

Ok - xin lỗi vì đã không kiểm tra nó, nó trông khá tốt! Tôi sẽ phải quay lại với bạn sau khi tôi đọc nó. Cảm ơn :)
James Bedford

1
Tôi chỉ có thể làm rõ rằng trên trang 2 trong phần "Bắn ngân hàng: Va chạm giữa hai vòng tròn chuyển động", điều đó có nghĩa là bạn nên sử dụng sự khác biệt giữa vận tốc của hai vòng tròn trong thuật toán thay vì vận tốc của vòng tròn đầu tiên? (Vận tốc của vòng tròn thứ hai không được sử dụng trong phiên bản tĩnh của thuật toán.) Bit này không quá rõ ràng đối với tôi. Cảm ơn.
James Bedford

0

Bạn không muốn tìm điểm gần nhất.

Bạn muốn tìm điểm trên các đường trong đó khoảng cách bằng bán kính kết hợp của cả hai mặt cầu.


À ... được rồi! Bạn có biết làm thế nào tôi có thể tìm ra điều này về mặt toán học ..?
James Bedford

0

Nếu tôi hiểu chính xác câu hỏi của bạn, bạn chỉ cần sử dụng bài kiểm tra giao nhau giữa Sphere và Sphere, như AttackHobo đã đề xuất.

Toán học để làm một bài kiểm tra như vậy là như sau (sửa tôi nếu tôi sai, nó đã mất một lúc). Ngoài ra, điều này đang xem xét rằng các mặt cầu của bạn có một tâm và một bán kính biến nhau.

Công thức kiểm tra diễn ra như thế này:

distanceOfSpheres <= sumOfRadii^2

Bạn có một hình cầu và giao nhau hình cầu. Điều này khá đơn giản, hãy xem mã trông như thế nào trong mã!

bool sphereIntersectTest(BoundingSphere* s1, BoundingSphere* s2)
{
   Vector3 distance;

   // Get the distance between each sphere, center is a Vector3 type
   distance = (s1->center - s2-> center);

   // Determine the sum of both radii
   float radii = (s1->radius + s2->radius);

   // Determine if we have an intersection
   if (distance.length <= (radii * radii))
      return true;
   else
      return false;
}

Một lần nữa, tôi nghĩ rằng đây là câu trả lời chính xác mà bạn có thể đang tìm kiếm. Nếu bất cứ ai biết rằng điều này là sai xin vui lòng sửa chữa cho tôi, vì đã được một thời gian kể từ khi tôi thực hiện toán học này.


Tôi biết làm thế nào để làm một bài kiểm tra va chạm hình cầu. Vấn đề của tôi là cố gắng tìm vị trí mà sự va chạm này sẽ xảy ra trong tương lai. Cảm ơn.
James Bedford

0

Ok, hy vọng điều này có ý nghĩa ... Lấy vectơ của các quả bóng và tính điểm va chạm của chúng, gọi đây là p1. Tìm góc giữa 2 vectơ, gọi đây là a1. Tại a1 / 2 vẽ một đường thẳng, nó sẽ nằm ở giữa chính xác theo độ giữa hai vectơ. Bạn cần vị trí trên dòng này trong đó sin (a1 / 2) = (radius1 + radius2) / 2. Nếu hình ảnh này được hình dung trong đầu tôi bên phải, đây là nơi xảy ra va chạm. Xin lỗi nếu điều này là sai ... muộn rồi.

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.