Làm thế nào một người sẽ xác định vị trí của một người tham gia trong một trò chơi đua xe?


9

Bây giờ, để ghi lại, tôi hiện không thực hiện bất kỳ trò chơi đua xe nào, nhưng vấn đề này chỉ xuất hiện trong đầu tôi và bây giờ tôi tò mò.

Vậy làm thế nào một người có thể tìm ra người tham gia cuộc đua nào hiện đang là người đầu tiên? Nó không thể là một cái gì đó tầm thường như chỉ sắp xếp theo khoảng cách đến vạch đích bởi vì điều đó sẽ rất không chính xác trên hầu hết các khóa học. Tôi đã nghĩ về việc làm một cái gì đó như tách tuyến đường thành các đoạn thẳng, mỗi đoạn có một vectơ chỉ đường. Trò chơi sau đó sẽ kiểm tra khi ai đó vượt qua người khác bằng cách chiếu vị trí của họ lên vectơ đó và kiểm tra xem cái nào ở phía trước. Nếu vị trí đã thay đổi, trò chơi sẽ tăng / giảm chúng một cách thích hợp. Nhưng điều đó có vẻ hơi quá phức tạp.

Có ai biết bất kỳ phương pháp thành lập hoặc có bất kỳ kinh nghiệm trong việc thực hiện một số?

Câu trả lời:


12

Shawn Hargreaves mô tả cách MotoGP sử dụng hệ thống vị trí theo dõi tương đối đặc biệt . Bỏ qua vị trí y dọc, tọa độ x / z Cartesian được dịch sang hệ thống theo dõi tương đối. Điều này có nhiều lợi ích cho các tính toán liên quan đến vị trí tương đối của những người tham gia trong một trò chơi đua xe (ví dụ cho AI):

Một đơn giản hóa phổ biến là thu gọn 3D thành 2D. Mặc dù kết xuất và vật lý có thể thực sự là 3D, logic đưa ra quyết định không cần phải đối xử bình đẳng với cả ba trục. Các bản nhạc MotoGP có vài ngọn đồi, vì vậy AI của chúng tôi đã có thể bỏ qua thành phần y.

Tiếp theo, chúng tôi đã chuyển từ tọa độ cartesian x / z sang hệ thống theo dõi tương đối. Vị trí được đại diện bởi một cặp giá trị:

int distance = khoảng cách bao quanh đường đua, được lưu trữ ở định dạng 16.16 điểm cố định

  • 0 = vạch xuất phát
  • 0x8000 = nửa vòng
  • 0x10000 = lặp lại từ đầu
  • 0x1C000 = ba phần tư chặng đường qua vòng thứ hai

float cross = khoảng cách ngang qua đường 0 = trên đường trung tâm

  • -1 = cạnh trái của bề mặt đua
  • 1 = cạnh phải của bề mặt đua

Để chuyển đổi giữa tọa độ này và tọa độ cartesian được sử dụng bởi mã vật lý và mã kết xuất của chúng tôi, chúng tôi đã lưu trữ một danh sách các phân đoạn xác định hình dạng của bề mặt đua: struct TrackSegment {Vector CenterPoint; float Khoảng cáchLeftEdge; float Khoảng cáchRightEdge; }

Chúng tôi đã tạo ra hàng trăm cấu trúc này, cách đều nhau trên đường đua, bằng cách kết hợp các đường cong Bezier mà từ đó các bản nhạc được tạo ra ban đầu. Điều này đã cho chúng tôi đủ thông tin để viết các hàm chuyển đổi tọa độ cần thiết.

Với tọa độ theo dõi, nhiều phép tính hữu ích trở nên đơn giản:

if (abs(cross) > 1)
    // You are off the track and should steer back toward the center line


if (this.distance > other.distance)
    // You are ahead of the other player (even though you may be
    // physically behind in 3D space if you have lapped them)


short difference = (short)(this.distance - other.distance);

if (abs(difference) < threshold)
    // These two bikes are physically close together,
    // so we should run obstacle avoidance checks

Do định dạng dữ liệu điểm cố định, việc truyền bộ đếm khoảng cách từ 32 đến 16 bit là một cách dễ dàng để loại bỏ số vòng đua, vì vậy chúng tôi có thể chọn và chọn tính toán nào được quan tâm nếu hai chiếc xe đạp nằm trên các vòng đua khác nhau, thay vì muốn biết liệu chúng có đã gần trong không gian vật lý. Nhờ vào sự kỳ diệu của lời khen của hai người, coi sự khác biệt như 16 bit đã ký cho khoảng cách ngắn nhất bất kể xe đạp nào ở phía trước (hãy nhớ rằng trong hệ thống số học modulo như đường đua vòng có hai khoảng cách có thể, như bạn có thể đo được hoặc hướng xung quanh theo dõi). Điều này hoạt động ngay cả khi hai chiếc xe đạp ở hai bên đối diện của vạch xuất phát, một tình huống sẽ yêu cầu logic trường hợp đặc biệt dễ bị lỗi trong hầu hết các hệ tọa độ khác.

Làm phẳng và làm thẳng khu vực chơi trò chơi ảo này giúp dễ dàng suy luận về những điều như "tôi có trên đường đua không?" hoặc "Tôi đang đi nhanh phía sau chiếc xe đạp khác này: tôi có nhiều chỗ hơn để vượt qua chúng ở bên trái hay bên phải không?" đó sẽ là khó khăn để thực hiện trong một không gian thế giới 3D đầy đủ. Khi chúng tôi quyết định chuyển sang bên trái, chúng tôi sẽ chuyển đổi tọa độ theo dõi kết quả trở lại vào không gian thế giới, tại đó độ cong của đường đua được tính đến, cho thấy cách chúng tôi nên điều khiển để hoàn thành mục tiêu đã chọn.


Rất đẹp! Cảm ơn rất nhiều. Cũng cảm ơn vì đã thêm các thẻ thích hợp. Tôi đã không thể làm như vậy do thiếu danh tiếng. Chúc mừng.
Marc Müller

3

Tôi đoán rằng tôi sẽ sử dụng thực tế là con đường thường được xây dựng bằng cách sử dụng các spline, do đó mọi cạnh của đường đều có vị trí spline tương ứng và sử dụng để bạn có thể xác định (xấp xỉ hoặc hạt mịn nếu bạn chia nhỏ hơn) vị trí spline của mỗi chiếc xe là, và do đó ai là người dẫn đầu. Vì vậy, ít nhiều theo cách bạn đề xuất, chỉ cần sử dụng spline.


3

Bạn đã ít nhiều trả lời câu hỏi của riêng bạn, tôi nghĩ vậy. Chia theo dõi thành các phân khúc, theo dõi phân khúc của từng chiếc xe và chiếu những chiếc xe lên một đường qua giữa phân khúc thích hợp (về mặt toán học, đây là một sản phẩm chấm đơn giản, nên không phức tạp chút nào). Rất đơn giản để cung cấp cho mỗi chiếc xe một "khoảng cách" mà bạn có thể sắp xếp cho vị trí.

Các phân đoạn cung cấp cho bạn một số lợi ích bổ sung - bạn có thể đảm bảo rằng ô tô không bị cắt góc (hoặc nói chung là cắt ngắn), đi lùi hoặc các mánh gian lận khác.

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.