การควบคุม AI สำหรับเรือที่มีโมเดลฟิสิกส์


19

ฉันกำลังมองหาแนวคิดที่จะใช้งานสิ่งต่อไปนี้ในพื้นที่ 2D น่าเสียดายที่ฉันยังไม่ค่อยรู้เกี่ยวกับ AI / การค้นหาเส้นทาง / การควบคุมอัตโนมัติ

สมมติว่าเรือลำนี้สามารถเคลื่อนที่ได้อย่างอิสระ แต่มันมีมวลและโมเมนตัม นอกจากนี้กองกำลังภายนอกอาจส่งผลกระทบต่อมัน (การระเบิด ฯลฯ ) ผู้เล่นสามารถกำหนดเป้าหมายสำหรับเรือได้ทุกเวลาและควรถึงจุดนั้นและหยุด

หากไม่มีฟิสิกส์นี่จะง่ายเพียงแค่ชี้ไปที่ทิศทางและไป แต่วิธีจัดการกับโมเมนตัมที่มีอยู่แล้วหยุดตรงจุด? ฉันไม่ต้องการแก้ไขตำแหน่งของเรือโดยตรง

แก้ไข: เพื่อให้ชัดเจนคณิตศาสตร์ที่เกี่ยวข้องกับฟิสิกส์ของตัวเรือเองไม่ใช่ปัญหา


ฉันคาดว่าจะพบปัญหาที่คล้ายกันนี้เร็ว ๆ นี้; ฉันหวังว่าจะได้เห็นคำตอบสำหรับสิ่งนี้
Bill

คำตอบ:


15

มีลักษณะที่พฤติกรรมพวงมาลัย โดยเฉพาะอย่างยิ่งการแสวงหาและการมาถึงอาจเป็นสิ่งที่น่าสนใจสำหรับความต้องการของคุณ พฤติกรรมเหล่านี้จะทำงานเมื่ออิทธิพลอื่น ๆ เช่นการระเบิดเปลี่ยนตำแหน่งของเรือชั่วคราว


+1 สำหรับเกมอวกาศ 2 มิติฉันขอแนะนำให้ใช้พฤติกรรมพวงมาลัยเป็นกรอบงานของคุณและใช้หนึ่งในคำตอบของฉันเป็นส่วนประกอบภายในกรอบงานนั้น
tenpn

จะแนะนำให้คิดแบบเดียวกันเมื่อฉันอ่านคำถาม ฉันใช้พฤติกรรมการบังคับเลี้ยวมากมันเป็นเรื่องง่ายและช่วยให้ AI / การเคลื่อนไหวที่ดีงาม
dotminic

5

ไม่ใช่เรื่องง่ายที่จะพูดถูก คุณมีสองทางเลือกแม้ว่าข้อมูลเฉพาะของแต่ละโซลูชันจะแตกต่างกันไป:

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

วิธีแก้ปัญหาเชิงอารมณ์ คุณสามารถใช้ตัวควบคุม PID ที่ปรับแต่งด้วยมือหรือบันทึกระยะเบรกสำหรับเรือของคุณในระบบฟิสิกส์ของคุณ: ใน testbed เบรคเรือจากความเร็วสูงสุดลงไปที่จุดหยุดบันทึกระยะทางที่เดินทางและเพิ่มความเร็วทุกวินาที จัดเก็บกราฟระยะทาง / ความเร็วผลลัพธ์ในไดเรกทอรีข้อมูล

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

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


1

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

น่าเสียดายที่http://www.red3d.com/cwr/steer/ไม่ได้ให้รหัสแหล่งที่มาสำหรับพฤติกรรม อย่างไรก็ตามการเขียนโปรแกรมเกม AI โดยตัวอย่างทำและอธิบายพฤติกรรมที่เข้าใจง่าย หากคุณไม่ได้รับหนังสือคุณสามารถรับรหัสต้นฉบับได้ที่นี่: http://www.wordware.com/files/ai/

นอกจากนี้หากคุณต้องการขยายการเคลื่อนไหวของคุณเพื่อรวมการหาเส้นทางคุณสามารถมีคลาส Pathfinder ที่คำนวณเส้นทาง (อาจเป็นคอลเลกชันของเวกเตอร์ 2D) และใช้พฤติกรรมการหมุนพวงมาลัยตามเส้นทางเพื่อเพิ่มสิ่งนั้นลงในส่วนผสมเช่นกัน

ซอร์สโค้ดที่ฉันเชื่อมโยงนั้นยังให้วิธีการที่แตกต่างกันสามวิธีในการรวมพฤติกรรมการบังคับเลี้ยวเหล่านี้เข้าด้วยกันเช่นกัน

หวังว่าจะช่วย


ลิงค์ red3d.com ไม่ได้ให้แหล่งข้อมูลโดยตรงแต่มีลิงค์อยู่ในหน้านั้นไปยัง OpenSteer ( opensteer.sourceforge.net ) ซึ่งเป็นการใช้โอเพ่นซอร์สของพฤติกรรมการหมุนพวงมาลัย
bummzack

อ่าไม่รู้เช่นนั้นขอบคุณ แม้ว่าฉันจะดูที่แหล่งข้อมูลของ OpenSteer และพบว่าการมองเห็นรหัสใบหน้าของคุณนั้นชัดเจนยิ่งขึ้นในหนังสือของ Buckland โดยเฉพาะอย่างยิ่งเมื่อเริ่มออก
Ray Dey

1

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

ฉันจะแก้ไขปัญหาโดยใช้เส้นโค้ง Hermite ตั้งค่า p0 และ m0 เป็นตำแหน่งและความเร็วของเรือของคุณ, p1 และ m1 เป็นตำแหน่งและความเร็วเป้าหมาย สิ่งนี้จะถือว่าคุณต้องการให้เรือรบติดตามหนึ่งวินาทีหลังจากเป้าหมาย คำนวณอนุพันธ์อันดับสองของ p (0) ที่จะทำให้คุณเร่งความเร็วเพื่อใช้กับเรือของคุณ

นี่คือรหัสสำหรับอนุพันธ์อันดับสอง (ใน F # ฉันหวังว่าคุณสามารถปรับให้เข้ากับภาษาที่คุณเลือก; sq () คำนวณสแควร์อัญประกาศเดี่ยวไม่ได้แปลว่าคำพูด แต่เป็นตัวละครพวกเขาเป็นส่วนหนึ่งของตัวระบุ:

    let h'' t =
        let h00'' t = 12.0 * t - 6.0
        let h10'' t = 6.0 * t - 4.0
        let h01'' t = -12.0 * t + 6.0
        let h11'' t = 6.0 * t - 2.0

        let t = (t - t0) / diff_t

        (sq (1.0 / diff_t)) *
        ((h00'' t * p0) +
         (h10'' t * diff_t * v0) +
         (h01'' t * p1) +
         (h11'' t * diff_t * v1))

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



-3

ฉันคิดว่าเรือของคุณควรมีพารามิเตอร์เช่น: ตำแหน่งและความเร็ว

ความเร็วอยู่ในผลรวมเฟรมของกองกำลังทั้งหมด (เช่นแรงโน้มถ่วงการระเบิดการป้อนข้อมูลของผู้ใช้เป็นต้น) และสามารถมีความชื้นบางชนิด

ตำแหน่งจะคำนวณจากตำแหน่งล่าสุดพร้อมความเร็ว * time_step

อย่างไรก็ตามด้วยสิ่งนี้อาจเป็นเรื่องยากที่จะใช้การหยุดตามเป้าหมาย


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