วิธีการคำนวณมุมยิงและความเร็วในการยิงเป้าเคลื่อนที่?


11

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

ไม่มีใครมีเคล็ดลับสำหรับอัลกอริทึมแบบง่าย - ish (เหมาะสมที่สุด - ish) ในการคำนวณเมื่อกระสุนปืนต้องการยิงและตำแหน่งที่ต้องการเล็งหากมันสามารถเคลื่อนที่ด้วยความเร็วคงที่เท่านั้น? พูดว่า projectile ไปที่ความเร็วของเป้าหมายเป็นสองเท่า?

วิธีเดียวที่ฉันสามารถนึกถึงเกี่ยวข้องกับการค้นหาและดูเหมือนจะค่อนข้างใหญ่


ที่เกี่ยวข้อง: gamedev.stackexchange.com/questions/17467/…
John McDonald

@ JohnMcDonald: ไม่เกี่ยวข้องกันมากนั่นเป็นเรื่องเกี่ยวกับขีปนาวุธพาราโบลาไม่ใช่เชิงเส้น นี่ใกล้มากแล้ว: gamedev.stackexchange.com/questions/4995/…
e100

คำตอบ:


13

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

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

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


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

@TheLima yup เหมือนกับที่ได้กล่าวไว้ในประโยคที่ 2 ของคำตอบ ;-)
Steve H

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

อะไรคือสิ่งที่a0 คืออะไร? สิ่งนี้จะสร้างการหารด้วยศูนย์ยกเว้น แต่สิ่งนี้หมายความว่าในแง่ของตัวแปร t? มันควรจะได้รับการพิจารณาว่าเป็น 'จำนวนมาก' หรือกรณีที่ดีที่สุดจะเป็นอย่างไร
fAllnx

มีหนังสือดีเล่มหนึ่งที่เข้ามาในสัญชาตญาณเบื้องหลังเรื่องนี้หรือไม่? ฉันอยากรู้ว่าคุณรู้จักการค้นหาคณิตศาสตร์นี้ได้อย่างไร
davidkomer

4

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

AI ตำแหน่งของเป้าหมายในช่วงเวลาที่กระสุนปืนถูกยิงและตำแหน่งสุดท้ายของเป้าหมาย ณ จุดตายเป็นรูปสามเหลี่ยมนี่คือสิ่งที่คุณควรทราบแล้ว:

  1. ความยาวด้าน a ซึ่งเป็นความเร็วของกระสุน
  2. ความยาวด้าน b ซึ่งเป็นความเร็วเป้าหมาย
  3. มุมของการเคลื่อนที่ของเป้าหมายการเคลื่อนที่ของเป้าหมาย

คุณมีสามเหลี่ยมสามส่วน, เคส SSA, แก้มันแบบนี้

  1. ค้นหามุม B ตามมุมของการเคลื่อนที่และตำแหน่งของ AI
  2. ใช้กฎแห่งไซน์เพื่อหามุมก

มุม A ควรอนุญาตให้คุณกำหนดมุมที่ควรเปิดใช้กระสุนปืน

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