ฉันรู้ว่านี่เป็นคำถามแบบโบราณ แต่ฉันคิดว่ามีบางสิ่งที่ไม่ได้รับคำตอบในตอนนี้ ในคำถามดั้งเดิมขีปนาวุธ (หรืออะไรก็ตาม) ก็ถูกสั่งให้เร่งความเร็วไปยังตำแหน่งของเป้าหมาย หลายคำตอบชี้ให้เห็นว่านี่เป็นสิ่งที่ผิดและคุณควรเร่งไปยังจุดที่คุณคิดว่าจะเป็นเป้าหมายในภายหลัง มันดีกว่า แต่ก็ผิด
สิ่งที่คุณต้องการทำจริง ๆ ไม่ได้เร่งไปยังเป้าหมาย แต่เคลื่อนที่ไปสู่เป้าหมาย วิธีคิดเกี่ยวกับสิ่งนี้คือการตั้งค่าความเร็วที่คุณต้องการชี้ไปที่เป้าหมาย (หรือการฉายภาพของตำแหน่งเป้าหมาย) จากนั้นหาว่าการเร่งความเร็วที่คุณสามารถนำไปใช้ได้ดีที่สุดคืออะไร ตรงกันข้ามโดยตรง) เพื่อให้ได้ความเร็วที่คุณต้องการ (การจดจำความเร็วนั้นเป็นเวกเตอร์)
นี่คือตัวอย่างการทำงานที่ฉันนำมาใช้ในเช้านี้ในกรณีของฉันสำหรับผู้เล่น 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 ในแง่ของตำแหน่งเริ่มต้นความเร็วอัตราการเร่งและมุมการเร่งความเร็วจากนั้นจึงหาอนุพันธ์เทียบกับมุมการเร่งความเร็ว การตั้งค่านั้นให้เป็นศูนย์จะเป็นการหาค่าต่ำสุดของระยะทางเป้าหมายผู้เล่นหลังจากการจับเวลาเป็นฟังก์ชั่นของมุมการเร่งความเร็วซึ่งเป็นสิ่งที่เราต้องการรู้ ที่น่าสนใจถึงแม้ว่าอัตราการเร่งจะเป็นแบบดั้งเดิมในสมการ แต่มันก็ยกเลิกการสร้างทิศทางที่ดีที่สุดโดยไม่ขึ้นอยู่กับว่าคุณสามารถเร่งความเร็วได้มากแค่ไหน