หนึ่งจะป้องกันขีปนาวุธกลับบ้านจากการโคจรเป้าหมายของพวกเขาได้อย่างไร


78

ฉันกำลังพัฒนาเกมอวกาศ 2 มิติโดยไม่มีแรงเสียดทานและฉันพบว่ามันง่ายมากที่จะทำให้ขีปนาวุธกลับสู่วงโคจรเป้าหมาย ฉันอยากรู้เกี่ยวกับกลยุทธ์ต่อต้านการโคจร

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

ปัญหาการโคจร

  • ในเฟรมที่ 1 ขีปนาวุธมุ่งตรงไปยังเป้าหมายโดยไม่มีปัญหา
  • ในเฟรม 2 เป้าหมายได้ย้ายไปยังตำแหน่งใหม่ตามที่แสดง ขีปนาวุธยังคงเร่งไปยังเป้าหมายโดยตรง (เป็นสีแดง) ในขณะที่ยังคงเคลื่อนที่ไปยังตำแหน่งที่เป้าหมายเคยเป็น (สีดำ) เนื่องจากความเร็วที่มีอยู่
  • ในเฟรมที่ 3 ความเร็วของขีปนาวุธจะยังคงดำเนินการขีปนาวุธรอบด้านของเป้าหมาย (สีดำ) ในขณะที่เวกเตอร์การเร่งความเร็วพยายามอย่างยิ่งที่จะดึงขีปนาวุธไปยังเป้าหมาย
  • ในเฟรมที่ 4 และถัดไปขีปนาวุธจะตกลงสู่วงโคจรที่มีความเสถียรรอบ ๆ เป้าหมายและไม่ถึงเป้าหมาย ลูกศรสีดำแสดงถึงเวกเตอร์ความเร็วสูงในขณะที่เส้นสีแดงแสดงถึงเวกเตอร์ความเร่งในเวลาเดียวกัน

เมื่อพิจารณาว่าไม่มีแรงเสียดทานในอวกาศไม่มีสิ่งใดที่จะชะลอความเร็วของขีปนาวุธลงและยุบวงโคจรได้ ทางออกที่เป็นไปได้คือการตั้งเป้า "ไว้ข้างหลัง" เป้าหมายและสิ่งนี้จะทำให้วงโคจรปิด แต่สิ่งนี้ทำได้จากมุมมองการเขียนโปรแกรมอย่างไร

ฉันจะทำให้จรวดกลับบ้านไปถึงเป้าหมายได้อย่างไร


9
อันที่จริงแล้วนี่เป็นวิธีที่ยอดเยี่ยมมากในการสร้างวงโคจรของสิ่งต่าง ๆ
ดีเร็ก

สิ่งนี้ทำให้ฉันนึกถึงการรวมออยเลอร์ สิ่งที่คุณต้องทำคือทำให้ขั้นตอนเวลาของคุณเล็กนิดเดียวแก้ไขปัญหาได้แล้ว!
Jeff

ฉันต้องการใช้เอฟเฟกต์นี้ในเกมของฉัน! : D
Zolomon


6
@Deza มันเป็นนิยามของวงโคจรที่มาก วัตถุที่กำลังโคจรอยู่นั้นเร่งด้วยแรงสู่ศูนย์กลางสู่ศูนย์กลางของวัตถุอื่น
bobobobo

คำตอบ:


49

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

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

  1. ประมาณระยะเวลาที่ใช้ในการยิงจรวดให้ถึงเป้าหมาย หากเป้าหมายบินตรงไปที่ (จำไว้ว่าขีปนาวุธอยู่กับที่ ) มันอาจจะง่ายเหมือนการคำนวณระยะทาง / ความเร็วในกรณีอื่น ๆ มันอาจซับซ้อนกว่า หากเป้าหมายสามารถพยายามหลบเลี่ยงคุณจะไม่สามารถทำการประเมินที่สมบูรณ์แบบได้ดังนั้นจึงไม่น่าจะแม่นยำนัก

  2. สมมติว่าความเร็วคงที่ (ประมาณการศึกษาระดับปริญญาที่ 1) หรือการเร่งความเร็วคงที่ (ประมาณการศึกษาระดับปริญญาที่ 2) ของเป้าหมายคำนวณว่าจะอยู่ที่ไหนในเวลาที่ประมาณไว้ข้างต้น

  3. คำนวณความเร่งซึ่งจะนำไปสู่ขีปนาวุธให้อยู่ที่จุดเดียวกันในเวลาเดียวกัน

  4. ฉายภาพความเร่งกลับจากกรอบอ้างอิงของขีปนาวุธสู่ระดับโลกใช้มัน

ส่วนที่สำคัญที่นี่คือการประเมินเวลาใน ballpark หยาบและอย่าลืมความสามารถในการเร่งความเร็วของขีปนาวุธในขณะที่ทำเช่นนั้น ตัวอย่างเช่นการประมาณที่ดีกว่าสำหรับ "เป้าหมายตรงไปข้างหน้าเราและบินไปในทิศทางของเรา" จะเป็นการแก้สมการ ..

ระยะทาง = ความเร็ว x เวลา + 1/2 x เร่ง x เวลา2

... สำหรับเวลา (ใช้ความเร็วเชิงลบสำหรับวัตถุที่บินออกไปจากจรวด) ด้วยวิธีแก้ปัญหาที่คุณกำลังมองหาโดยใช้สูตรสมการกำลังสองมาตรฐานที่ ...

เวลา = (√ ( ความเร็ว2 + 2 x ความเร่ง x ระยะทาง ) - ความเร็ว ) / การเร่งความเร็ว

การเพิ่มพารามิเตอร์เพิ่มเติม - ลากตัวอย่างเช่นเปลี่ยนเป็นสมการเชิงอนุพันธ์ได้อย่างรวดเร็วโดยไม่มีวิธีแก้ปัญหาพีชคณิต นี่คือเหตุผลที่วิทยาศาสตร์จรวดเป็นเรื่องยาก


ฉันคิดว่านี่เป็นสิ่งที่ฉันต้องการ ฉันไม่เคยคิดในพิกัดท้องถิ่นมาก่อน
John McDonald

5
คำตอบที่ดี ในฐานะที่เป็นหมายเหตุด้านข้างขีปนาวุธติดตามจำนวนมากได้รับการออกแบบมาให้ระเบิดโดยอัตโนมัติบนเงื่อนไขเหล่านี้: 1) ได้รับภายในระยะทางที่แน่นอนของแทร็กและ 2) ระยะทางไปยังแทร็กเพิ่มขึ้น นั่นอาจเพิ่มพฤติกรรมที่ดีเพียงเล็กน้อยในราคาเพียงเล็กน้อย
Patrick Hughes

1
นี่คือคำตอบที่ดี ฉันลงเอยด้วยการใช้ความเร่งคงที่ของอาวุธ (ฉันคิดว่ามันสมจริงที่สุด) ประมาณเวลาที่จะมาถึง (จัด d = v t + 1/2 * a t * t และแก้หา t) ซอสสูตรลับนี้ใช้เวลาในการประมาณเวลาย้อนกลับไปยังโครงการซึ่งเป้าหมายจะได้รับความเร็วปัจจุบันและเวลาที่คาดว่าจะส่งผลกระทบ ทำได้ดี.
bobobobo

1
ฉันเดาว่านี่เป็นอัลกอริทึมแบบ Dead-reckoning
bobobobo

42

@Martin Sojka ได้บอกคุณแล้วว่าจะทำอย่างไร แทนที่จะปรับปรุงการตอบสนองของเขาฉันต้องการเสนอคุณ aproach ง่ายกว่า: DELOCK

อย่างที่ฉันบอกไว้ในเส้นทางการเคลื่อนที่ของยานพาหนะ? วัตถุที่มีขีดความสามารถในการบังคับเลี้ยว จำกัด จะทำ "โครงการ" เงาสองคู่: สองภูมิภาคที่ไม่สามารถเข้าถึงได้ด้วยการบังคับทิศทางโดยตรง

เมื่อคุณเห็นว่าคุณกำหนดเป้าหมายกำลังเข้ามาในหนึ่งในเงาพวงมาลัยดังกล่าวคุณสามารถหยุดการกลับบ้านเป้าหมายของคุณและรักษาทิศทางอื่นในระยะเวลาที่ จำกัด

ทริกเกอร์การล๊อคกิ้งสามารถคำนวณได้อย่างง่ายดายโดยการประมาณ tori ของคุณด้วยกรวย (สองครั้ง) *:

Delock ทริกเกอร์

คุณต้องคำนวณผลคูณแบบสเกลาร์ระหว่างเวกเตอร์ทิศทาง (ปกติ) และเวกเตอร์การกำจัดเป้าหมาย ( เป้าหมาย - วัตถุ / | เป้าหมาย - วัตถุ |)

เมื่อผลิตภัณฑ์สเกลาร์มีค่าเป็นศูนย์ทิศทางเป้าหมายของคุณจะตั้งฉากกับทิศทางของคุณซึ่งนำไปสู่วิถีแบบวงกลม ** เมื่อเป้าหมายตกอยู่ในภูมิภาคสีฟ้าคุณสามารถพลิกทิศทางพวงมาลัยของคุณเพื่อให้คุณสามารถวางไว้นอกพื้นที่ที่ไม่สามารถเข้าถึงได้และกลับบ้าน

* ตามจริงแล้วนี่ไม่ใช่รูปกรวย ... เป็นอีกรูปแบบหนึ่งของการปกครองพื้นผิวที่เกิดจากการปฏิวัติ (กึ่ง) ของเส้นสองเส้นที่ไม่ขนานกันรอบแกนที่ผ่านจุดตัดและตั้งฉากกับเส้นแบ่งครึ่ง การฉายภาพบนระนาบ 2D นั้นเหมือนกับกรวยคู่ แต่แกนหมุนนั้นตั้งฉากกับกรวยที่สร้าง

** วิถีนั้นไม่น่าจะเป็นวงกลมหรือรูปไข่หรือแม้กระทั่งปิด มีโอกาสที่วิถีจะเป็นไปตาม spirograph เช่น path (การไฮโปคลอโรด์) ในแบบ 2D หรือแม้แต่มอนสเตอร์อื่นใน 3 มิติขึ้นไป คุณไม่สามารถเข้าถึงศูนย์กลางของเส้นโค้งดังกล่าวได้และพวกเขาดูเหมือนวงกลมดังนั้นวิถี "วงกลม"


+1 แนวคิดที่ดีสำหรับกรณีที่เวกเตอร์ความเร่งของขีปนาวุธถูก จำกัด ให้ตั้งฉากกับทิศทางของการเดินทาง ฉันไม่คิดว่านี่เป็นกรณีสำหรับคำถามนี้
Martin Sojka

@Martin Sojka เวกเตอร์ความเร่งสามารถแบ่งออกเป็นสองส่วนประกอบรัศมีหนึ่งและอีกอันหนึ่งไปตามทิศทาง คนแรกบอกได้ว่าคุณสามารถเลี้ยวได้เท่าไหร่คนที่สองบอกได้ว่าคุณสามารถเร่ง / ลดความเร็วได้เท่าไหร่
FxIII

1
ใช่และถ้าคุณมีอิสระที่จะเลือกจุดแข็งสัมพัทธ์ของพวกเขาเป็นอิสระจากกัน (นั่นคือถ้าทิศทางและความแรงของเวกเตอร์การเร่งความเร็วนั้นไม่ขึ้นอยู่กับเวกเตอร์การเคลื่อนไหว), "วงกลมแยก" ของคุณหายไป
Martin Sojka

@Martin Sojka ไม่มีข้อ จำกัด ใด ๆ ในการเร่งความเร็วใช่ไหม?
FxIII

1
+1 มันเท่ห์มาก ฉันไม่เคยคิดถึงเรื่องนี้มาก่อน ฉันอาจลองใช้สิ่งนี้ร่วมกับคำตอบของ @ Matin
John McDonald เมื่อ

8

ระบบนำทางของคุณสร้างขึ้นบนสมมติฐานที่ว่าการเร่งไปยังเป้าหมายโดยตรงในที่สุดจะทำให้วัตถุชนกัน เนื่องจากข้อสันนิษฐานนั้นเป็นเท็จคำแนะนำของ AI ตามข้อสันนิษฐานนั้นก็ไม่ประสบความสำเร็จเช่นเดียวกัน

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

นอกจากนี้คุณจะต้องมีทริกเกอร์เพื่อให้แน่ใจว่าคุณจะไม่ช้าเกินไป ดังนั้นเพิ่มความเร็วเกณฑ์บางอย่างเช่นถ้าคุณต่ำกว่าเกณฑ์นั้นคุณหยุดทำการให้น้ำหนัก

สิ่งสุดท้ายที่หนึ่ง: ไม่มีระบบนำทางที่สมบูรณ์แบบ เหตุผลที่ขีปนาวุธสามารถสกัดกั้นเป้าหมายในชีวิตจริงได้คือเป้าหมายเคลื่อนที่ช้ากว่าขีปนาวุธตัวเองมากและเป้าหมายนั้นไม่ได้ว่องไวโดยเฉพาะ (ค่อนข้างพูดได้) หากขีปนาวุธของคุณจะไม่เร็วกว่าเป้าหมายที่พวกเขาไล่ล่าหลายเท่าพวกเขาจะพลาดมาก


2
"เป้าหมายไม่ว่องไวโดยเฉพาะ" .. ใช่มั้ย
bobobobo

5

วิธีที่ง่ายที่สุดและทันสมัยที่สุดในการใช้สิ่งนี้ในเกม (และในชีวิตจริง) คือการนำทางแบบสัดส่วน

ภายใต้ตรรกะช่วงลดลงคงที่ (CBDR) เมื่อวัตถุสองชิ้น (ขีปนาวุธและเป้าหมาย) เดินทางไปในทิศทางเดียวกันโดยไม่มีการเปลี่ยนแปลงแนวสายตาระหว่างกันและกันวัตถุเหล่านั้นจะชนกัน

Sightline หรือ Line of Sight (LOS) เป็นเส้นสมมุติระหว่างขีปนาวุธและเป้าหมาย - เวกเตอร์ระหว่างตำแหน่งขีปนาวุธและตำแหน่งเป้าหมาย อัตราการเปลี่ยนแปลงเชิงมุมของ LOS นี้คืออัตราการหมุน LOS

เมื่ออัตราการหมุนของ LOS กลายเป็นศูนย์จากนั้นเส้นสายตาจะไม่เปลี่ยนแปลงอีกต่อไป - วัตถุทั้งสองอยู่ในเส้นทางการชนกันแล้ว คิดว่าตัวเองกำลังตามล่าใครบางคนขณะเล่นฟุตบอล / ฟุตบอล หากคุณนำเขาไปในทางที่ร่างกายของเขาดูเหมือน "แช่แข็ง" ในสาขาการมองเห็นของคุณ (สายตาระหว่างคุณและเขาไม่เปลี่ยน) คุณจะชนกับเขาตราบเท่าที่คุณรักษาความเร่งในการวิ่งเพื่อให้ร่างกายของเขานิ่ง มุมมองของคุณ

ภายใต้การนำทางตามสัดส่วน (PN) ขีปนาวุธจะเร่งความเร็ว "N" เท่าตัวเร็วกว่าอัตราการหมุนของ LOS สิ่งนี้จะบังคับให้ขีปนาวุธนำเป้าหมายจนกว่าอัตราการหมุนของ LOS จะกลายเป็นศูนย์ - นั่นคือขีปนาวุธและเป้าหมายปรากฏเป็นน้ำแข็งในสภาพสายตาไม่เปลี่ยนแปลงอีกต่อไป - ตอนนี้พวกเขาอยู่ในเส้นทางชนกัน ตัวแปร "N" เรียกว่าค่าการนำทางคงที่ (ตัวคูณค่าคงที่)

ควรมีคำสั่งให้คำแนะนำขีปนาวุธดังต่อไปนี้:

การเร่งความเร็ว = การปิดความเร็ว * N * อัตราการสูญเสีย

อัตราลอสสามารถทำได้ง่ายโดยการวัดเวกเตอร์ LOS (ตำแหน่งเป้าหมาย - ตำแหน่งขีปนาวุธ) และจัดเก็บตัวแปร LOS เวกเตอร์จากเฟรมใหม่ (LOS1) ถูกลบโดย LOS เวกเตอร์จากเฟรมเก่า (LOS0) เพื่อสร้างเดลต้าของ LOS - ตอนนี้คุณมีอัตราการหมุนแบบดั้งเดิม LOS

หากต้องการทำให้ Closing Velocity ง่ายขึ้นคุณสามารถใช้ LOS เวกเตอร์ปัจจุบันแทนได้ดังนี้:

การเร่งความเร็ว = (target_pos - missile_pos) * LOS_delta * N

N คือค่าคงที่ของการนำทาง - ในโลกแห่งความเป็นจริงโดยทั่วไปแล้วจะตั้งอยู่ระหว่าง 3 ถึง 5 แต่ตัวเลขที่ใช้งานได้จริงในเกมจะขึ้นอยู่กับอัตราการสุ่มตัวอย่างที่คุณได้รับอัตรา / เดลต้า LOS ลองตัวเลขสุ่ม (เริ่มจาก 3) และเพิ่มมากถึง 1500, 2000 เป็นต้นจนกว่าคุณจะเห็นเอฟเฟกต์นำหน้าในเกมที่ต้องการ โปรดทราบว่าค่าคงที่ในการนำทางที่สูงกว่ายิ่งขีปนาวุธเร็วขึ้นจะตอบสนองต่อการเปลี่ยนแปลงของอัตรา LOS ในช่วงต้นของเที่ยวบิน หากแบบจำลองการจำลองจรวดกลับบ้านของคุณนั้นค่อนข้างสมจริงค่าคงที่ในการนำทางที่มากเกินไปอาจทำให้ขีดความสามารถในการเคลื่อนที่พลศาสตร์ของจรวดมากเกินไปดังนั้นคุณควรใช้จำนวนที่สมดุลตามการลองผิดลองถูก


4

ตามที่คำตอบอื่น ๆ ของ Martin และ Nicol ชี้ให้เห็นคุณอาจต้องการแนะนำขีปนาวุธของคุณไม่ตรงเป้าหมาย แต่ในทางที่จะทำให้มันชนกับเป้าหมายในภายหลัง อย่างไรก็ตามวิธีที่อธิบายโดย Martin นั้นซับซ้อนและวิธีที่ Nicol อธิบายนั้นไม่มีประสิทธิภาพ

วิธีที่ง่ายกว่า - แต่ก็ยังมีประสิทธิภาพอยู่พอสมควร - เพื่อเป็นแนวทางในการนำวิถีคือการปรับมุมตามการเปลี่ยนมุมระหว่างขีปนาวุธและเป้าหมาย ในทุกเห็บคุณคำนวณมุมจากขีปนาวุธไปยังเป้าหมายและเปรียบเทียบกับมุมจากเห็บก่อนหน้า ความแตกต่างคือความแตกต่างที่แน่นอนที่คุณต้องการทำในมุมของขีปนาวุธ ดังนั้นถ้ามุมอยู่ที่ 0.77 ในหนึ่งขีดและ 0.75 ในครั้งต่อไปคุณต้องการปรับมุมของขีปนาวุธโดย -0.02 วิธีนี้ง่ายและตราบใดที่เป้าหมายคือ "ด้านหน้า" ของขีปนาวุธมันมีประสิทธิภาพมากในแง่ของเส้นทางที่เลือก นอกจากนี้ยังใช้กับจำนวนมิติใด ๆ ไม่เพียง แต่ใน 2d

โปรดจำไว้ว่า:

  • วิธีการนี้จะหยุดหากขีปนาวุธและเป้าหมายนั้นมีความเร็วเท่ากันและเคลื่อนที่ขนานกัน ในทางทฤษฎีแล้วมันยังมีการวางแผนการชนกันของขีปนาวุธมันใช้เวลาไม่สิ้นสุด :) ในทางปฏิบัติขีปนาวุธควรจะเร็วกว่าเป้าหมายเสมอ แต่ถ้าพวกมันมีความเร็วเท่ากันคุณต้องเพิ่มมุมที่เป็นมุมเพื่อระบุว่ามันขนานกันหรือไม่ .

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

  • หากขีปนาวุธของคุณมีขีดความสามารถในการเลี้ยวที่ จำกัด เพียงแค่ให้เทิร์นสูงสุดทุกครั้งที่ต้องการเทิร์นมากกว่านั้น ตราบใดที่ขีปนาวุธอยู่ไกลพอมันก็ยังทำงานได้ หากใกล้เกินไปให้ดูสัญลักษณ์แสดงหัวข้อสุดท้าย

  • จำไว้ว่าต้องผ่อนปรนเมื่อตรวจสอบการชน ในโลกแห่งความเป็นจริงขีปนาวุธจำนวนมากพึ่งพาหัวรบของพวกเขาเพื่อสร้าง "โซนฆ่า" ดังนั้นพวกเขาจึงต้องเข้าใกล้เป้าหมายเท่านั้นไม่ได้ชนกับมันจริงๆ

  • ในที่สุดในทางปฏิบัติขีปนาวุธอาจยังพลาดซึ่งนำเรากลับไปที่คำถามดั้งเดิมของคุณ ฉันคิดว่าวิธีที่ดีคือปิดการใช้งานการบ้านสักสองสามขีดเพื่อให้มันไปถึงระยะทางไกลแล้วกลับมาที่บ้านอีกครั้ง ฉันคิดว่าวิธีการที่เสนอโดย fxiii เพื่อระบุโซนที่ตายแล้วเป็นวิธีที่ดีในการตรวจสอบเมื่อคุณต้องการปิดการกลับบ้าน


1

ตัวเลือกง่ายๆสองสามอย่างที่เคยพบว่าเป็น 'ดีพอ' สำหรับเกมที่ฉันเคยทำในอดีต:

1) หากความละเอียดของฉากที่คุณกำลังดูอยู่นั้นอนุญาตให้วัตถุสามารถระเบิดได้เมื่ออยู่ใกล้เป้าหมาย (ซึ่งเป็นวิธีที่ฉันเชื่อว่าขีปนาวุธกลับบ้านที่ใช้กันทั่วไปทุกวันจะทำงานได้จริง) หากช่วงการโคจรของคุณมีขนาดสองเท่าของวัตถุที่อยู่ห่างออกไปสิ่งนี้อาจไม่เหมาะกับคุณเพราะมันจะดูไม่ดี

หากเป้าหมายสุดท้ายของคุณในการแก้ปัญหาของคุณเป็นเพียงเพื่อให้แน่ใจว่าขีปนาวุธของคุณถึงเป้าหมายแล้วฉันก็แค่ทำมันให้ถึงเป้าหมาย อีกครั้งนี้จะขึ้นอยู่กับว่าโซลูชันมีลักษณะอย่างไร

2) หากคุณพบว่าขีปนาวุธของคุณอยู่ในมุมที่เหมาะสมกับเป้าหมายของคุณนี่อาจเป็นจุดที่ล็อค 'เบรก' และขีปนาวุธจะเคลื่อนที่ตรงเว้นแต่ว่าเป้าหมายได้รับ 'ด้านหน้า' ขีปนาวุธอีกครั้ง

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

หวังว่านี่จะช่วยได้


0

ดังที่ได้กล่าวไปแล้วว่าคุณควรเล็งขีปนาวุธเพื่อไปยังเป้าหมายที่คาดว่าจะเป็นเมื่อคุณไปถึงที่นั่นแทนที่จะไปที่เป้าหมายตอนนี้ สิ่งนี้จะหยุดขีปนาวุธส่วนใหญ่จากการเข้าสู่วงโคจร แต่วงโคจรยังคงเป็นไปได้หากเป้าหมายเคลื่อนไปทางขวา นี่เป็นกลยุทธ์ที่ถูกต้องตามกฎหมายที่นักบินเครื่องบินใช้เพื่อหลบขีปนาวุธขาเข้า - เนื่องจากขีปนาวุธจะเร็วกว่าคุณมากมันจะมีรัศมีวงเลี้ยวที่ใหญ่กว่าและมีการกระตุกเล็กน้อยในทันที (แม้ว่าคุณจะยังคงมีความเสี่ยงจากการระเบิดใกล้เคียง)

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

อย่างไรก็ตามฉันไม่เห็นด้วยกับวิธีแก้ปัญหาของเขา แต่ฉันจะเขียนโปรแกรมขีปนาวุธดังนี้:

หากขีปนาวุธพุ่ง 90 องศาไปที่แนวการเคลื่อนที่ 360 องศาของการเคลื่อนที่คุณอยู่ในวงโคจร ปรับแรงขับให้อยู่ที่ 120 องศาจากแนวการเคลื่อนที่ วงโคจรของขีปนาวุธจะกว้างขึ้นเนื่องจากมันไม่ได้หมุนได้ยาก แต่ขีปนาวุธก็จะช้าเช่นกัน เมื่อช่วงเป้าหมายจะเปิด 1.25x เส้นผ่านศูนย์กลางของโซนตาย (โปรดทราบว่าเส้นผ่านศูนย์กลางนี้จะขึ้นอยู่กับความเร็วของขีปนาวุธเพียงอย่างเดียวและไม่จำเป็นต้องทำการคำนวณที่ซับซ้อนในรันไทม์) ขีปนาวุธจะกลับสู่พฤติกรรมการติดตามปกติ

อีกทางเลือกหนึ่งคือใช้ผู้แสวงหาหัว - เมื่อช่วงที่กำหนดเป้าหมายสิ้นสุดลงเพื่อนับถอยหลังคุณระเบิด


0

ฉันรู้ว่านี่เป็นคำถามแบบโบราณ แต่ฉันคิดว่ามีบางสิ่งที่ไม่ได้รับคำตอบในตอนนี้ ในคำถามดั้งเดิมขีปนาวุธ (หรืออะไรก็ตาม) ก็ถูกสั่งให้เร่งความเร็วไปยังตำแหน่งของเป้าหมาย หลายคำตอบชี้ให้เห็นว่านี่เป็นสิ่งที่ผิดและคุณควรเร่งไปยังจุดที่คุณคิดว่าจะเป็นเป้าหมายในภายหลัง มันดีกว่า แต่ก็ผิด

สิ่งที่คุณต้องการทำจริง ๆ ไม่ได้เร่งไปยังเป้าหมาย แต่เคลื่อนที่ไปสู่เป้าหมาย วิธีคิดเกี่ยวกับสิ่งนี้คือการตั้งค่าความเร็วที่คุณต้องการชี้ไปที่เป้าหมาย (หรือการฉายภาพของตำแหน่งเป้าหมาย) จากนั้นหาว่าการเร่งความเร็วที่คุณสามารถนำไปใช้ได้ดีที่สุดคืออะไร ตรงกันข้ามโดยตรง) เพื่อให้ได้ความเร็วที่คุณต้องการ (การจดจำความเร็วนั้นเป็นเวกเตอร์)

นี่คือตัวอย่างการทำงานที่ฉันนำมาใช้ในเช้านี้ในกรณีของฉันสำหรับผู้เล่น AI ในเกมจำลองกีฬาที่ผู้เล่นพยายามไล่ล่าคู่ต่อสู้ การเคลื่อนไหวถูกควบคุมโดยโมเดล 'เตะ - ดริฟท์' มาตรฐานซึ่งการเร่งความเร็วจะถูกนำไปใช้ในช่วงเริ่มต้นของการประทับเวลาเพื่ออัปเดตความเร็วและจากนั้นวัตถุจะเคลื่อนที่ด้วยความเร็วนั้นในช่วงเวลาของการประทับเวลา

ฉันจะโพสต์ความเป็นมาของสิ่งนี้ แต่ฉันพบว่าไม่มีมาร์กอัปคณิตศาสตร์สนับสนุนเว็บไซต์นี้ พลาด! คุณจะต้องเชื่อมั่นว่านี่เป็นทางออกที่ดีที่สุดโดยที่ฉันไม่มีข้อ จำกัด เกี่ยวกับทิศทางการเร่งซึ่งไม่ใช่กรณีของวัตถุประเภทขีปนาวุธดังนั้นจึงต้องมีข้อ จำกัด เพิ่มเติมบางอย่าง

รหัสอยู่ในหลาม แต่ควรอ่านได้ด้วยพื้นหลังภาษาใด ๆ เพื่อความง่ายฉันคิดว่าแต่ละขั้นตอนมีความยาว 1 และแสดงความเร็วและความเร่งในหน่วยที่เหมาะสมเพื่อสะท้อน

self.x = # current x co-ordinate
self.y = # current y co-ordinate
self.angle = # current angle of motion
self.current_speed = # current magnitude of the velocity
self.acc # Maximum acceleration player can exert on themselves
target_x = # x co-ordinate of target position or projection of it
target_y = # y co-ordinate of target position or projection of it
vx = self.current_speed * math.cos(self.angle) # current velocity x component
vy = self.current_speed * math.sin(self.angle) # current velocity y component
# Find best direction to accelerate
acc_angle = math.atan2(self.x + vx - target_x,self.y + vy - target_y)

โปรดทราบว่าฟังก์ชั่น atan2 (a, b) คำนวณค่าผกผันแทนของ a / b แต่ทำให้แน่ใจว่ามุมอยู่ในจตุภาคที่ถูกต้องของวงกลมซึ่งต้องรู้เครื่องหมายของทั้ง a และ b

ในกรณีของฉันเมื่อฉันมีการเร่งความเร็วฉันใช้สิ่งนั้นเพื่ออัปเดตความเร็วด้วย

vx_new = vx + self.acc * math.cos(acc_angle)
vy_new = vy + self.acc * math.sin(acc_angle)
self.current_speed = math.sqrt( vx_new**2 + vy_new**2)
self.angle = math.atan2(vy_new,vx_new)

ฉันยังตรวจสอบความเร็วใหม่กับผู้เล่นที่ขึ้นอยู่กับความเร็วสูงสุดและกำหนดไว้ที่นั้น ในกรณีของขีปนาวุธรถยนต์หรือบางสิ่งที่มีอัตราการเลี้ยวสูงสุด (เป็นองศาต่อเห็บ) คุณสามารถดูมุมการเคลื่อนที่ปัจจุบันเทียบกับอุดมคติที่คำนวณได้และหากการเปลี่ยนแปลงนี้มากกว่าที่อนุญาตเพียงแค่เปลี่ยนมุมโดยเป็น มากที่สุดเท่าที่เป็นไปได้ในอุดมคติ

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


ในบางสถานการณ์ฉันเกือบจะแนะนำให้ตั้งค่าความเร็วโดยตรง - แม้ว่ามันอาจเป็นการยากที่จะรวมเข้ากับระบบฟิสิกส์ส่วนใหญ่ขึ้นอยู่กับแรง หากนี่เป็นเกมที่ยิงขีปนาวุธเป็นประจำด้วย "หลบ" ไม่ใช่ช่างเกมที่มีชื่อเสียงคุณอาจต้องการหลีกเลี่ยงความเสี่ยงเล็ก ๆ ที่ฟิสิกส์จะเข้ามาและให้ความมั่นใจว่ากลไกนี้ทำงานตามที่ผู้เล่นคาดหวัง ทุกครั้ง นี่อาจเป็นเหตุผลว่า RTS เป็นเกมที่มีพื้นที่มากกว่า
Katana314

0

คุณกำลังใช้อัตราการเลี้ยวคงที่ นั่นคือสิ่งที่ทำให้วงโคจรกลมดีอย่างสมบูรณ์

แนวทางที่สมจริงยิ่งขึ้นสำหรับระบบนำทางคือการเปลี่ยนอัตราการเลี้ยวด้วยระยะทางเป้าหมายผกผัน (ระยะทางน้อยกว่า -> อัตราการเลี้ยวมากขึ้น) สิ่งนี้จะทำให้เป็นเกลียวแทนที่จะเป็นวงโคจรและรับประกันการชนกับเป้าหมายที่ช้ากว่า

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

ไม่จำเป็นต้องมีสมการบางส่วน

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