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).
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 t
và d
(rất đơn giản: đối với bất kỳ t
và d
giá 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 d
củ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ừ t
vị 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).