การค้นหาความเร็วที่ถูกต้องสำหรับ AI เพื่อให้บรรลุเป้าหมาย


10

ฉันมีเรือที่เดินทางด้วยความเร็วสูงสุดmaxSpeedและสามารถเปลี่ยนrotationSpeedองศาต่อวินาที เรือเคลื่อนที่ไปในทิศทางที่หันหน้าไปทางเสมอซึ่งหมายความว่ายิ่งแล่นเรือเร็วเท่าไหร่รัศมีการเลี้ยวยิ่งใหญ่ขึ้นเท่านั้น

ฉันรู้ตำแหน่งของฉันการหมุนและตำแหน่งของเป้าหมาย

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

มีวิธีที่มีประสิทธิภาพ (ish) การทำเช่นนี้?

นี่คือสิ่งที่ฉันคิดอยู่จนถึงตอนนี้: เพราะฉันรู้ว่าฉันเดินทางไปไกลแค่ไหนต่อขั้นตอนและเท่าไหร่ที่ฉันหมุนไปตามขั้นตอนเท่าไหร่ฉันจึงสามารถรู้ได้ว่าฉันจะอยู่ที่ไหนในสองเฟรม ตำแหน่งปัจจุบันของฉันคือ p1 ตำแหน่งถัดไปของฉันคือ p2 จากนั้น p3 ฉันสามารถหาเส้นแบ่งครึ่งตั้งฉากของ (p1, p2) และ (p2, p3) จุดตัดของพวกเขาจะให้ศูนย์กลางของวงกลมแก่ฉัน ฉันสามารถทดสอบว่าเป้าหมายอยู่ในวงกลมนั้นหรือไม่

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

ทุกคนสามารถปลดปล่อยแสงให้กับทางออกที่ดีกว่าได้หรือไม่?

คำตอบ:


17

หน่วยควบคุม AI มีสองวิธีด้วยความเร็วการหมุนที่ถูกผูกไว้และความเร็วในการเคลื่อนที่ที่ปรับได้สามารถไปถึงเป้าหมายได้

ก่อนอื่นให้พิจารณาความท้าทายที่เรานำเสนอด้วยเพื่อให้เราเข้าใจได้ดีขึ้น:

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

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

พื้นที่วงกลมที่มีเครื่องหมายสีแดงสามารถคำนวณได้ดังนี้:

radius = movementSpeed / rotationSpeedInRadians;
circlesCenterX = unitX + cos(unitAngle + / - PI) * radius;
circlesCenterY = unitY + sin(unitAngle + / - PI) * radius;

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

ในการตรวจสอบว่ามีบางรายการอยู่ในวงกลมหรือไม่เราเพียงคำนวณระยะทางจากศูนย์กลางของวงกลม:

if ((circleX - goalX)^2 + (circleY - goalY)^2 < radius^2) //goal is within red circle

มีสองวิธีแก้ปัญหาที่เป็นไปได้สำหรับสิ่งนี้:

1

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

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

ตัวเลือกอื่น ๆ ต้องการการคำนวณอีกเล็กน้อย:

เราวาดเส้นจินตภาพระหว่างหน่วย AI และเป้าหมาย ใช้มุมระหว่างพวกเขา:

angle = Math.atan2(goalY - unitY, goalX - unitX);

ตอนนี้คุณต้องทำสิ่งต่อไปนี้เพื่อคำนวณความเร็วที่ถูกต้อง:

correctSpeed = rotationSpeedInRadians * (distance / 2) / cos(angle);

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

เพื่อให้มันทำงานในกรณี 3d:

ค้นหาระนาบที่จุดสามจุดต่อไปนี้อยู่:

  1. จุดเป้าหมาย
  2. ตำแหน่งของหน่วย AI ในเฟรมก่อนหน้า
  3. ตำแหน่งปัจจุบันของหน่วย AI

คุณสามารถใช้เครื่องบินลำนั้นเพื่อคำนวณความเร็วในแบบ 2d คุณเพียงแค่ต้องแปลงจุดจากค่า 3 มิติเป็นค่า 2d ที่ฝังอยู่ในระนาบทั่วไป

คุณอาจต้องการใช้สิ่งนี้:

จะแปลงจุด 3D บนระนาบเป็นพิกัด UV ได้อย่างไร


ที่สมบูรณ์แบบ! คำตอบที่ฉันหวังไว้อย่างแน่นอน! ขอบคุณสำหรับคำอธิบายโดยละเอียดของคุณฉันคิดว่าฉันสามารถคาดการณ์เกี่ยวกับสิ่งนี้และใช้มันในแบบ 3 มิติ
weichsem

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