Trong các game đua xe 3d rất đơn giản, va chạm được xử lý như thế nào?


9

Tôi đã tự hỏi làm thế nào va chạm trong một số trò chơi đua xe 3d đơn giản được thực hiện (đặc biệt là trong các trò chơi như Outrun 2 / Motoracer).

Trong các trò chơi đua xe cổ điển với môi trường phức tạp (thế giới mở), tôi đoán điều này được thực hiện với một hộp cơ bản (dành cho xe hơi) để va chạm máy bay (để theo dõi, xây dựng một thứ khác). Toàn bộ điều sẽ được tối ưu hóa bằng cách sử dụng một số hộp giới hạn (đây là cách thực hiện va chạm trong nhiều trò chơi).

Trong một trò chơi như Outrun 2 / Motoracer, lối chơi đơn giản đến mức các nhà phát triển có thể không cần điều đó và mọi thứ có thể đã được đơn giản hóa rất nhiều. Đối với những người không bao giờ chơi nó, đây là những gì rất cụ thể:

  • Xe / xe đạp luôn được dán trên đường.
  • Con đường luôn có cùng kích thước và có hình dạng rất đơn giản.
  • Khả năng duy nhất là đi theo con đường đó, không thể rời khỏi con đường hoặc va chạm với thứ khác (trừ những chiếc xe / xe đạp khác nhưng chúng tôi không quan tâm).
  • Khi bạn va chạm với đường, va chạm arcade rất cơ bản được thực hiện (chiếc xe chỉ đơn giản là bị đẩy ra khỏi nó)

Đây là cách tôi nghĩ rằng va chạm (có thể) đã được thực hiện:

Toàn bộ bản nhạc có thể được coi là khổng lồ một đường cong 3d bezier. Từ đường cong đó, các đa giác đường có thể được tạo ra (sử dụng các vectơ trước, trái và lên được tạo từ đường cong). Các yếu tố khác (như nhà cửa, cây cối, ...) cũng có thể được đặt và căn chỉnh bằng phương pháp này.

Sau đó, để xử lý các va chạm (và vẽ xe):

1) Tìm vị trí gần nhất trên đường cong 3d từ vị trí 3d xe hiện tại. Nói cách khác, chuyển đổi vị trí xe 3d thành vị trí đường cong bezier. Mọi vị trí 3d trên đường có thể được coi là chuyển vị dọc theo đường cong 3d ( t) + chuyển vị ngang ( d). Kiểm tra hình ảnh bên dưới nếu nó không rõ ràng (đây là ví dụ 2d nhưng điều này áp dụng cho 3d dễ dàng).

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

khi t = 0 xe ở đầu phần theo dõi, khi t = 1 xe ở cuối. khi d = -1 hoặc 1 ô tô ở biên giới của đường đua, khi d = 0 xe ở giữa đường

2) căn chỉnh xe với đường bằng cách sử dụng td(rất đơn giản: đối với bất kỳ tdgiá trị nào tôi có thể có được vị trí 3d + vectơ lên ​​/ trước / trái). chiếc xe bây giờ được dán trên đường

3) kiểm tra sự dịch chuyển bên dcủa xe. nếu giá trị quá lớn (d > 1)hoặc (d < -1)xe thấp sẽ không theo dõi được. Chỉ cần kẹp nó để đặt xe vào đúng chỗ.

Điều này cũng làm cho việc loại bỏ 3d rất đơn giản, chỉ cần vẽ đường đua từ tvị trí xe hiện tại đến t + some_big_enough_value_to_avoid_visible_clipping.

Hoặc có lẽ tôi đã hoàn toàn sai: sẽ nhanh hơn và đơn giản hơn khi chỉ kiểm tra va chạm của xe (hộp giới hạn) và một bộ đa giác rất đơn giản đại diện cho đường đua (không có các tòa nhà và như vậy). Thế giới 3d (và mô hình colision kết quả) đơn giản sẽ được tạo trước đó, bằng cách sử dụng một số công cụ của bên thứ 3 (không còn đường cong 3d khi chạy trò chơi, chỉ là một loạt các đa giác).

Câu trả lời:


16

Tôi đã làm việc trên một vài trò chơi thương mại tương tự như những gì bạn mô tả.

Trong mỗi trò chơi đó, chúng tôi thực sự có các đa giác tạo ra một "bức tường" vô hình dọc theo các cạnh của đường đua và thực hiện thử nghiệm va chạm truyền thống chống lại những bức tường đó. Điều này có nghĩa là chúng ta có thể có một số mối nguy hiểm có thể va chạm bổ sung ở bên đường, bên trong các bức tường vô hình và cũng cho phép chúng tôi thay đổi độ rộng đường nhanh hơn bạn thường có thể bằng cách tiếp cận spline.

Nhưng như đã nói, chúng tôi cũng đã làm những gì bạn liệt kê trong phần tôi nghĩ rằng sự va chạm sẽ hoạt động để bảo vệ chống lại sự cố / sự cố va chạm và hệ thống này cũng được sử dụng rất nhiều để chạy đua logic AI. Chúng tôi cũng đã sử dụng nó để xác định những chiếc xe nào đang dẫn đầu, để chúng tôi có thể hiển thị chỉ báo "1/2/3 / etc" trên HUD. Đôi khi dữ liệu này cũng được sử dụng để hồi sinh xe sau một vụ tai nạn lớn.

Một điều bạn đã bỏ lỡ trong cách tôi nghĩ rằng va chạm sẽ hoạt động là khi bạn làm việc với các spline như thế này, thông thường bạn sẽ cung cấp cho các spline sườn. Sườn là các bit dữ liệu biểu thị khoảng cách theo dõi kéo dài sang một bên theo mỗi hướng từ spline. Vì vậy, đối với một spline dài 100 mét, bạn có thể có 50 xương sườn, cho chiều rộng theo dõi cứ sau hai mét dọc theo chiều dài của nó. Điều này cho phép theo dõi của bạn để thay đổi độ rộng dọc theo phạm vi của nó. Trong các trò chơi tôi đã làm việc, các xương sườn này cũng đã phân biệt giữa "bề mặt theo dõi" và "khu vực có thể lái được". Vì vậy, bạn có một bộ chiều rộng đường cho biết khoảng cách giữa đường spline bạn có đường nhựa đẹp, và sau đó một chiều rộng khác cho biết cát / cỏ / bất cứ thứ gì đi ra ngoài khoảng cách đó. Điều đó cho phép người chơi có thể lái xe một khoảng cách hợp lý khỏi đường đua, nhưng vẫn có AI biết mặt đường thực sự ở đâu.

Nhiều trò chơi tôi từng làm cũng đã lưu trữ dữ liệu khác trong các khung sườn; một trò chơi nướng thông tin ánh sáng theo dõi vào các xương sườn, để dễ dàng tính toán xem một khu vực có bị bóng hay không (sau đó được sử dụng để kết xuất xe hơi, quyết định có nên vẽ ống kính flare và các hiệu ứng khác hay không). Một thông tin khác về các vị trí máy ảnh điện ảnh có thể thấy một phần của spline, vì vậy chúng tôi không phải thực hiện các phép tính tầm nhìn trong khi phát lại. Một thông tin khác bao gồm thông tin về số lượng làn đường trên spline, hướng họ đã đi và chuyển vị ngang nơi mỗi làn đường được đặt. Điều này cho phép chúng tôi bao gồm những chiếc xe giao thông có thể lái chính xác trong làn đường. Sườn là tuyệt vời để lưu trữ bất kỳ loại dữ liệu khác nhau mà bạn có thể cần về mặt đường của bạn.

Sườn thường được lưu trữ trong một mảng có liên quan đến spline. Vì lý do tốc độ, việc triển khai bình thường sẽ có các sườn cách đều nhau, do đó, khi bạn biết khoảng cách của một đối tượng dọc theo spline, bạn có thể tính chỉ số sườn gần nhất trong mảng bằng cách chia khoảng cách dọc theo spline cho khoảng cách giữa các sườn. Nếu không, bạn bị mắc kẹt khi thực hiện tìm kiếm nhị phân thông qua mảng sườn của bạn để tìm dữ liệu độ rộng đường chính xác.

Mô tả loại bỏ của bạn cung cấp một mô tả cơ bản tốt về cách sử dụng phương pháp spline, nhưng thực tế nó phức tạp hơn một chút so với bạn đề xuất - nếu bạn sử dụng spline để loại bỏ theo cách này, thì những chiếc kẹp tóc dài thường không vẽ ngược lại của ngã rẽ, vì khi được đo bằng khoảng cách dọc theo đường đua, phía đối diện của ngã rẽ có thể ở rất xa, ngay cả khi nó chỉ cách vài mét khi được đo khi con quạ bay. Ngoài ra, khoảng cách mà hình học thế giới có thể được nhìn thấy thường khác với khoảng cách mà lưới theo dõi có thể được nhìn thấy, vì vậy những khoảng cách đó không thực sự phù hợp với hệ thống này. Kinh nghiệm của tôi là trong hầu hết các trường hợp, tốt hơn hết là không nên dựa vào logic theo dõi để xác định xem có nên vẽ mô hình hay không; nó đáng tin cậy hơn nhiều và gây ra ít trục trặc hơn khi sử dụng thử nghiệm tiêu chuẩn máy ảnh tiêu chuẩn cho điều đó.


Thông tin và thú vị để đọc câu trả lời
onedayitwillmake

0

Trong tay đua OpenGL của tôi, ban đầu tôi đã bắt đầu bằng cách sử dụng hai vòng tròn để xác định đường viền của bản nhạc, nhưng có vẻ như quá nhiều rắc rối. Tôi chỉ sử dụng glReadPixel để đọc màu pixel. Nếu xe của người chơi vượt quá pixel (màu cỏ), thì chuyển động sẽ bị hạn chế hơn nữa. Có rất ít ảnh hưởng đến hiệu suất.


Âm thanh này giống như bạn mô tả trò chơi 2D (vòng tròn, va chạm bởi màu pixel). Có phải vậy không Sau đó, câu trả lời là offtopic.
Kromster

Tôi đang đề cập đến một trò chơi trong chiếu phối cảnh. glReadpixel có thể được áp dụng ở chế độ phối cảnh 2d ortho hoặc 3d.
ztech79
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.