วิธีการคำนวณเวกเตอร์ของการสกัดกั้น?


11

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

เรือที่เป็นมิตรต้องการเข้าสู่ระยะการยิงเพื่อต่อสู้กับศัตรู

อันที่จริงฉันกำลังตั้งค่าเวกเตอร์โดยตรงไปยังตำแหน่งจริงที่เคลื่อนย้ายเรือและคำนวณใหม่ทุกเฟรมทำให้เกิดเส้นทางบิน "รอบ" บางประเภท

สิ่งที่ฉันต้องการคือการตั้งค่าเส้นทางตรงและตรงไปยังตำแหน่งที่ศัตรูจะ (เมื่อ) จะมีเมื่อถึงระยะการยิงจะถึงสมมติว่าศัตรูจะไม่เปลี่ยนเส้นทางจนกว่าจะถึงวันนั้น

เป็นการใช้งานครั้งแรกและ "ง่าย" มันจะเพียงพอหากเราคิดว่าเพื่อนสามารถเพิ่มความเร็วจาก 0 เป็นสูงสุดในเวลาไม่นาน

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

คำตอบ:


5

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

Vector totarget =  target.position - tower.position;

float a = Vector.Dot(target.velocity, target.velocity) - (bullet.velocity * bullet.velocity);
float b = 2 * Vector.Dot(target.velocity, totarget);
float c = Vector.Dot(totarget, totarget);

float p = -b / (2 * a);
float q = (float)Math.Sqrt((b * b) - 4 * a * c) / (2 * a);

float t1 = p - q;
float t2 = p + q;
float t;

if (t1 > t2 && t2 > 0)
{
    t = t2;
}
else
{
    t = t1;
}

Vector aimSpot = target.position + target.velocity * t;
Vector bulletPath = aimSpot - tower.position;
float timeToImpact = bulletPath.Length() / bullet.speed;//speed must be in units per second

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


จากคำอธิบายของคุณสิ่งนี้ดูเหมือนจะเป็นสิ่งที่ฉันกำลังค้นหาอย่างน้อยวิธีที่ง่ายที่สมมติว่าการเร่งความเร็วทันทีเป็นความเร็วสูงสุด ฉันจะลองดูเรื่องนี้อย่างละเอียดในตอนเย็น ฉันสมมติว่า Vector.Dot ส่งคืน dotproduct ของเป็นเวกเตอร์หรือไม่
NobbZ

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

ตัวอย่างมาจากหนังสือเล่มนี้: amazon.com/…
Steve H

1
ไม่ทราบว่าจะช่วยได้หรือไม่ แต่นี่คือรหัสไพ ธ อนบางตัวที่ทำสิ่งเดียวกันสำเร็จ moddb.com/mods/wicmw/tutorials/…
Steve H

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

6

ฉันแนะนำให้คุณดูพฤติกรรมการบังคับเลี้ยว โดยเฉพาะอย่างยิ่งการแสวงหา ซอร์สโค้ดสามารถพบได้ในการใช้งานOpenSteerหรือค้นหาหนังสือเช่น " Programming game AI ตามตัวอย่าง " (ISBN 13: 978-1556220784)


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

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

จากนั้นฉันมีคำอธิบายที่ผิดพลาดฉันจะลองดูอีกครั้งในวันพรุ่งนี้
NobbZ

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

@NobbZ ฉันขอโทษคำตอบของฉันไม่เป็นประโยชน์ คุณควรแก้ไขคำถามของคุณให้เหมาะสมเนื่องจากข้อความเช่น: "ฉันรู้ว่าในกรณีที่การเปลี่ยนแปลงความเร็วหรือเส้นทางของศัตรูต้องคำนวณซ้ำทุกครั้ง" อาจทำให้เข้าใจผิด .. ถ้าคุณทำเช่นนั้นคุณจะต้องจบด้วย พฤติกรรมการบังคับทิศทาง
bummzack
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.