Tìm tốc độ chính xác để AI chuyển sang đạt mục tiêu


10

Tôi có một con tàu di chuyển với tốc độ tối đa maxSpeedvà có thể quay rotationSpeedđộ mỗi giây. Con tàu luôn di chuyển theo hướng mà nó đang đối mặt, điều đó có nghĩa là con tàu di chuyển càng nhanh thì bán kính quay càng lớn.

Tôi biết vị trí của mình, và xoay và vị trí của mục tiêu.

Điều tôi muốn tìm hiểu là liệu mục tiêu có nằm trong bán kính quay của tôi ở tốc độ này hay tốt hơn, tốc độ tối đa tôi có thể di chuyển là bao nhiêu để quay đầu vào mục tiêu mà không tiếp tục quay vòng quanh nó.

Có một cách hiệu quả (ish) để làm điều này?

Đây là những gì tôi đang nghĩ cho đến nay: bởi vì tôi biết tôi đang đi được bao xa trên mỗi bước và tôi xoay bao nhiêu trên mỗi bước, tôi có thể tìm ra nơi tôi sẽ ở trong hai khung hình tiếp theo. Vị trí hiện tại của tôi là p1, vị trí tiếp theo của tôi là p2 rồi p3. Tôi có thể lấy các đường phân giác vuông góc của (p1, p2) và (p2, p3). Điểm giao nhau của chúng sẽ cho tôi trung tâm của một vòng tròn. Sau đó tôi có thể kiểm tra xem mục tiêu có nằm trong vòng tròn đó không.

Tôi không chắc chắn nếu điều này sẽ hoạt động trong 3D (Tôi không chắc cách tính một hình cầu với đầu vào của tôi). Giải pháp này cũng không giúp được gì nhiều cho việc tìm đúng tốc độ di chuyển, tôi sẽ phải thử một vài lần với các tốc độ khác nhau để tìm ra tốc độ hợp lý.

Bất cứ ai có thể làm sáng tỏ một giải pháp tốt hơn?

Câu trả lời:


17

Có hai cách một đơn vị điều khiển AI với tốc độ quay bị ràng buộc và tốc độ di chuyển có thể điều chỉnh có thể đạt được mục tiêu.

Trước tiên, hãy xem xét thử thách chúng tôi đưa ra để chúng tôi có thể hiểu rõ hơn về nó:

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

Nếu người chơi di chuyển và xoay với tốc độ không đổi trong khi cố gắng đạt được mục tiêu ở bên phải hoặc bên trái, nó sẽ di chuyển theo vòng tròn mãi mãi, không bao giờ phải đối mặt với mục tiêu đó. Hai khu vực mà người chơi sẽ khoanh tròn được đánh dấu màu đỏ ở trên.

Diện tích hình tròn được đánh dấu màu đỏ có thể được tính như thế này:

radius = movementSpeed / rotationSpeedInRadians;
circlesCenterX = unitX + cos(unitAngle + / - PI) * radius;
circlesCenterY = unitY + sin(unitAngle + / - PI) * radius;

Điều này dẫn đến vị trí và bán kính của các vòng tròn màu đỏ. Chúng ta có thể sử dụng điều này để xác định xem một mục tiêu nhất định có nằm ngoài tầm với của đơn vị do AI kiểm soát hay không nếu nó tiếp tục quay về hướng của mục tiêu.

Để tìm hiểu xem một mặt hàng nào đó có nằm trong một trong các vòng tròn hay không, chúng tôi chỉ cần tính khoảng cách từ trung tâm của vòng tròn:

if ((circleX - goalX)^2 + (circleY - goalY)^2 < radius^2) //goal is within red circle

Có hai giải pháp khả thi cho việc này:

1.

Tạo khoảng cách cho đến khi mục tiêu nằm ngoài vùng màu đỏ hình tròn và sau đó quay vòng theo kiểu chữ u. Điều này rất đơn giản, hãy để đơn vị tiếp tục di chuyển cho đến khi kiểm tra trả về rằng mục tiêu không nằm trong vòng tròn này. Sau đó, bạn có thể quay lại.

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

Tùy chọn khác yêu cầu thêm một chút công việc để tính toán:

Chúng tôi vẽ một đường tưởng tượng giữa đơn vị AI và mục tiêu. Sử dụng góc giữa chúng:

angle = Math.atan2(goalY - unitY, goalX - unitX);

Bây giờ bạn cần làm như sau để tính tốc độ chính xác:

correctSpeed = rotationSpeedInRadians * (distance / 2) / cos(angle);

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

Để làm cho nó hoạt động trong trường hợp 3d:

Tìm mặt phẳng mà ba điểm sau nằm trong đó:

  1. Điểm mục tiêu.
  2. Vị trí của đơn vị AI trong khung trước.
  3. Vị trí hiện tại của đơn vị AI.

Bạn có thể sử dụng mặt phẳng đó để tính tốc độ theo cách 2d. Bạn chỉ cần chuyển đổi các dấu chấm từ giá trị 3d của chúng sang giá trị 2d được nhúng trên mặt phẳng chung của chúng.

Bạn có thể muốn sử dụng điều này:

Làm cách nào để chuyển đổi điểm 3D trên mặt phẳng sang tọa độ UV?


Hoàn hảo! Chính xác câu trả lời tôi đã hy vọng! Cảm ơn bạn đã giải thích chi tiết, tôi nghĩ rằng tôi có thể ngoại suy về điều này và sử dụng nó trong 3D.
weichsem

@weichsem Mình cập nhật câu trả lời. Ý tưởng tôi đề xuất là tìm một đồng bằng 2d phổ biến mà họ chia sẻ và sử dụng nó để tính toán tốc độ chính xác.
AturSams
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.