Phát hiện va chạm 2D


11

Giả sử tôi đang sử dụng nhân vật này.

chim
(nguồn: iconorms.com )

Làm thế nào bạn sẽ thực hiện phát hiện va chạm cho nó? Sử dụng hộp giới hạn dường như không phải là một xấp xỉ tốt, bởi vì hình dạng của con chim không ở gần hình vuông.

Tôi đã nghĩ đến việc có một loại cấu trúc dữ liệu cây tứ giác bên trong đối tượng đại diện cho các phần của hình ảnh. Mỗi chiếc lá có thể là false(trong trường hợp nó bao phủ không gian trắng / trong suốt bên ngoài con chim) hoặc true(trong trường hợp nó đại diện cho một khu vực của chim tức là mỏ, mắt, v.v.). Sau đó bằng cách nào đó kiểm tra chướng ngại vật duy nhất trong cảnh va chạm với con chim.

Nhưng vấn đề của tôi trong cách tiếp cận của tôi là:

  1. Tôi không biết làm thế nào để khởi tạo cây tứ giác.
  2. Khi cây tứ giác được khởi tạo, tôi không chắc chắn làm thế nào để vượt qua và sử dụng nó một khi chướng ngại vật nằm trong tọa độ của hình ảnh.

Làm thế nào bạn sẽ phát hiện va chạm với các nhân vật không vuông?

LE: Cách tiếp cận khác tôi từng thấy là sử dụng nhiều hộp giới hạn. Ví dụ: tôi có một hoặc một vài hộp giới hạn cho mỏ, sau đó một vài trong số chúng cho tóc hoặc đuôi. Nhưng nó có thể trở nên tẻ nhạt. Nếu đây là một cách tiếp cận hợp lệ trong trường hợp của tôi, làm thế nào tôi có thể tạo ra các hộp giới hạn đó? Tôi nghi ngờ tôi phải có chúng được mã hóa cứng trong chương trình của tôi.

LE2: Tôi quan tâm đến những va chạm khá chính xác. Tôi không thể tưởng tượng làm thế nào một hộp hoặc vòng tròn giới hạn ít nhất có thể xấp xỉ gần đúng hình dạng đó, vì vậy phương pháp này sẽ không hiệu quả.


2
Lưu ý chung: Tôi sẽ sử dụng cả hai, hộp giới hạn và kiểm tra chi tiết hơn: Kiểm tra chi tiết sẽ có hình phạt hiệu suất cao hơn, vì vậy bạn muốn nó chạy càng hiếm càng tốt. Do đó, trước tiên hãy kiểm tra hộp giới hạn và chỉ khi nó bị bắn trúng, hãy đi sâu hơn và kiểm tra phương pháp chi tiết hơn của bạn (điều đó sẽ xảy ra).
Philip Allgaier

Cảm ơn, dù sao tôi cũng đã định làm điều đó, nhưng tôi không hoàn toàn chắc chắn 'kiểm tra chi tiết' nên là gì. :)
async

1
Chi tiết quan trọng duy nhất còn thiếu: Bạn muốn làm gì với nó? Bạn có quan tâm về va chạm chính xác? Bạn có vui khi ước chừng nhân vật có hình tròn không? Bạn có muốn các hạt bụi va chạm với mắt của nhân vật với phần còn lại không?
Anko

@Anko Làm thế nào bạn có thể ước chừng hình dạng đó với một vòng tròn? Tôi quan tâm đến các va chạm khá chính xác - không thực sự là pixel chính xác, nhưng một cái gì đó sẽ trông tốt / tự nhiên-.
async

1
Như thế này . "Tốt" và "tự nhiên" thậm chí có nghĩa là gì? Đây có phải là một câu hỏi triết học?
Anko

Câu trả lời:


12

Máy va chạm vòng tròn. Đủ tốt cho điều đó tôi sẽ nói trừ khi bạn đang làm điều gì đó lạ mắt với những phần nhất định bị ảnh hưởng bởi vật lý hoặc sự va chạm trông không tự nhiên, và ngay cả khi bạn cần chia nó thành nhiều phần tôi có một điều muốn nói với bạn:

Đừng quá phức tạp.

Bạn không cần một cấu trúc cây tứ giác đầy đủ cho việc này. Chỉ cần có một vài hộp hoặc vòng tròn trong một mảng thẳng, và sau đó giao với tất cả chúng. Đây có thể không phải là hiệu suất đủ quan trọng và bạn sẽ không đạt được nhiều như vậy khi sử dụng cây tứ giác.


3
Đúng, chỉ cần tạo một mảng nhỏ gồm nhiều hình dạng nếu một hình dạng duy nhất không che phủ nó. Ví dụ: i.imgur.com/Dd4yyGN.png
MichaelHouse

Cảm ơn Jonkel & @ Byte56. Sử dụng một vài hình dạng có vẻ là giải pháp phù hợp trong tình huống của tôi. Đơn giản để thực hiện, chính xác và nhanh chóng. Không thể tin rằng tôi đã nhảy thẳng đến cây bốn lá mà không xem xét điều này! Ừm
async

Một máy va chạm hình tròn cho thân và hình chữ nhật cho mỏ, cho độ chính xác cao hơn.
Kroltan

14

Quy trình kiểm tra hai bước

Bước đầu tiên, bạn kiểm tra hộp giới hạn , và nếu không có va chạm ở đó, thì thử nghiệm đã kết thúc. Nếu có va chạm, bạn chuyển sang đường chuyền thứ hai

Ở đường chuyền thứ hai , nếu bạn muốn độ chính xác cao hơn và bạn muốn một giải pháp hoàn hảo pixel thực sự, thì bạn có thể làm điều đó, một đường chuyền kiểm tra hoàn hảo pixel

Vì hình ảnh của bạn là PNG (hoặc bất kỳ định dạng tệp nào khác có chứa kênh alpha) nên việc này khá dễ dàng

  1. Tính diện tích giao nhau giữa một đối tượng trong cảnh và con chim, tạo ra một hình chữ nhật giao nhau đơn giản trên cả hai hình ảnh
  2. Trong giao điểm đó, kiểm tra xem mỗi pixel có giá trị alpha> 0 trong CẢ HAI hình ảnh
  3. Nếu có bất kỳ pixel nào như vậy tồn tại, bạn đã va chạm. Nếu không thì không

Nếu bạn nhìn vào kênh alpha hình ảnh của mình, bạn có thể thấy nó đã có tất cả thông tin bạn cần như thế nào cho xung đột hoàn hảo pixel

kênh alpha từ hình ảnh

Các va chạm hoàn hảo của pixel thường rất tốn kém, do đó, việc ước tính sơ bộ ban đầu bằng hộp giới hạn hoặc hình va chạm chi tiết hơn (Giống như cách Anko đề xuất) có thể giúp bạn tiết kiệm thời gian quý báu

Hộp giới hạn va chạm chi tiết "tốt hơn" Anko đề xuất:

hộp giới hạn chi tiết hơn

PS: Nếu hình ảnh của bạn có quầng sáng, hiệu ứng hoặc kênh alpha khác 0 xung quanh nó mà bạn không muốn va chạm, ngưỡng thuật toán có thể dễ dàng được điều chỉnh để phù hợp với điều đó


1
Cảm ơn bạn! Nhưng tôi sẽ không cần pixel chính xác hoàn hảo. Câu trả lời tuyệt vời mặc dù, sẽ hữu ích vào một ngày sau đó.
async

tất nhiên, bạn đời, vâng, sự va chạm hoàn hảo của pixel hầu như luôn là một sự quá mức, ngoại trừ trong các trò chơi thực sự cần nó (như máy bay chiến đấu 2D)
codemonkey

3

Tôi sẽ sử dụng một vòng tròn cho cơ thể và một hình chữ nhật duy nhất cho mỏ, nhưng đó chỉ là ý kiến ​​của tôi. Mặc dù quá phức tạp hình học va chạm của bạn có thể làm chậm ứng dụng của bạn, thực tế bạn đang nhân đôi (hoặc nhiều hơn) số lượng ký tự trên màn hình.


0

Có lẽ bạn có thể sử dụng một số loại máy va chạm đa giác / cạnh.

Không chắc chắn chính xác làm thế nào điều này sẽ làm việc, nhưng:

hai đối tượng: đối tượng 1: con chim (o1), đối tượng 2: vật có thể đâm vào con chim (o2)

1) Xác định hình dạng giới hạn là hình đa giác vừa khít với đối tượng đầu tiên (o1) trong câu hỏi.

2) Lấy các cạnh của o1, o2 có thể va chạm có thể tưởng tượng được mà không có thể va chạm có thể hình dung mà không có o2 đi qua o1 hoặc ngược lại.

Với vị trí và kích thước của hình dạng (o2), bạn có thể cô lập các cạnh (của o1) mà không thể hiểu được, cho dù đó là "phía sau" một cạnh khác (của o1) gần với o2 hơn. Nếu bạn có một tam giác vuông có cạnh huyền hướng lên và phải và một hình chữ nhật tiếp cận thẳng (với cạnh dài dọc theo trục x) thì bạn có thể biết các cạnh nào bị bỏ qua vì cả hai giá trị y bắt đầu và kết thúc đều là trên hoặc dưới hình chữ nhật.

3) Xác định xem một trong các điểm trên cạnh của o2 có giống với một điểm trên bất kỳ cạnh nào của o1 mà bạn đã chọn trong bước 2 không.

khái niệm này có thể hoạt động tốt nhất để va chạm đa giác (tức là những thứ có cạnh rõ ràng), nhưng có lẽ bạn có thể coi một vòng tròn là một cạnh dài (ví dụ nếu o2 là một vòng trò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.