Tránh va chạm 3D: tìm vectơ vận tốc được cập nhật (bên ngoài hình nón


8

Tôi đang cố gắng hiểu và thực hiện cơ chế của hệ thống tránh va chạm 3D (hành vi lái) hoàn toàn cho chuyển động bay (sáu bậc tự do), hiện đang tập trung vào việc tránh các chướng ngại vật tĩnh (tất cả đều có hình dạng của một quả cầu).

Tuy nhiên, tôi không hiểu làm thế nào để tìm ra véc tơ vận tốc mới của tác nhân chuyển động. Hình dưới đây minh họa cảnh. Tác nhân chuyển động (màu xanh lá cây) phải điều khiển ba vật thể tĩnh (màu xanh). Đường màu đỏ đại diện cho vectơ vận tốc phía trước ban đầu.

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

Lưu ý rằng cũng có ba hình nón trắng / bán trong suốt. Chúng đại diện cho "vectơ vận tốc bị cấm" liên quan đến từng chướng ngại vật. Điều đó có nghĩa là, tập hợp các vectơ vận tốc, nếu được sử dụng làm vectơ trước mới của tác nhân, sẽ làm cho tác nhân va chạm với một hoặc nhiều chướng ngại vật (cũng lưu ý rằng bán kính của mỗi hình nón bằng bán kính của chướng ngại vật đã cho cộng với bán kính của tác nhân, do đó, để cho phép bù cho người chơi điều động xung quanh).

Để tìm ra vectơ mới của tác nhân chuyển động trong môi trường 3D như vậy, xem xét ba trở ngại, một cách tiếp cận ngây thơ sẽ chỉ đơn giản là chuyển sang 3D, giải pháp cổ điển được giải thích trong bài viết thường được trích dẫn này và được minh họa bằng hình ảnh 2D sau:

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

Ở đó, một vận tốc mới (mũi tên màu cam) được tính đơn giản bằng cách bình thường hóa khoảng cách tối thiểu (mũi tên đen) giữa vận tốc ban đầu và tâm của chướng ngại vật và sau đó nhân như vậy với tổng giữa bán kính của chướng ngại vật và bán kính của đại lý di chuyển. Sau đó, trung bình của vận tốc mới được tính cho mỗi chướng ngại vật sẽ cho tổng vận tốc cuối cùng.

Trong nhiều trường hợp, điều đó là đủ. Tuy nhiên, hãy xem các trường hợp dưới đây (ví dụ trong 2D để dễ hình dung hơn):

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

Trong tất cả chúng, cách tiếp cận ngây thơ sẽ dẫn đến một vụ va chạm. Trong a và b, vận tốc mới cuối cùng sẽ trùng với vận tốc ban đầu (mũi tên đỏ) và tác nhân di chuyển sẽ di chuyển về phía trước mặc dù bị chặn một phần hoặc hoàn toàn. Trong c) và d), vận tốc mới (mũi tên màu cam) vẫn sẽ dẫn đến hậu quả tương tự.

Vì vậy, câu hỏi của tôi là: cách hiệu quả nhất về mặt tính toán để tìm ra vectơ mới phía trước của tác nhân chuyển động trong môi trường 3D như vậy, xem xét ba chướng ngại vật, theo cách tránh va chạm? Hay nói cách khác, vectơ phía trước mới:

1) không nằm trong bất kỳ hình nón nào;

2) là gần nhất có thể với vectơ phía trước ban đầu (đường màu đỏ trong hình).

PS: Tốt hơn là, tôi không tìm kiếm một thư viện, tôi đang tìm hiểu làm thế nào để làm điều đó.

Câu trả lời:


1

Tôi không nghĩ có một cách hiệu quả để giải quyết vấn đề một cách chính xác, nhưng đây là cách tôi cố gắng giải quyết nó.

Đầu tiên, tôi sẽ sử dụng các khối lượng giới hạn xung quanh từng đối tượng, thay vì chính các đối tượng đó. Tuy nhiên, mỗi đối tượng có thể được xấp xỉ bằng cách kết hợp nhiều hơn một khối lượng giới hạn.

Giải pháp đơn giản nhất là tính toán một khối lượng giới hạn duy nhất có chứa tất cả các đối tượng mà bạn cần tránh và tính toán hình nón từ khối lượng đó.

Điều này có thể không đủ tốt nếu các đối tượng không tương đối gần nhau. Sau đó, bạn có thể muốn thực hiện một số cụm theo cách hai đối tượng thuộc cùng một cụm nếu không thể hoặc ít nhất là không tầm thường để vượt qua giữa chúng. Tính toán cụm đối tượng xem xét khối lượng giới hạn của chúng cộng với kích thước của khối lượng giới hạn của người chơi cộng với một số lề bổ sung. Bạn có thể sử dụng một cái gì đó như thế này:

http://lab.poly Cross.de/?p=120

Sau khi bạn có các cụm, tìm cái gần nhất và tính toán hình nón để tránh va chạm với nó. Do cách tạo ra các cụm, nếu bạn chỉ lái đủ để tránh va vào một cụm, bạn sẽ không đánh vào cụm khác.

Hơn nữa, bạn có thể tạo cấu trúc đệ quy khi tính toán các cụm sẽ giúp bạn tìm cụm gần nhất.

Có một vài điều bạn có thể chơi với. Ví dụ, thay vì chọn cụm gần nhất, hãy chọn hai cụm gần nhất và tính toán một hình nón duy nhất tránh cả hai. Ngoài ra, bạn có thể thử các khối lượng giới hạn khác ngoài hình cầu.


0

Có hai cách để giải quyết câu hỏi này mà tôi có thể thấy. Đầu tiên, nếu bạn chỉ đơn giản muốn tìm cách lèo lái, thì bạn chỉ cần thực hiện tìm đường ( tôi thấy điều này khá hữu ích ). Đó sẽ là kết thúc của điều đó (và là câu trả lời thực tế chính xác cho câu hỏi này), nhưng tôi nghĩ bạn tò mò hơn về một giải pháp toán học cho vấn đề của bạn.

Để giải quyết điều đó, chúng ta hãy xem xét một vấn đề tương đương. Chụp một lát 2D cảnh của bạn "phía trước" phi công máy bay của bạn bình thường với vectơ ban đầu. Những gì bạn sẽ nhận được là một điểm đại diện cho vectơ ban đầu của bạn và một loạt các hình elip là hình chiếu 2D của hình nón tắc của bạn. Bây giờ những gì bạn muốn làm là tìm Điểm gần nhất với điểm ban đầu của bạn (hãy gọi nó P) nằm ở bên ngoài của các hình elip không chồng chéo. Hóa ra đây là một vấn đề khá khó giải quyết. Có 3 bước:

  • Chỉ ra các điểm giao nhau của tất cả các hình elip của bạn
  • Tìm bất kỳ lỗ hổng nào trong sự kết hợp của tất cả các hình elip của bạn
  • Chỉ ra điểm gần nhất Ptrên tất cả các hình elip của bạn bên ngoài liên kết (có thể nằm trong một lỗ)

Được rồi, tất cả điều này đòi hỏi hệ số nhân Lagrange và kiểm tra góc và một số công cụ thực sự phức tạp khác để giải quyết. Hãy xem xét các lựa chọn khác. Thay vào đó, nếu chúng ta biến đổi vấn đề của mình thành không gian góc cạnh, chúng ta sẽ thấy rằng những gì chúng ta thực sự muốn làm là tìm khoảng cách tối thiểu giữa một điểm và nhiều vòng tròn chiếu lên bề mặt của một hình cầu. Trong hình học vi phân, điều này thường được gọi là hình cầu 2 và rất hữu ích ở đây. Vì vậy, trước tiên, chúng ta cần tìm khoảng cách giữa hai điểm trên bề mặt của hình cầu, chúng ta sẽ sử dụng số liệu 2 hình cầu để tìm. May mắn thay, điều đó khá dễ dàng : ds^2 = (R^2)*(dth^2) + (R^2)*(sin(th)^2)*(dph^2), nơi chúng tôi giữ Rkhông đổi khi bán kính của hình cầu 2 của chúng tôi chiếu vào 3 không gian. Xuất phát từ vật lý, tôi coi thlà góc từ dương zphlà góc từ dương xvớislà khoảng cách.

Làm gì thực hiện được điều này? Nó cho phép chúng tôi loại bỏ việc sử dụng các số nhân Lagrange để giảm thiểu khoảng cách và cho phép chúng tôi làm việc theo tọa độ "gốc" (vì chúng tôi xác định các hình nón của chúng tôi theo góc độ của tắc). Vì vậy, bây giờ chúng ta cần tìm bán kính của hình chiếu hình nón. Bây giờ chúng ta hãy lấy một hình nón và gọi góc xác định nó a. Bán kính của hình chiếu sau đó đơn giản R*a. Điều đó đã đủ dễ dàng - chúng ta cần biết số lượng nào khác về hình nón? Chúng ta cần biết tâm của hình chiếu, được xác định bởi vectơ nhìn từ diễn viên. Đầu tiên chúng ta chuyển đổi x, yzthành các tọa độ hình cầu nơi chúng ta biết chúng ta đang ở khoảng cách xa Rvà giải quyết thph, điều chúng ta có thể làm bằng cách chỉ cần cắm vào các công thức chuyển đổi của mình:th = acos(z/R)ph = atan2(y/x)(sử dụng atan2ở đây để giải thích cho sự mơ hồ góc phần tư của arctangent). Quá trình này giống nhau để tìm vị trí của vectơ ban đầu của bạn trong tọa độ hình cầu.

Vì vậy, vấn đề đã được đơn giản hóa. Tuy nhiên, vấn đề vẫn còn khá khó giải quyết, nhưng bây giờ bạn chỉ cần lo lắng về các vòng tròn và điểm thay vì hình elip và các điểm hoặc góc và vectơ. Phần còn lại của quá trình là khá thủ tục. Về cơ bản, bạn cần tìm một vùng giới hạn được hình thành bởi các vòng tròn của mình, nơi có nhiều giải pháp. Tôi sẽ trình bày một phương pháp có thể không phải là tốt nhất, nhưng sẽ hiệu quả.

Trước tiên tôi sẽ so sánh tổng bán kính của tất cả các cặp đường tròn và khoảng cách giữa các tâm và sau đó nếu tổng của chúng lớn hơn khoảng cách trung tâm, hãy đặt chúng bằng nhau và giải thphđể tìm các nút giao. Bạn biết rằng mỗi cặp giao điểm mô tả "các góc cấm" cho vòng tròn đang đề cập, mà bạn sẽ lưu trữ dưới dạng một mảng các góc điểm giao nhau (từ tâm vòng tròn) cho mỗi vòng tròn giao nhau với vòng tròn này - quan trọng là bạn phải " hợp nhất "bất kỳ phạm vi nào trùng lặp khi bạn thêm chúng vào mảng để phần tiếp theo hoạt động chính xác. Sau đó, bạn tìm điểm gần nhất trên cạnh của vòng tròn đến điểm ban đầu (đơn giản như vẽ một đường thẳng qua điểm chính giữa của vòng tròn và điểm ban đầu, sau đó tìm vị trí trên đường thẳng tại bán kính của vòng tròn cách xa trung tâm). Sau đó lặp qua mảng được lưu trữ của bạn và kiểm tra xem góc đó có nằm trong phạm vi của từng góc cấm không. Nếu vậy, sau đó chọn cạnh gần nhất. Đó là điểm gần nhất với bên ngoài được mô tả bên trong vòng tròn này. Lặp lại quy trình cho tất cả các vòng tròn (một số tối ưu hóa có thể được thực hiện trong quy trình lựa chọn - bạn thực sự không cần phải tính toán điều này cho mỗi vòng tròn). Bây giờ so sánh tất cả các khoảng cách ngắn nhất của bạn, tìm nhỏ nhất và đó là câu trả lời của bạn, được mô tả trong các gócthph. Hãy nhớ rằng khoảng cách được mô tả với số liệu 2 hình cầu trong khi thực hiện phép tính này. Vì bạn không quan tâm đến hình cầu mà tất cả điều này được bật, chỉ có các góc, bạn có thể đặt R=1và thực hiện các phép tính này trên hình cầu đơn vị.

Đây là cách đơn giản nhất tôi có thể nghĩ để làm điều này. Tôi không chắc đó là cách đơn giản nhất tuyệt đối, nhưng nó sẽ hoạt động khá tốt. Thực tế cho một trò chơi, tuy nhiên, bạn chỉ muốn thực hiện tìm đường.

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.