Một quả bóng đập vào góc, nó sẽ lệch ở đâu?


46

Tôi cần phải cải thiện lượng giác của mình và hy vọng bạn có thể giúp đỡ ở đây với một mô hình toán học đơn giản. Đây là mô hình của tôi cho đến nay trong hình ảnh đính kèm. Tôi biết rằng hoạt hình khung có vấn đề khác khi bóng di chuyển rất nhanh, nhưng bây giờ tôi chỉ cần tính toán ballDx và ballDy. Cũng có thể ballDx = 0 (chỉ chuyển động dọc), nhưng khi bóng làm chệch hướng ballDx có thể nhận được một giá trị khác.

Va chạm 2D giữa bóng và cạnh góc của vật thể rắn không thể di chuyển


22
Đây có phải là những gì họ gọi là "trường hợp góc"?
Andrew Grimm

2
Chắc chắn, khi mọi thứ đi, chẳng mấy chốc chúng ta có thể sử dụng lý thuyết tương đối để giải quyết nó - vấn đề đang trở nên đại chúng (ive).
Lumis

Câu trả lời:


45

Lưu ý: Tất cả các giả định sau đây cho rằng bề mặt của quả bóng là không ma sát (vì vậy nó sẽ không bắt đầu quay hoặc bật lại khác nhau vì nó là).

Tại thời điểm va chạm, bóng sẽ được chạm vào góc. Khi các vật thể rắn va chạm, một lực sẽ tác dụng dọc theo cái gọi là bề mặt bình thường, tức là vuông góc với bề mặt tại điểm va chạm.

Vì nó là một quả bóng, vuông góc với bề mặt là hướng về tâm của quả bóng. Ok, vậy chúng ta biết hướng của lực, còn độ lớn của nó thì sao? Giả sử va chạm đàn hồi (và hình chữ nhật không thể di chuyển), quả bóng phải bật lại với cùng vận tốc mà nó tác động.

Gọi (nDx, nDy) là vận tốc sau va chạm, (oDx, oDy) vận tốc trước khi va chạm và (x, y) vị trí của quả bóng tại điểm va chạm. Chúng ta hãy giả sử thêm góc mà quả bóng va chạm vào là (0,0).

Thể hiện những hiểu biết của chúng tôi như là công thức, chúng tôi có:

(nDx, nDy) = (oDx, oDy) + c * (x, y)
length (nDx, nDy) = length (oDx, oDy)

Điều này tương đương với:

nDx = oDx + c * x
nDy = oDy + c * y
nDx^2 + nDy^2 = oDx^2 + oDy^2

Thay vào hai phương trình đầu tiên trong phương trình cuối cùng, chúng ta nhận được:

(oDx + c * x)^2 + (oDy + c * y)^2 = oDx^2 + oDy^2

Mở rộng bằng cách sử dụng ngực nhị thức

(a+b)^2 = a^2 + 2ab + b^2 

sản lượng:

oDx^2 + 2 * oDx * c * x + (c * x) ^ 2 + oDy^2 + 2 * oDy * c * y + (c * y) ^ 2 = oDx^2 + oDy^2
2 * oDx * c * x + 2 * oDy * c * y + (c * x) ^ 2 + (c * y) ^ 2 = 0
(2 * oDx * x + 2 * oDy * y) * c + (x^2 + y^2) * c^2 = 0

Phương trình bậc hai cnày có hai giải pháp, một trong số đó là 0. Rõ ràng, đó không phải là giải pháp mà chúng ta quan tâm, vì nhìn chung hướng của quả bóng sẽ thay đổi do va chạm. Để có được giải pháp khác, chúng tôi chia cả hai bên cho c và nhận:

(2 * oDx * x + 2 * oDy * y) + (x^2 + y^2) * c = 0

Đó là:

 c = -(2 * oDx * x + 2 * oDy * y) / (x^2 + y^2)

Để tóm tắt, chúng tôi có:

c = -(2 * oDx * x + 2 * oDy * y) / (x^2 + y^2)
nDx = oDx + c * x
nDy = oDy + c * y

Chỉnh sửa : Trong mã:

if (collision) {
    float x = ballX - cornerX;
    float y = ballY - cornerY;
    float c = -2 * (ballDx * x + ballDy * y) / (x * x + y * y);
    ballDx = ballDx + c * x;
    ballDy = ballDy + c * y;
}

Một vài cân nhắc khi thực hiện: Mặc dù bạn có thể ước chừng (x, y) với vị trí của quả bóng sau bước mô phỏng, nhưng phép tính gần đúng này sẽ thay đổi góc lệch và do đó rất đáng chú ý, vì vậy các bước mô phỏng của bạn cần phải rất tốt (có lẽ như vậy quả bóng không di chuyển hơn 1/20 diamater của nó mỗi bước). Để có giải pháp chính xác hơn, bạn có thể tính thời gian xảy ra va chạm và tách bước mô phỏng đó tại thời điểm đó, tức là thực hiện một bước cho đến khi va chạm và một bước khác cho phần còn lại của bước.

Chỉnh sửa 2: Tính điểm tác động

Gọi r là bán kính, (x0, y0) vị trí và (dx, dy) vận tốc của quả bóng khi bắt đầu bước mô phỏng. Để đơn giản, hãy giả sử thêm rằng góc trong câu hỏi nằm ở (0,0).

Chúng tôi biết:

(x,y) = (x0, y0) + (dx, dy) * t

Chúng tôi muốn

length(x,y) = r

Đó là

(x0 + dx * t) ^ 2 + (y0 + dy * t) ^ 2 = r^2
x0^2 + 2 * x0 * dx * t + dx^2 * t^2 + y0^2 + 2 * y0 * dy * t + dy^2 * t^2 = r ^ 2
(dx^2 + dy^2) * t^2 + (2 * x0 * dx + 2 * y0 * dy) * t + (x0^2 + y0^2 - r^2) = 0
\____  _____/         \____________  ___________/       \_______  ________/
     \/                            \/                           \/
     a                             b                            c

Đó là một phương trình bậc hai trong t. Nếu nó phân biệt đối xử

D = b^2 - 4 * a * c

là tiêu cực, nó không có giải pháp, tức là bóng sẽ không bao giờ đánh vào góc trên khóa học hiện tại của nó. Mặt khác, hai giải pháp của nó được đưa ra bởi

t1 = (-b - sqrt(D)) / (2 * a)
t2 = (-b + sqrt(D)) / (2 * a)

Chúng tôi quan tâm đến thời gian vụ va chạm bắt đầu, đó là thời gian sớm hơn t1.

Phương pháp của bạn sẽ trở thành:

    // compute a,b,c and D as given above

    if (D >= 0) {
        t = (-b - sqrt(D)) / (2 * a);
        if (0 < t && t <= ts) {
            // collision during this timestep!

            x = x + t * dx;
            y = y + t * dy;
            ts = ts - t;

            // change dx and dy using the deflection formula 
        }
    }

    x = x + ts * dx;
    y = y + ts * dy;

1
điều này xứng đáng +1
năng động

1
Vui lòng upvote, sau đó :-)
meriton - đình công

3
Bạn nói rất sớm At the moment of collision, the ball will be touching the cornernhưng tôi không thấy sự biện minh của phép tính gần đúng này (và nó phải là một phép tính gần đúng vì nó không đúng - quả bóng chạm vào hai vị trí, không phải là góc).
Peter Taylor

1
@Peter Taylor: Bạn có để ý rằng OP đã vẽ quả bóng bên ngoài hình chữ nhật không, và công thức phát hiện va chạm được đưa ra trong câu hỏi cũng thừa nhận điều này? Bạn phải suy nghĩ bên ngoài hộp ở đây :-)
meriton - đình công vào ngày

1
Thích câu trả lời này, nhưng nó có thể sử dụng một số đánh dấu $ \ LaTeX $ của toán học.
Martin Wickman

13

Đây là một cách trực quan để xem xét một vấn đề.

Bộ vấn đề ban đầu là hình tròn so với hình chữ nhật (màu xám trong hình bên dưới). Điều này tương đương với điểm so với trực tràng tròn (hiển thị màu đen).

Vì vậy, đây là một vấn đề đa phần. Bạn đang kiểm tra xung đột điểm của bạn so với 4 đường (nhô ra khỏi mép hộp bằng bán kính của vòng tròn ban đầu) và 4 vòng tròn (tại các góc của hình chữ nhật có cùng bán kính của vòng tròn ban đầu).

Với vận tốc thô trong ảnh gốc của bạn, điểm sẽ chạm vào vòng tròn góc dưới bên phải. Tất cả những gì bạn phải làm là tìm ra điểm trên vòng tròn góc mà bạn sẽ đánh, tính góc của nó và phản xạ lại nó.

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

Tôi sẽ để lại nguồn gốc của nó như là một bài tập cho người đọc.


2

Tôi đang làm việc trên một trò chơi và cũng bị mắc kẹt ở đây. Nhưng tôi đoán nó đi theo cách này:

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

Có một quan điểm khác Vấn đề của tôi là tôi không biết cách tính nhanh dx, dy mới (với tôi, sử dụng toán học truyền thống đòi hỏi quá nhiều phép tính).


Quan điểm của tôi khác với quan điểm trong liên kết thứ 2, vì tôi không nghĩ rằng vectơ vận tốc mới phụ thuộc vào tâm của khối như thế. Anh tôi nói với tôi rằng quả bóng sẽ quay trở lại hướng cũ (dx = -dx && dy = - dy) nhưng tôi không nghĩ vậy.
Risa

Nếu quả bóng chạm vào góc và khoảng cách ballX từ gócX nhỏ hơn 1/4 quả bóng thì nó sẽ nảy trở lại, nếu không nó sẽ lệch về phía trước bên phải. Đây là một mô hình đơn giản tôi đang sử dụng tại thời điểm này, không được tinh chỉnh để tìm góc chính xác.
Lumis

0

Động học là tất cả về việc chọn chính xác, vì thuận tiện nhất cho việc tính toán, khung tham chiếu.

Ở đây trước tiên chúng ta sẽ định nghĩa phép biến đổi T giải quyết các trục của chúng ta thành các thành phần song song ( x ' ) và vuông góc ( y' ) thành một đường thẳng giữa tâm của quả bóng và góc. Biến đổi nghịch đảo T * sẽ khôi phục hệ tọa độ ban đầu của chúng tôi.

Trong khung tham chiếu mới này, bằng sự phản xạ (và đối xứng không gian và thời gian của vật lý), chúng ta có sự biến đổi vận tốc của tiếp điểm M (một xung điểm ) khi đảo ngược thành phần x ' và không thay đổi thành phần y' . Trong thuật ngữ ma trận, đây là ma trận đường chéo có -1 và 1 trên đường chéo.

Khi đó vận tốc sau va chạm chỉ đơn giản là: V ' = T * . M . T . .

Thời gian tác động t là sau đó chỉ là giải pháp cho ( T . Đỗ ) + ( X . T . () t ) = r nơi X là các nhà điều hành chiếu trục X và r là bán kính của quả bóng. Sắp xếp lại, chúng tôi có được
t = ( r - ( T . Đỗ )) / (( X . T . ) ( t ))

Điều này có lợi thế khác biệt của việc chôn vùi tất cả các toán học phức tạp trong các thư viện đồ họa tiêu chuẩn được viết, kiểm tra và gỡ lỗi nghiêm ngặt. Giải pháp này cũng giống hệt nhau cho các tình huống 2D và 3D - chỉ cần chuyển thư viện đồ họa. Cuối cùng, nó nhấn mạnh rằng trước tiên người ta nên nghĩ về các khung tham chiếu thích hợp trước khi giải quyết bất kỳ vấn đề vật lý nào. Luôn luôn có sự cám dỗ của NIH, nhưng trong thực tế, đó chỉ là một công thức cho các lỗi khi có nhiều giải pháp ngắn gọn hơ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.