ตัวละครของฉันจะหยุดที่ไหน


12

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

  • ศัตรูอยู่ที่ X = 540.0
  • ศัตรูเคลื่อนที่ไปทางขวาที่ 10 พิกเซลต่อเฟรม
  • เมื่อศัตรูต้องการหยุดความเร็วก็จะลดลง 1 พิกเซลต่อเฟรมจนกว่าจะถึงศูนย์

มีสูตรง่าย ๆ ที่จะให้ฉันอยู่ในตำแหน่งที่ศัตรูลงเอยเมื่อเขาหยุดเต็มที่หรือไม่? ฉันสิ้นสุดการคำนวณล่วงหน้าและฮาร์ดโค้ดออฟเซ็ตซึ่งทำงานได้ตามความต้องการของฉัน แต่จะต้องคำนวณแยกต่างหากสำหรับศัตรูที่มีความเร็วแตกต่างกัน

คำตอบ:


7

ฉันเห็นด้วยกับคำตอบของจอห์น ฉันจะเสนอสูตรที่แก้ไขเล็กน้อย (ซึ่งเพิ่ม V / 2 พิเศษลงบนมูลค่าของเขา):

D = V / A * (V + A) / 2 

ด้วยV = 10และA = 1ที่ได้รับD55 = นี่คือผลลัพธ์ที่แท้จริงของ

10 + 9 + 8 + 7 + .... + 3 + 2 + 1

ซึ่งเป็นการเคลื่อนที่แบบทีละเฟรมของศัตรู

นี่คือวิธีที่คุณจะไปยังขั้นตอนนั้น

  1. V : ความเร็วปัจจุบัน = 10 พิกเซล / เฟรมA : การเร่งความเร็วปัจจุบัน = 1 พิกเซล / เฟรม ^ 2
  2. T : เวลามาถึง Stop = V / A = 10 เฟรม
  3. ระยะทางเดินทางใน 10 เฟรม = frame1 + frame2 + frame3 + ... = V + (VA) + (V-2 * A) + ...
  4. นี่เท่ากับ T * V - A / 2 * T * (T-1) ซึ่งทำให้สมการข้างบนง่ายขึ้น

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

ฉันตอบคำถามของฉันเองโดยใช้การคำนวณพลังงาน การใช้นิพจน์ของฉัน + (v / 2) ดูเหมือนจะเท่ากับนิพจน์ของคุณสำหรับ v และ a ใด ๆ
John McDonald

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

6

ฉันมีปัญหาเดียวกันที่แน่นอนเมื่อทำงานกับเกมของฉันและมันพาฉันไปตลอดกาลเพื่อให้ได้คณิตศาสตร์ที่ถูกต้อง (bleh) ดังนั้นนี่คือ:

minDistanceToStop = 0.5 * acceleration * Math.Pow(velocityLinear() / acceleration, 2.0);

เขียนใหม่ในคณิตศาสตร์ปกติ:

(Acceleration / 2) * (linearVelocity / Acceleration)^2

ในกรณีที่ความเร่งในกรณีของคุณคือ 1 และ linearVelocity เท่ากับ 10:

(1 / 2) * (10 / 1)^2
= 50 units to stop

แก้ไข

ผลลัพธ์และคำอธิบายของ Jimmy นั้นถูกต้องทั้งคู่ สูตรของฉันต้องการให้คุณเพิ่มความเร็วครึ่งหนึ่งด้วย

minDistanceToStop = (0.5 * acceleration * Math.Pow(velocityLinear() / acceleration, 2.0)) + (velocityLinear() / 2);

หรือ

((Acceleration / 2) * (linearVelocity / Acceleration)^2) + (linearVelocity / 2)
((1 / 2) * (10 / 1)^2) + (10 / 2)
= 55

2
สำหรับบันทึก Math.Pow () เป็นความคิดที่แย่มากและน่ากลัวที่นี่ มันอาจเป็นกรณีพิเศษเลขชี้กำลัง '2.0' หากมันฉลาดพอ แต่ไม่ว่าคุณจะเชือดมันแบบไหนการเขียนนิพจน์นั้นเป็น '0.5 * linearVelocity * linearVelocity / Acceleration' ควรจะชนะอย่างมาก
Steven Stadnicki

4

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


0

การเคลื่อนที่แบบเร่งความเร็วคงที่หรือไม่

X = Xi + V*t + (1/2) * a * (t^2)

ที่ไหน:
X: ตำแหน่งสุดท้าย
Xi: ตำแหน่งเริ่มต้น
V: ความเร็ว
t: เวลา
a: การเร่งความเร็ว

ส่วนที่ยุ่งยากเท่านั้นที่นี่คือวิธีการกำหนด "t" เนื่องจากเราช้าลงด้วยการเร่งความเร็ว -1 จากนั้นเราสามารถคำนวณ t = V / a จากนั้น t คือ 10

ดังนั้น
Xi: 540
V: 10
t: 10
a: -1

ใส่ทุกอย่างใน:

X = 540 + 10*10 + (1/2) * (-1) * (10 ^ 2) 
X = 540 + 100 + (-50) 
X = 540 + 50 
X = 590

สูตรมาจากการรวมการเร่งความเร็ว: ตรวจสอบที่นี่

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