ในเอนจินฟิสิกส์ 2D ของฉันฉันสามารถตรวจจับการชน AABB กับ AABB และแก้ไขพวกมันได้โดยการหาเวกเตอร์การสอดใส่ที่สั้นที่สุดและเพิ่มลงในตำแหน่งของ AABB
การทำเช่นนี้จะ "ผลัก" AABB ตัวแรกนอก AABB ตัวที่สอง แต่ไม่ได้เกี่ยวข้องกับการเปลี่ยนแปลงความเร็ว / การเร่งความเร็วเลย
ถ้าฉันเพิ่มการเร่งความเร็วด้วยแรงโน้มถ่วงกับการจำลองความเร็วของไดนามิก AABB แรกยังคงเพิ่มขึ้นแม้ว่าจะวางอยู่บน AABB สถิตที่สอง ในที่สุดความเร็วจะใหญ่เกินไปและไม่สามารถตรวจพบการชนกันได้ (ไดนามิก AABB จะตกลงไปในภาพนิ่ง)
ฉันพยายามตั้งค่าความเร็วเป็นศูนย์หลังจากการแก้ปัญหา แต่เห็นได้ชัดว่าใช้งานไม่ได้ดีและสร้างแบบจำลองที่ไม่สมจริง
ฉันอ่านออนไลน์ที่แก้ไขการชนโดยการทำงานกับตำแหน่งด้วยตนเองหรือความเร็วไม่ถูกต้อง ฉันพยายามใช้กองกำลัง (มวลคือ "hardcoded" 1 สำหรับตอนนี้):
void Body::applyForce(sf::Vector2f mForce) { acceleration += mForce; }
void Body::integrate(float mFrameTime)
{
velocity += acceleration * mFrameTime;
position += velocity * mFrameTime;
acceleration = {0, 0};
}
ถ้าฉันใช้เวกเตอร์การสอดใส่ที่สั้นที่สุดเป็นแรงในระหว่างการแก้ไขการชน AABB แบบไดนามิกจะได้รับ "ผลักออก" จากแบบคงที่ แต่ความเร็วของมันจะไม่ลดลงในแบบจำลองที่ไม่มีแรงโน้มถ่วงและมันจะเคลื่อนที่ตลอดไป
มีวิธีการใช้กำลัง "ชั่วคราว" หรือไม่? แรงที่เกี่ยวข้องกับการผลัก AABB แรกออกจาก AABB ที่สองจากนั้นจะหยุดเมื่อ AABB ไม่ชนกันอีกต่อไป?
มีซอร์สโค้ดทั้งหมดที่นี่: https://github.com/SuperV1234/SSVSCollision