ฉันกำลังทำ AI พื้นฐานสำหรับนักเลื่อนด้านข้างของฉันและฉันจำเป็นต้องรู้ว่าหน่วย AI สามารถเข้าถึงจุด B จากจุด A ได้ง่ายๆหรือไม่โดยการกระโดด
เที่ยวบินวิถีของตัวละครของฉันเป็นบิตผิดปกติเพราะพวกเขาสามารถใช้บังคับในกลางอากาศ (เช่นในแจ๊ส Jackrabbit 2 ตัวอย่าง) ดังนั้นจึงแตกต่างจากวิถีดั้งเดิมของกระสุนปืนซึ่งเป็นเรื่องเกี่ยวกับ ...
เส้นทางที่กระสุนปืนโยนหรือเปิดตัวจะใช้เวลา (... ) โดยไม่มีแรงขับ
... ฉันคิดว่าปัญหาของฉันเป็นเรื่องเกี่ยวกับกระสุนปืนด้วยการขับเคลื่อน (เช่นจรวด)
เพื่อแสดงให้เห็นว่านี่เป็นลักษณะที่โค้งของเที่ยวบินสำหรับตัวละครของฉันถ้าฉันกระโดดและกดปุ่ม "ซ้าย" อย่างต่อเนื่อง (มันดูแตกต่างกันที่ปลายด้านซ้ายนี่คือจุดที่ฉันสร้าง manuevers กลางอากาศ):
แรงที่กระทำระหว่างการบินจะขนานกับแกน X เสมอดังนั้นมันจึงเป็นF = (-f, 0)ถ้าฉันถือ "ซ้าย" และมันคือF = (f, 0)ถ้าฉันถือ "ขวา"
เขาสามารถเคลื่อนไหวได้เหมือนนักเล่นสกี:
ดังนั้นมันจึงแตกต่างจากวิถีคลาสสิกซึ่งเป็นเพียงพาราโบลา (ที่มา: วิกิพีเดีย ):
เพื่อให้ยากขึ้นฉันกำลังจำลองการต้านทานอากาศอย่างง่ายเพื่อให้ตัวละครของฉันสามารถเร่งความเร็วได้สูงสุดถึงค่าความเร็วสูงสุดเท่านั้น
ทำได้โดยใช้แรงเล็กน้อยในทิศทางตรงกันข้ามของการเดินทาง :
b2Vec2 vel = body->GetLinearVelocity();
float speed = vel.Normalize(); //normalizes vector and returns length
body->ApplyForce( AIR_RESISTANCE_MULT * speed * speed * -vel, body->GetWorldCenter() );
AIR_RESISTANCE_MULT เป็นค่าคงที่ในกรณีของฉันเท่ากับ 0.1
สมมติว่าตัวละครของฉันเป็นจุดเล็ก ๆ
และฉันไม่ได้คำนึงถึงสิ่งกีดขวางดังนั้นคำถามของฉันจะเป็นเช่นนี้ ...
วิธีการตรวจสอบ (อย่างน้อยก็เดาได้อย่างน่าเชื่อถือ), รับความเร็วเริ่มต้น V, แรงกระตุ้นJ = (0, -j)ที่ฉันใช้กับตัวละครเมื่อกระโดด, แรงโน้มถ่วงG = (0, g) , แรงF = (+ -f , 0)นำไปใช้อย่างต่อเนื่องในระหว่างการบินและ AIR_RESISTANCE_MULT ถ้าเราตัดสินใจที่จะใช้ความต้านทานอากาศ (นี่เป็นทางเลือก) ไม่ว่าจะเป็นจุดที่อยู่ด้านล่างของเส้นโค้งที่วาดโดยเส้นทางที่ตัวละครของฉันจะใช้?
ฉันไม่รู้ว่าจะเริ่มต้นด้วยการคำนวณได้อย่างไรและที่จริงแล้วฉันไม่ได้สนใจคำตอบที่แน่นอน การแฮ็ค / การประมาณที่ใช้งานได้ดีนั้นจะยอดเยี่ยมเพราะ AI โดยไม่จำเป็นต้องทำหน้าที่อย่างสมบูรณ์แบบ
แก้ไข:ฉันตัดสินใจที่จะแก้ปัญหานี้โดยใช้การจำลองตามที่ Jason แนะนำ แต่จะจัดการกรณีเช่นนี้ได้อย่างไร
ฉันควรจะวาดส่วนจากCถึงDและตรวจสอบว่าจุดที่ต้องการอยู่ด้านล่างส่วนนี้?
หรือฉันควรค้นหาไบนารีเวลาระหว่างCและDเพื่อค้นหาจุดที่อยู่ใกล้พอในระยะทางแนวนอนไปยังจุดที่ต้องการและจากนั้นตรวจสอบความแตกต่างแนวตั้ง? (ดูเหมือนจะเกินความจริงเล็กน้อยสำหรับฉัน)