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?
Đ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
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 –
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