2011-08-10 14 views
8

Tôi muốn mô phỏng một vụ rơi tự do và va chạm với mặt đất (ví dụ như quả bóng nảy). Vật thể sẽ rơi vào chân không - có thể bỏ qua một sức cản không khí. Một va chạm với mặt đất sẽ gây ra một số tổn thất năng lượng vì vậy cuối cùng đối tượng sẽ ngừng di chuyển. Tôi sử dụng JOGL để render một điểm mà là đối tượng rơi xuống của tôi. Lực hấp dẫn là không đổi (-9,8 m/s^2).mô phỏng trọng lực

Tôi tìm thấy một phương pháp Euler để tính toán một vị trí mới của điểm:

deltaTime = currentTime - previousTime; 
vel += acc * deltaTime; 
pos += vel * deltaTime; 

nhưng tôi đang làm gì đó sai. Các điểm bị trả lại một vài lần và sau đó nó di chuyển xuống (rất chậm).

Đây là một giả (ban đầu pos = (0.0f, 2.0f, 0.0f), vel ban đầu (0.0f, 0.0f, 0.0f), trọng lực = -9.8f):

display() 
{ 
    calculateDeltaTime(); 
    velocity.y += gravity * deltaTime; 
    pos.y += velocity.y * deltaTime; 

    if(pos.y < -2.0f) //a collision with the ground 
    { 
     velocity.y = velocity.y * energyLoss * -1.0f; 
    } 

} 

Cách tốt nhất để đạt được hiệu quả thực tế là gì? Làm thế nào phương pháp euler tham khảo các phương trình tăng tốc không đổi?

+0

Điều gì sẽ xảy ra nếu bạn chỉ mất năng lượng ra khỏi phương trình? – redbmk

+0

ngoài câu trả lời của Yochai, bạn có thể cân nhắc đặt 'pos.y' thành mức mặt đất trong trường hợp va chạm của bạn để tránh các lỗi cắt bớt –

+0

Nếu không bị mất năng lượng, điểm dừng cũng sẽ bị phản xạ sau một khoảng thời gian. – Vert

Trả lời

6

Bởi vì các điểm nổi không làm tròn lên một cách độc đáo, bạn sẽ không bao giờ có được vận tốc thực sự 0. Bạn có thể nhận được một cái gì đó như -0.00000000000001 hoặc một cái gì đó.

bạn cần phải làm cho nó 0.0 khi nó đủ gần. (xác định một số delta.)

2

Để mở rộng khi nhận xét của tôi ở trên và để trả lời Tobias, tôi sẽ thêm câu trả lời hoàn chỉnh tại đây.

Khi kiểm tra ban đầu, tôi đã xác định rằng bạn đã bị chảy máu quá nhanh. Đơn giản chỉ cần đặt, mối quan hệ giữa động năng và vận tốc là E = m v^2 /2, vì vậy sau khi uống phát sinh liên quan đến vận tốc bạn nhận được

delta_E = m v delta_v 

Sau đó, tùy thuộc vào cách energyloss được xác định, bạn có thể thiết lập mối quan hệ giữa delta_Eenergyloss. Ví dụ, trong nhiều trường hợp energyloss = delta_E/E_initial, thì mối quan hệ trên có thể được đơn giản hóa như

delta_v = energyloss*v_initial/2 

này được giả định rằng khoảng thời gian là nhỏ cho phép bạn thay thế v trong phương trình đầu tiên với v_initial, vì vậy bạn sẽ có thể tránh xa nó vì những gì bạn đang làm. Để rõ ràng, delta_v được trừ từ velocity.y bên trong khối va chạm của bạn thay vì những gì bạn có.

Đối với câu hỏi thêm khả năng chống không khí hay không, câu trả lời là tùy thuộc. Đối với chiều cao giảm ban đầu nhỏ, nó sẽ không quan trọng, nhưng nó có thể bắt đầu quan trọng với tổn thất năng lượng nhỏ hơn do bị trả lại và điểm rơi cao hơn. Đối với đường kính 1 gram, 1 inch (2,54 cm), hình cầu nhẵn, tôi vẽ chênh lệch thời gian giữa có và không có ma sát không khí so với chiều cao thả:

difference in time with and without air-drag vs. drop height

Đối với vật liệu tiêu hao năng lượng thấp (80 - 90 + % năng lượng được giữ lại), tôi sẽ xem xét thêm nó trong 10 mét, và cao hơn, giảm chiều cao. Nhưng, nếu những giọt nhỏ dưới 2 - 3 mét, tôi sẽ không bận tâm.

Nếu có ai muốn tính toán, tôi sẽ chia sẻ chúng.

+0

+1 cảm ơn câu trả lời này. Tôi nghĩ đây cũng là một giải pháp tốt. Trái ngược với việc thực hiện va chạm ban đầu của Vert, bạn sẽ bị va chạm "mềm hơn" nơi cơ thể va chạm với sàn nhà và được nghỉ ngơi ở đó (giống như gối) trong khi phiên bản của Vert là một bản nhạc bị mất. Mà một trong những lựa chọn phụ thuộc vào khóa học về hành vi thể chất mong muốn. Và bạn nói đúng, bao gồm cả ma sát không khí sẽ là quá mức cần thiết. –

+0

@Tobias, đây cũng là một thư bị trả lại mất dữ liệu, chỉ hơi mềm hơn một chút. – rcollyer

+0

@Vert, tôi không bao giờ nhận thấy khi tôi đăng nó, nhưng tôi đã giảm 'energyloss' từ kết quả của tôi cho' delta_v'. Bây giờ nó đã được sửa. – rcollyer