วิธีการคำนวณการเลี้ยวมุ่งหน้าไปยังจรวดหรือไม่


14

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

แก้ไข

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

หลังจากเปิดตัวขีปนาวุธแผนที่จะแสดงการติดตามขีปนาวุธในบรรทัดนี้เพื่อระบุเส้นทางการบิน

สิ่งที่ฉันทำคือการทำงานกับเครื่องจำลองที่เลียนแบบซอฟต์แวร์การดำเนินงาน ดังนั้นฉันต้องวาดเส้นทางการบินที่คำนวณได้ก่อนที่จะเปิดตัวขีปนาวุธ

ขีปนาวุธสองนัดพุ่งเป้าไปที่สองเป้าหมาย

ในตัวอย่างนี้เป้าหมายอยู่ด้านหลังรถยิง แต่เส้นทางที่ถูกคำนวณล่วงหน้าจะถูกวาด


1
หัวเรื่องมีการคำนวณล่วงหน้าหรือเปลี่ยนแปลงระหว่างวิถีการเคลื่อนที่หรือไม่? (เหมือนขีปนาวุธกลับบ้าน?)
Jonathan Connell

1
มันจะไม่เป็นเมื่อ (x2-x1) ^ 2 + (y2-y1) ^ 2 = r ^ 2 โดยที่ (x1, y1) เป็นตำแหน่งของขีปนาวุธปัจจุบันและ (x2, y2) เป็นเป้าหมายหรือไม่
The Duck คอมมิวนิสต์

บางทีคุณควรวาดภาพสิ่งที่คุณต้องการ
aaaaaaaaaaaa

3
นี่เป็นปัญหา 2D หรือ 3D หรือไม่
Steve H

หากคุณกำลังมองหาขีปนาวุธกลับบ้านคุณสามารถทำได้โดยไม่ต้องใช้ตรีโกณมิติ ดูคำถามนี้
BlueRaja - Danny Pflughoeft

คำตอบ:


9

คณิตศาสตร์ของฉันอาจผิดไปเล็กน้อยดังนั้นฉันจึงได้คำตอบ

ฉันคิดว่าคุณต้องการทำสถานการณ์การกลับบ้านอย่างต่อเนื่อง - ที่ขีปนาวุธ P1 เดินทางด้วยความเร็ว V1 พยายามที่จะหันไปทางเครื่องเล่น P2 เสมอ แต่มีอัตราการหมุน จำกัด

  1. กำหนดเวกเตอร์ระหว่างผู้เล่นและขีปนาวุธ

    V2 = P2 - P1
  2. เปลี่ยนเป็นเวกเตอร์หน่วย

    V3 = UNIT(V1)
    V4 = UNIT(V2)
  3. กำหนดมุมระหว่างเวกเตอร์

    a = ARCCOS(V3 * V4) (* indicating dot product)
  4. จำกัด ค่าของมุมระหว่างพวกเขา (จำได้ว่าฟังก์ชั่นตรีโกณมิติของคุณอาจทำงานกับเรเดียนดังนั้นให้ลอง 0.1 เป็นอัตราการหมุน)

    a = SIGN(a) * MINIMUM(ABS(a), MaximumTurningRate)
  5. สร้างเวกเตอร์การเคลื่อนไหวใหม่

    V1 = UNIT(V3.x + SIN(a), V4.y + COS(a)) * MissileSpeed

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


1
อืม ... ถ้าหน่วยความจำทำหน้าที่ฉันคิดว่าคุณต้องทำ cross-product เพื่อให้ได้ทิศทางของมุม ถ้าคุณทำผลิตภัณฑ์ดอทคุณจะรู้ขนาดของมุม แต่ไม่ใช่ทิศทาง (เนื่องจากผลิตภัณฑ์ดอทสามารถมี V3 * V4 = V4 * V3 ได้ดูเหมือนจะไม่มีความแตกต่างในการวางแนว) ดังนั้นทำดอทโปรดัคแล้วทำครอสโปรดัค - ตรวจสอบเครื่องหมายของพิกัด Z - เพื่อหาทิศทาง
ChrisE

@ChrisE ตัวอย่างเป็นแบบ 2 มิติ (ดูที่ 5) ดังนั้นการวางแนวดั้งเดิมและขนาดของมุมควรเพียงพอ
Keeblebrox

การคำนวณมุมระหว่างนั้นถูกต้อง แต่ฉันไม่แน่ใจว่าสิ่งที่คุณตั้งใจไว้ในขั้นตอนที่ 5 นั้นเป็นอย่างไรหรือสิ่งที่มันผลิตออกมา เป็นขั้นตอนที่ 5 สมมติว่าเพิ่มมุม a ไปยัง v3 เพราะฉันไม่เข้าใจคณิตศาสตร์
dlots

@ สลัมขั้นตอนที่ 5 ควรเพิ่ม 'มุม จำกัด อัตราการหมุน' ใหม่ให้กับเวกเตอร์การเคลื่อนไหวปัจจุบัน - โดยทั่วไปจะเปลี่ยนทิศทางของขีปนาวุธ
Jonathan Dickinson

อะไรคือสิ่งที่SIGNอยู่ในขั้นตอนที่ 4?
Daniel Kaplan

2

ฉันคิดว่าคุณต้องการเปลี่ยนทิศทางโดยเปลี่ยนหัวข้อการเรียกใช้ไปยังส่วนหัวเป้าหมายจากนั้นดำเนินการตรงไปยังเป้าหมาย

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

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

วิธีนี้ไม่ได้เป็นไปได้เสมอตัวอย่างเช่นเมื่อคุณไม่มีทัศนวิสัยในเส้นทาง 90 ° (อาคารหรือสิ่งกีดขวางอื่น ๆ )

ข่าวดีก็คือว่าวิธีการแก้ปัญหาทำงานได้กับทุกมุม (ไม่ใช่แค่ตำนาน 90 °) เคล็ดลับคือการคำนึงถึงพื้นที่ที่จำเป็นในการเปิดเริ่มหันมาก่อน

ก่อนหน้านี้เท่าไหร่ นี่คือเหตุผลที่ 90 °สิ่งของเป็นทางออกที่ง่ายที่สุด ...

สมมติว่าคุณเข้าถึงทัศนวิสัยหรือเป้าหมายที่ดีที่สุดเมื่อเส้นทางการยิงก่อตัวเป็นมุมθ°จากนั้นคุณควรคาดการณ์การเลี้ยวโดย:

(sec(90° - θ°) + tan(90° - θ°)) * turning_radius

... โดยที่ซีแคนต์เป็นส่วนกลับของโคไซน์ หลักฐานเป็นเรื่องเล็กน้อยและเหลือไว้สำหรับผู้อ่าน

อย่างจริงจังสูตรมาจากโครงสร้างทางเรขาคณิตที่เรียบง่าย

กราฟจุดเปลี่ยน

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

ส่วนสีเขียวนั้นยาว Turning_radius ดังนั้นคุณจะเห็นว่า

AB แทนเจนต์ 90 ° - θ°

BC เป็นเส้นตัดขวาง

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

แจ้งให้เราทราบหากคุณเห็นข้อผิดพลาดบางอย่าง

แก้ไข:

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

ป้อนคำอธิบายรูปภาพที่นี่

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


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

1

ฉันจะใช้ "พฤติกรรมการหมุนพวงมาลัย" สำหรับขีปนาวุธ ขีปนาวุธมี: ความเร็ว (ตัวเลข), ตำแหน่ง (เวกเตอร์) และการหมุน (ปัจจุบัน) ในการอัพเดทแต่ละครั้งในเกมของคุณ / ในแต่ละเฟรมการหมุนของ missle นั้นเปลี่ยนไปเล็กน้อย (ไปยังเป้าหมาย) จากนั้นขีปนาวุธจะเคลื่อนที่ไปข้างหน้าตามการหมุนปัจจุบันและความเร็วปัจจุบัน

ใช้งานได้กับ 2D และ 3D เนื่องจากความแตกต่างเพียงอย่างเดียวคือมิติเพิ่มเติม

ความเป็นไปได้อีกอย่างก็คือการคำนวณวิถีของขีปนาวุธก่อนที่จะดุ เงยหน้าขึ้นมองBezier เส้นโค้งหรือเส้นโค้ง


ปัญหาเกี่ยวกับการใช้ spline ที่นี่คือคุณจะต้องปรับปรุงจุดควบคุมอย่างต่อเนื่องหากเป้าหมายเคลื่อนที่ พวงมาลัยแบบธรรมดาที่นี่อาจจะถูกกว่าการคำนวณ
ChrisE

ที่จริงฉันพยายามคำนวณเส้นทางไปยังเป้าหมาย สิ่งที่ฉันกำลังทำงานเป็นเครื่องจำลองสำหรับอุปกรณ์จริงบางอย่างและฉันพยายามเลียนแบบพฤติกรรมของอุปกรณ์จริง
Tony

0

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


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

0

ฉันคิดว่าอัลกอริทึมที่ง่ายที่สุดเพียงแค่ปฏิบัติตามกฎสองข้อ:

  1. หากเป้าหมายปัจจุบันใกล้กับมิสไซล์มากกว่าเส้นผ่านศูนย์กลางวงเลี้ยวให้ตรงไปเรื่อย ๆ วิธีนี้จะหลีกเลี่ยงขีปนาวุธที่โคจรอยู่ใกล้กับเป้าหมายแทนที่จะเข้าใกล้พวกมัน

  2. มิฉะนั้นหันไปทางเป้าหมายจนกว่าคุณจะชี้ไปที่มัน

วิธีคำนวณจุดสิ้นสุดของการเลี้ยวในรูปแบบ 2D:

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

  2. ตอนนี้คุณสามารถสร้างสามเหลี่ยมมุมฉากด้วยมุมฉากที่แทนเจนต์และจุดที่รู้จักสองจุดคือ P และปลายทางของคุณ สิ่งนี้ช่วยให้คุณคำนวณระยะทางจากแทนเจนต์ถึงจุดเป้าหมายของคุณด้วย Pythagoras เรียกมันว่า D

  3. ทีนี้คุณต้องคำนวณจุดตัดของรัศมี D ที่ปลายทางของคุณด้วยวงเลี้ยวของคุณ คุณจะได้คำตอบสองวิธีซึ่งเป็นจุดสัมผัสสองจุดในวงกลมนั้นซึ่งขีปนาวุธจะหยุดหมุน (หนึ่งอันสำหรับแต่ละทิศทางของการเดินทางรอบวงกลม) เลือกจุดที่อยู่ด้านหน้าของจรวด - นั่นคือคำตอบของคุณ

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