Phát hiện va chạm dốc 45 độ


8

Tôi có một trò chơi đơn giản trong đó người chơi di chuyển một quả bóng xung quanh. Bóng bật ra khỏi tường. Ngay bây giờ tôi đã triển khai các bức tường vuông (■): Tôi sử dụng các va chạm hộp giới hạn đơn giản để kiểm tra xem người chơi sẽ di chuyển vào tường khi cập nhật tốc độ x hoặc y của nó và nếu vậy, tôi nhân tốc độ đó với -1 để làm cho chúng bật lên .

Tuy nhiên, tôi cũng muốn thực hiện các mảnh hình tam giác (). Để trả lại tôi tin rằng người ta có thể sử dụng đơn giản:

   newxspeed = -1*yspeed;
   newyspeed = -1*xspeed;

Tuy nhiên, điều tôi gặp khó khăn là phát hiện va chạm: Khi nào thì người chơi chạm đường chéo?


2
Tôi rất khuyến khích hướng dẫn N ( phần 1 , phần 2 ) về chủ đề này.
Chris Burt-Brown

Cảm ơn rât nhiều. Hướng dẫn đó thực sự đã giúp tôi cuối cùng hiểu cách giải quyết điều này.
Qqwy

Trên thực tế, rất khó để tôi đánh dấu một trong những câu trả lời là 'giải pháp' vì tất cả chúng đều giúp tôi hiểu vấn đề nhưng không ai trong số họ giải quyết được hoàn toàn. Tôi nên làm gì?
Qqwy

Câu trả lời:


8

Trước hết, để tính toán phát hiện va chạm giữa một hình cầu (hình tròn trong 2D) và đường thẳng bạn cần tính toán vectơ vuông góc giữa tâm của quả bóng chuyển động và đường thẳng, để tính khoảng cách này bạn cần làm như sau:

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

Vì vậy, để tính d trong hình trên, chúng ta cần thực hiện một số bước.

  1. Giả sử đường của bạn đang sử dụng phương trình tham số P (t) = S + t V lưu ý rằng V là hướng đường có thể thu được bằng cách trừ (P2 - P1).
  2. Từ Pythagoras:

d ^ 2 = len ( Q - S ) ^ 2 - len (proj ( Q - S )) ^ 2

Sau đó, bạn mở rộng phương trình để có được những điều sau đây, có vẻ hơi phức tạp nhưng thực tế không phải vậy.

d = sqrt (len ( Q - S ) ^ 2 - len (( Q - S ) chấm V ) ^ 2 / V ^ 2)

Trong đó Q là tâm của đường tròn và S là bất kỳ điểm nào trên đường thẳng. Khi khoảng cách nhỏ hơn bán kính hình tròn / hình cầu, bạn cần kích hoạt phản ứng va chạm được giải thích ở điểm tiếp theo.

Không đúng khi luôn lật thành phần x hoặc y để nảy bóng, điều bạn cần làm là phản xạ vectơ vận tốc, để làm như vậy, bạn cần tính toán vectơ Bình thường của bề mặt và sử dụng bình thường đó để tính toán phản xạ vectơ sử dụng phương trình sau

R = 2 * ( V chấm N ) * N - V

Trong đó R là vectơ phản xạ, N là bình thường của bề mặt và V là vectơ Vận tốc.

Trong trường hợp 45 độ bề mặt bình thường của bạn sẽ là N = (1,1,0) với các dấu hiệu khác nhau tùy thuộc vào hướng nào của các mặt bình thường (vị trí hoặc âm).


Bạn sử dụng một phương trình tuyệt vời. Tuy nhiên, rất khó để theo dõi đối với một người chưa quen với vectơ. Sẽ rất hữu ích nếu bạn chia phương trình của mình thành các bước nhỏ hơn.
Qqwy

Nhân tiện, N là một vectơ 2 chiều hay 3 chiều? Giá trị thứ ba (0) đến từ đâu?
Qqwy

Tôi đã sử dụng vectơ 3D vì tôi cho rằng bạn đang sử dụng API 3D (và tôi có thể sai) trong trường hợp đúng là bạn cần đặt thành phần thứ 3 là 0, nhưng dù sao phương trình sẽ hoạt động cho cả 2D và 3D (và có thể cao hơn kích thước nhưng điều đó không thực sự quan trọng). liên quan đến các phương trình tôi có thể giải thích thêm nhưng tôi cần một chút thời gian để chỉnh sửa câu trả lời.
Concept3d

1
Tôi đã chỉnh sửa câu trả lời Tôi hy vọng nó có ý nghĩa hơn bây giờ .. btw Tôi hy vọng stackexchange có thể cung cấp một cách thuận tiện để viết các công thức toán học vì nó dễ bị lỗi và dễ bị lỗi ngay bây giờ.
Concept3d

6

Bạn muốn đo khoảng cách giữa tâm bóng và tường, vì vậy:

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

giải hệ thống mà bạn nhìn thấy trong hình sẽ cho bạn tọa độ của điểm d.

Sau đó, nếu khoảng cách giữa điểm d và c nhỏ hơn hoặc bằng bán kính của quả bóng r, có một sự va chạm giữa quả bóng và bức tường


5

Balls thực sự là những đối tượng khá đơn giản để phát hiện va chạm. Chúng va chạm với địa hình khi khoảng cách giữa tâm của quả bóng và mép địa hình trở nên nhỏ hơn bán kính của quả bóng. Vị trí của tâm bóng phải tầm thường để có được. Tìm điểm gần nhất của địa hình thường phức tạp hơn và cách tốt nhất để làm điều đó phụ thuộc vào cách thể hiện địa hình.

Thuật toán của bạn để tính vận tốc mới sau khi thoát khỏi độ dốc đường chéo là không chính xác. Đảo ngược cả tọa độ x và y sẽ làm cho quả bóng quay trở lại theo cùng hướng mà nó tiếp cận với độ dốc từ đó. Điều này là tốt nếu bóng đến địa hình từ một góc phải, nhưng thất bại cho các góc khác. Bạn sẽ chỉ muốn phủ nhận thành phần bình thường lên bề mặt, ví dụ như khi bật ra khỏi trần nhà, bạn phủ nhận y, không phải x.


Mặc dù câu trả lời này không trực tiếp tiếp cận vấn đề, +1 để cho tôi biết về cách giải quyết va chạm nên được thực hiện trong trường hợp này.
Qqwy
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.