Trong công cụ vật lý 2D của tôi, tôi có thể phát hiện các va chạm AABB và AABB và giải quyết chúng bằng cách tìm vectơ thâm nhập ngắn nhất và thêm nó vào vị trí của AABB.
Làm điều này "đẩy" AABB đầu tiên bên ngoài AABB thứ hai, nhưng hoàn toàn không đối phó với thay đổi vận tốc / gia tốc.
Nếu tôi thêm gia tốc trọng lực vào mô phỏng của mình, vận tốc của AABB động đầu tiên sẽ tiếp tục tăng ngay cả khi nó nằm trên đỉnh AABB tĩnh thứ hai. Cuối cùng, vận tốc sẽ trở nên quá lớn và va chạm sẽ không được phát hiện (AABB động sẽ rơi qua trạng thái tĩnh).
Tôi đã thử đặt vận tốc về 0 sau khi phân giải, nhưng rõ ràng nó không hoạt động tốt và tạo ra các mô phỏng không thực tế.
Tôi đọc trực tuyến rằng giải quyết va chạm bằng cách làm việc thủ công trên vị trí hoặc vận tốc là không chính xác. Tôi đã thử thực hiện các lực lượng (khối lượng là "mã hóa cứng" 1 bây giờ):
void Body::applyForce(sf::Vector2f mForce) { acceleration += mForce; }
void Body::integrate(float mFrameTime)
{
velocity += acceleration * mFrameTime;
position += velocity * mFrameTime;
acceleration = {0, 0};
}
Nếu tôi áp dụng vectơ xuyên thấu ngắn nhất như một lực trong quá trình phân giải va chạm, AABB động sẽ bị "đẩy ra" khỏi tĩnh, nhưng vận tốc của nó sẽ không bao giờ giảm trong một mô phỏng mà không có trọng lực và nó sẽ tiếp tục di chuyển mãi mãi.
Có cách nào để áp dụng một lực lượng "tạm thời" không? Một lực liên quan đến việc đẩy AABB đầu tiên ra khỏi AABB thứ hai, sau đó dừng lại khi AABB không va chạm nữa?
Toàn bộ mã nguồn có sẵn tại đây: https://github.com/SuperV1234/SSVSCollision