Cách hiệu quả nhất để tìm điểm giao nhau của tên lửa và địa hình bitmap là gì?


10

Theo dõi câu hỏi trước đây của tôi về việc tìm độ dốc của địa hình bitmap 2D, bây giờ tôi cần biết cách tốt nhất để tìm điểm trên địa hình 2D mà tên lửa tấn công. Rõ ràng, tôi có thể thấy nếu có bất kỳ pixel nào dưới địa hình giao nhau của tên lửa, nhưng nói rằng nó đã di chuyển khá sâu vào địa hình.

Cách tốt nhất để lùi lại để tìm nơi va chạm ban đầu là gì? Tôi có thể di chuyển trở lại các pixel X tại một thời điểm về vị trí trước đó của tên lửa, nhưng giá trị tốt của X là gì? Và có cách nào thông minh hơn không? Có thể di chuyển một nửa khoảng cách, sau đó một phần tư vv?


Hiện tượng bạn mô tả thường được gọi là "đường hầm", và cách tốt nhất để giải quyết nó là giới thiệu một thử nghiệm quét - vì TetraD và JasonD đều được đề cập dưới đây.
jpaver

chỉ nói "kiểm tra quét" không thực sự giúp tôi. Làm thế nào để tôi làm điều đó với một địa hình bitmap?
Iain

Đề nghị của Jason dường như là tốt nhất với tôi: một pixel mỗi lần.
jpaver

Câu trả lời:


3

Để kiểm tra va chạm, bạn không nên thực hiện kiểm tra tĩnh tick-by-tick, bạn nên thực hiện kiểm tra dấu vết / quét.

Có một danh sách đầy đủ các công thức khác nhau cho các loại nguyên thủy khác nhau ở đây: http://www.realtimerendering.com/intersections.html

Tất nhiên, đó là giả sử bạn có thể chia địa hình của mình thành một số loại nguyên thủy mà bạn có thể kiểm tra (ví dụ: các đoạn đường). Có nhiều cách khác nhau để làm điều đó.

Xem thêm câu hỏi này (chỉ liên quan một chút): Thuật toán tốt để phát hiện va chạm giữa các quả cầu chuyển động là gì?


Tôi đã suy nghĩ về một địa hình bitmap có thể phá hủy như trong Worms. Bạn có thể tự động tạo ra các nguyên thủy từ một bitmap hoặc điều đó quá điên rồ?
Iain

1
Tôi chắc chắn rằng bạn có thể, nhưng có thể dễ dàng hơn / nhanh hơn chỉ bằng cách kiểm tra pixel bằng cách kiểm tra pixel cho một bitmap tùy ý.
Tetrad

VỚI MỘT QUADTREE !! (vì vậy nó sẽ không mất mãi mãi)
bobobobo

3

Tìm kiếm nhị phân sẽ không giúp ích gì nếu bạn có những mảnh nhỏ của cảnh vật và những viên đạn di chuyển nhanh - bạn có thể bỏ lỡ chúng.

Tôi nghĩ rằng lựa chọn tốt nhất của bạn là quét một đường ngang qua mặt trước của đường đạn dọc theo đường đi của nó, pixel tại một thời điểm. Bạn có thể thực hiện kiểm tra giới hạn trước trên toàn bộ âm lượng để tránh thực hiện từng bước.


Tìm kiếm nhị phân là gì?
Iain

1
Xin lỗi - tìm kiếm nhị phân ít nhiều là những gì bạn đã nói trong câu hỏi. Bạn bắt đầu ở giữa và chia không gian tìm kiếm cho hai cho đến khi bạn hội tụ câu trả lời. Nó tối ưu trong nhiều trường hợp, nhưng trong trường hợp của bạn thì nó không hoạt động (bạn có thể bỏ qua hoàn toàn câu trả lời đúng).
JasonD

3

Vì tên lửa không có khả năng di chuyển một lượng lớn pixel mỗi khung hình (nó sẽ không mượt trên màn hình) Tôi không có lý do gì để không kiểm tra từng pixel trên đường dẫn. Thuật toán dòng Bressenham là bạn của bạn và đảm bảo rằng bạn cũng có một bản sao cục bộ của bitmap vì bạn thường không muốn truy cập bộ nhớ video cho mỗi pixel. Điều này giả định rằng địa hình bitmap của bạn là hoàn toàn ngẫu nhiên (theo địa hình sâu có thể phá hủy). Nếu thế giới của bạn dựa trên gạch, bạn có thể bỏ qua mọi ô mà bạn biết là trống để bắt đầu, nhưng như đã đề cập trước đó, trừ khi bạn có một số lượng lớn tên lửa để kiểm tra, tôi không thể nghĩ rằng một nền tảng cần quá chậm để chỉ kiểm tra pixel theo pixel và bạn sẽ không cần phải xác định thế giới của mình theo nguyên thủy (một bản sao giun sẽ khiến điều đó trở nên khó khăn)


vâng tôi đã suy nghĩ một địa hình giống như giun. Bạn có thể chia nó thành các ô một cách linh hoạt, sau đó chỉ cần đánh dấu các ô trống để không được kiểm tra? Nếu có rất nhiều tên lửa cùng một lúc, có lẽ điều đó sẽ tăng tốc mọi thứ lên một chút?
Iain

Vì vậy, bạn có nghĩ rằng tôi sẽ di chuyển về phía trước pixel theo pixel, kiểm tra giao lộ, thay vì lùi về phía sau?
Iain

Tôi nghĩ rằng cả ba câu trả lời đã gợi ý một tìm kiếm về phía trước. Kiểm tra ngược sẽ không hoạt động nếu bước chuyển tiếp làm cho nó bỏ qua một số cảnh.
JasonD

Vâng, chắc chắn về phía trước.
Kaj

1

Ngoài các câu trả lời khác, có một số điều bạn có thể làm để tăng tốc độ này nếu bạn muốn làm một sổ sách nhỏ liên quan đến việc "thu thập" một loạt pixel thành các khối "trạng thái tương tự đã biết". Ví dụ: bạn có thể lưu trữ chiều cao của mảnh địa hình cao nhất, vì vậy bạn có thể chấp nhận rằng tên lửa sẽ không trúng bất cứ thứ gì miễn là nó ở trên mức đó. Bạn cũng có thể lưu trữ chiều cao của không gian "không khí" thấp nhất, vì vậy bạn sẽ biết rằng nếu tên lửa đạt đến độ cao đó thì nó phải trúng một thứ gì đó (mặc dù điều này có thể được sử dụng tốt nhất để kiểm tra độ tỉnh táo). Đi xa hơn thế này, bạn có thể lưu trữ các hình chữ nhật đại diện cho các khu vực là tất cả các địa hình và các hình chữ nhật khác đều là không khí, nhưng đó có thể là công việc nhiều hơn giá trị.

Cuối cùng, phương pháp tốt nhất có lẽ là "lưu trữ chiều cao của từng cột địa hình" và sau đó chỉ tính chiều cao của tên lửa ở mỗi bước trên đường đi của nó. Tôi không thể nói chuyện với các trò chơi hiện đại hơn, nhưng tôi tin rằng khi bạn tạo ra một "hang động" ở Thằn lằn, địa hình phía trên hang động đó rơi thẳng xuống, không để lại phần nhô ra. Nếu bạn muốn nhô ra, công việc sẽ lớn hơn một chút, nhưng nó sẽ là một phần mở rộng của ý tưởng cơ bản này. (Gợi ý: lấy ý tưởng cơ bản làm việc trước!)

Vì địa hình của bạn có lẽ hoàn toàn tùy ý, không có phím tắt. Ngay cả khi bạn buộc địa hình của mình là một spline hoặc một cái gì đó, điều đó sẽ gây khó chịu khi bạn bắt đầu phá hủy nó và các bài kiểm tra giao cắt đường nối là lặp đi lặp lại và không hoàn hảo hoặc đầy đủ và chậm chạp vô cùng cho loại vấn đề của bạn.

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.