Làm thế nào để khiến vật mất ít vận tốc hơn khi tốc độ của nó tăng


11

Tôi đang phát triển một trò chơi trong Flash và tôi cần một chút giúp đỡ. Nó có thể được coi là một vấn đề toán học.

Đối tượng của tôi đang bay với tốc độ Xvà đối tượng của tôi có thể va chạm với đá. Khi nó va chạm với một hòn đá, tôi cần đối tượng của mình phá vỡ hòn đá và tiếp tục, nhưng với vận tốc ít hơn. Thật dễ dàng để mã hóa nó và viết một cái gì đó như: myVelocity -= 10;nhưng vấn đề chính của tôi là tôi muốn nó mất ít vận tốc hơn thì vận tốc ban đầu càng cao.

Ví dụ: Nếu vận tốc là 300 tôi muốn nó mất 10 và nếu là 200 tôi muốn nó mất 20.

Điều này có thể được thực hiện với một số loại công thức?


1
Làm thế nào về một cái gì đó đơn giản như thế log(myVelocity + 1) * Nnào?
Jonathan Connell

Câu trả lời:


6

Tôi sẽ đảo ngược tốc độ và nhân lên bằng thứ bạn thích:

float velocity = 300.0f;
float collisionEffect = 3000.0f / velocity;
if (collisionEffect > velocity)
{
    // Choose which one you like: with or without restitution

    // No restitution
    collisionEffect = velocity;

    // Restitution
    collisionEffect = velocity + (collisionEffect - velocity) * 0.3f;
}
velocity -= collisionEffect;

Ví dụ này cho các hiệu ứng sau:

400 loses 7.5
300 loses 10
200 loses 15
100 loses 30
 50 loses 50  // Using no restitution
 50 loses 53  // Using restitution
 20 loses 20  // Using no restitution
 20 loses 59  // Using restitution

"Sự bồi thường" là gì?
jprete

Sự phục hồi đang nảy lên. Đó là thực tế.
Martijn Courteaux

30

những hệ thống mà bạn và những người khác mô tả sẽ không tạo ra vật lý tìm kiếm thực sự. công thức chính là giảm 0,5 * m * v ^ 2 (động năng) bằng một giá trị không đổi mỗi khi vật thể chạm vào đâu đó.

vì vậy nếu một vật có trọng lượng 2Kg chạm vào một khối nào đó, cần năng lượng 16j trước khi nó vỡ: tốc độ di chuyển của vật thể sẽ thay đổi theo bảng này:

4  m/s -> the block will not break
5  m/s -> 3   m/s
6  m/s -> 4.4 m/s
7  m/s -> 5.7 m/s
8  m/s -> 6.9 m/s
9  m/s -> 8   m/s
10 m/s -> 9.1 m/s

7
Điều này nên được chấp nhận - nó chính xác, thực tế, dễ thực hiện và sẽ xử lý tất cả các trường hợp của vật thể và khối lượng và vận tốc.
Tesserex

3
Trừ khi bạn có một hiệu ứng 'vật lý hoạt hình' cụ thể mà bạn hy vọng đạt được, thì với một hệ thống thực tế hơn hầu như luôn là một ý tưởng hay; có một vài cách tốt hơn để đảm bảo rằng bạn sẽ không gặp phải các trường hợp đột phá có khả năng phá vỡ động cơ.
Steven Stadnicki

1
Câu trả lời này là tốt, tôi biết. Nhưng trò chơi của tôi được đặt trong một thế giới hoạt hình và nó không cần phải thực tế. Tôi nên cụ thể hơn khi đặt câu hỏi.
Afra

1
Đây là một dự án cộng đồng, mọi người đã ở đây để trả lời câu hỏi và đối với câu hỏi được hỏi, đây là câu trả lời tốt nhất. Chỉ vì bạn thích giải pháp hacky cho trường hợp cụ thể của bạn không có nghĩa là câu trả lời này không phải là câu trả lời tốt nhất. Bằng cách chọn câu trả lời hacky làm giải pháp, khi người khác tìm kiếm trang web để tìm câu trả lời cho loại câu hỏi này, họ sẽ cho rằng câu trả lời không thực tế là câu trả lời tốt hơn.
Richard Fabian

1
@Richard Giải pháp khác không phải là hacky đơn giản vì nó không sử dụng vật lý thực tế, là Tetris hacky vì các khối không rơi trơn tru? Nếu mọi người cho rằng câu trả lời được chấp nhận là câu trả lời 'tốt hơn' thay vì cho rằng đó là câu trả lời thỏa mãn người hỏi, thì đó là lỗi của họ. Tất cả các câu trả lời và phiếu bầu vẫn còn rõ ràng.
CiscoIPPhone

2

Bạn đã không thực sự cung cấp đủ thông tin để cho biết loại phạm vi nào bạn muốn, nghĩa là nó có giới hạn hay không, liệu bạn có muốn tiến triển hình học, v.v.

Điều đầu tiên bạn muốn làm là lấy một con số tỷ lệ thuận với tốc độ bạn muốn mất (nó không nhất thiết phải giống nhau, nhưng nó sẽ giảm khi tốc độ tăng để tỷ lệ thuận với tổn thất của bạn). Cách tiêu chuẩn để làm điều đó là lấy đối ứng :

temp = 1 / currentVelocity;

Bây giờ, với 100 bạn sẽ có 0,01, với 200 bạn sẽ có 0,005, với 300 bạn sẽ có 0,0033, v.v.

Bây giờ bạn chỉ cần điều chỉnh số đó thành bất cứ điều gì bạn thực sự muốn, bằng cách nhân nó. Vì thế

k = 3000;
newVelocity = temp * k;

sẽ cung cấp cho bạn 20 cho 300, nhưng nó sẽ cung cấp cho bạn 15 cho 200 chứ không phải 10. Điều này có thể tốt cho bạn, trong trường hợp đó bạn không cần phải đọc thêm. Bạn có thể điều chỉnh k theo ý muốn nhưng bạn có thể không nhận được số theo cách bạn thích trừ khi bạn thực hiện thêm một chút, chẳng hạn như thực hiện tiến trình hình học hoặc thay đổi cơ sở để tăng. Tôi sẽ không đi vào tiến trình hình học ở đây, nhưng nếu bạn muốn thay đổi cơ sở, bạn làm như sau:

base = 100;
temp = 1 / (currentVelocity - base);
if (temp < 0) temp = 0; //adjust temp so never less than zero, cannot gain force!

k = 2000;
velocityLoss= temp * k;
if (velocityLoss > currentVelocity) //(1) or make currentVelocity an unsigned int
    velocityLoss = currentVelocity; //(2)

Điều này sẽ cung cấp cho bạn phạm vi bạn đã yêu cầu ban đầu trong câu hỏi của mình, 300 -> mất 10, 200 -> mất 20. FYI 100 -> mất 40 và 50 -> mất 80 (!) Có nghĩa là bạn 'Cần hạn chế phép trừ của bạn - đó là những gì tôi đã thực hiện trong các dòng (1) và (2).

Tất nhiên, có nhiều cách khác để tiếp cận toàn bộ vấn đề này, mà tôi chắc chắn rằng những người giỏi toán hơn tôi, sẽ đăng ở đây.


0

Tôi nghĩ rằng, bạn có thể sử dụng chỉ phân chia đơn giản theo vận tốc. Ví dụ: mất = 3 000 / myVelocity. Khi vận tốc là 300, bạn sẽ mất 10, khi đó là 200, bạn sẽ mất 15. Bạn phải chọn hằng số chính xác.

Nếu bạn muốn, bạn có thể sử dụng công thức phức tạp hơn, như: hằng số / (hằng số 2 * vận tốc ^ 2 + hằng số 3 * vận tốc). Một lần nữa - chỉ cần chọn hằng số, sẽ phù hợp với bạn.


nó hoàn toàn đảo ngược những gì anh ta yêu cầu và những gì xảy ra trong vật lý thực tế.
Ali1S 232

Tôi không hiểu bạn Điều gì được đảo ngược?
zacharmarz

Tôi đoán tôi đã hiểu lầm bạn trả lời, xấu của tôi.
Ali1S232
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.