2D Planet Gravity


15

ฉันกำลังพยายามสร้างเกมง่ายๆที่มีการเปิดตัวยานอวกาศและจากนั้นเส้นทางจะได้รับผลกระทบจากแรงโน้มถ่วงของดาวเคราะห์

คล้ายกับเกมนี้: http://sciencenetlinks.com/interactives/gravity.html

ฉันต้องการทราบวิธีการจำลองผลกระทบที่ดาวเคราะห์มีต่อยานอวกาศในเกมนี้เพื่อให้ยานอวกาศสามารถ 'วนรอบ' รอบดาวเคราะห์เพื่อเปลี่ยนทิศทาง

ฉันจัดการเพื่อให้ได้ผลลัพธ์ปลอมที่ยานอวกาศวนเป็นวงรีขนาดใหญ่รอบโลกหรือได้รับผลกระทบเพียงเล็กน้อยจากแรงโน้มถ่วงของดาวเคราะห์ที่ใช้เวกเตอร์

ขอบคุณล่วงหน้า.

ป.ล. ฉันมีประสบการณ์การเขียนโค้ดมากมายไม่มีส่วนเกี่ยวข้องกับเกม dev

คำตอบ:


15

ในกรณีของคุณมียานอวกาศซึ่งเคลื่อนที่ได้รับผลกระทบจากแรงโน้มถ่วงของดาวเคราะห์ทั้งหมด ดาวเคราะห์แต่ละดวงใช้แรงเท่ากับ 'm1 * m2 / r ^ 2' ซึ่ง m1 และ m2 แสดงถึงมวลของยานอวกาศและดาวเคราะห์และ r เท่ากับระยะทางแบบยูคลิดของดาวเคราะห์และยานอวกาศ คุณเพียงแค่ต้องคำนวณผลรวมของกองกำลังทั้งหมดที่ใช้กับเรือ จากกฎของนิวตันเรารู้ว่า 'f = m * a' โดยที่ f คือแรงทั้งหมดที่ใช้กับวัตถุ m คือมวลและ a คือความเร่ง จากจุดนี้คุณสามารถอ่านหน้านี้เพื่อเรียนรู้วิธีใช้การเร่งความเร็วเพื่อคำนวณความเร็วและตำแหน่งในช่วงเวลาหนึ่ง


+1 แหล่งข้อมูลที่ดีที่คุณเชื่อมโยงอธิบายวิธีการรวมลำดับที่ 4 ของ Runge-Kutta และทุกอย่าง
David Gouveia

ปัญหาของฉันในขณะนี้คือเส้นทางที่ยานอวกาศใช้ ฉันต้องการให้มันเป็นเหมือนเกมมากกว่า ฉันทำรูปภาพง่าย ๆ เพื่อแสดงว่าฉันหมายถึงอะไร i44.tinypic.com/2w2kdo4.jpg A คือสิ่งที่ฉันมีตอนนี้ B คือสิ่งที่ฉันต้องการ
อบ

@ อบ: และการเพิ่มมวลของดาวเคราะห์จะไม่ทำงาน?
Jesse Emond

5
นอกจากบทความ Gaffer on Games แล้วคุณจำเป็นต้องอ่านบทความ Codeflow นี้อย่างแน่นอน! Runge-Kutta ดูไม่เหมือนทางออกที่ดีที่สุดของคุณที่นี่
sam hocevar

หากคุณมี A และต้องการ B คุณจะลดความเร็วเริ่มต้นของยานอวกาศของคุณได้อย่างไร
Ben

4

ดาวเคราะห์แต่ละดวงควรมีสนามแรงโน้มถ่วงที่ดึงวัตถุใด ๆ ในบริเวณใกล้เคียงเข้าหาศูนย์กลาง กล่าวอีกนัยหนึ่งคุณควรใช้แรงจากตำแหน่งยานอวกาศไปยังศูนย์กลางดาวเคราะห์ในแต่ละขั้นตอนของการจำลอง

แรงนี้ขึ้นอยู่กับมวลของวัตถุทั้งสอง แต่ในกรณีนี้เนื่องจากมวลของยานอวกาศอาจไม่สำคัญเมื่อเทียบกับดาวเคราะห์คุณจึงสามารถลองค่าคงที่ที่แตกต่างกันขึ้นอยู่กับขนาดของดาวเคราะห์จนกว่าคุณจะรู้สึกถูก

สิ่งสำคัญที่สุดคือแรงนี้เติบโตยิ่งระยะห่างระหว่างวัตถุทั้งสอง คุณจะทำเช่นนี้โดยหารด้วยระยะห่างระหว่างทั้งสอง หลังจากระยะหนึ่งคุณอาจต้องการ "ตัด" ด้วยตนเองและหยุดการใช้แรง

เพียงแปลกำลังนี้เป็นความเร่งและสมการพื้นฐานทางฟิสิกส์ควรดูแลส่วนที่เหลือ

ใน pseudocode

force=0
for each planet
    if distance < constant
        force += mass * (planet.xy - ship.xy) / distance^2
apply force to ship

ที่จริงแล้วมันค่อนข้างคล้ายกับว่าฉันได้ทำมันในขณะนี้ อาจจะเป็นแค่เรื่องของการเล่นกับค่าคงที่หรือไม่?
อบ

2
ไม่แน่ใจจริงๆ แต่ฉันว่ามันคงเป็นตอนนี้ และฉันคิดว่ามันยังขึ้นอยู่กับแรงเริ่มต้นที่คุณใช้กับยานอวกาศเพื่อที่จะนำมันเข้าสู่วงโคจร
David Gouveia
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.