คุณทำ AI เส้นทางต่อไปนี้ภายในเอนจินฟิสิกส์ 2 มิติเช่น farseer / box2d ได้อย่างไร


12

ฉันกำลังอยู่ระหว่างการเคลื่อนย้ายเกมบนลงล่างแบบ 2d ฉันได้ทำงานเป็นเครื่องมือทางฟิสิกส์ของร่างกายที่แข็งแกร่งอย่าง Farseer จนถึงตอนนี้ฉันเพิ่งแฮกรหัสฟิสิกส์ของฉันเองเมื่อจำเป็น

ฉันพยายามเรียนรู้วิธีการทำสิ่งต่างๆที่นี่

อะไรคือวิธีที่เหมาะสมในการทำให้ AI ของคุณเดินไปตามเส้นทางที่กำหนดเมื่อคุณทำให้พวกมันแข็งตัวอยู่ภายในเครื่องยนต์ฟิสิกส์?

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

แต่ตอนนี้พวกเขามีร่างกายที่แข็งแรงและถูกชนและกองกำลังใด ๆ ที่อาจโจมตีพวกเขาและทำให้พวกเขาหลุดออกจากเส้นทาง

ดังนั้นเพื่อให้การเคลื่อนไหว AI ฉันเชื่อว่าตอนนี้ฉันควรจะใช้แรงกระตุ้น / กองกำลังกับพวกเขา? ฉันไม่ควรตั้งค่าตำแหน่งของแต่ละเฟรมด้วยตนเองอีกต่อไป

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

นั่นถูกต้องใช่ไหม? นั่นเป็นวิธีที่คนอื่นทำหรือไม่

นี่ทำให้เกิดคำถามบางอย่างเกี่ยวกับวิธีหลีกเลี่ยง AI ของคุณที่ติดอยู่ในมุมหนึ่งของทิวทัศน์ตอนนี้ว่าพวกเขาไม่ได้เดินในเส้นทางที่ถูกต้องพวกคุณจัดการกับสิ่งนั้นอย่างไร

หรือจะเป็นการดีกว่าถ้าจะผสมทั้งสองวิธีและยังคงให้ AI ของคุณติดตามเส้นทางคงที่ด้วยการตั้งตำแหน่งของตนเองและตอบสนองต่อแรงอื่น ๆ ภายใต้สถานการณ์ที่คุณสามารถควบคุมได้ง่าย?

ขอบคุณสำหรับคำแนะนำใด ๆ


1
+1 ฉันค่อนข้างสนใจที่จะเรียนรู้เกี่ยวกับสิ่งนี้
David Gouveia

คำตอบ:


7

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

ในการทำให้หน่วยเป็นไปตามเส้นทางคุณสามารถใช้Seekเพื่อไปจาก path-node ไปยัง path-node (ตรวจสอบให้แน่ใจว่าหลีกเลี่ยงการโอเวอร์โหลด) จากนั้นใช้Arrivalที่โหนดสุดท้ายในเส้นทางของคุณ

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


บทความที่น่าอัศจรรย์ขอบคุณสำหรับการแบ่งปัน บันทึกวันของฉัน
Ricardo Sanchez-Saez

0

ฉันว่าคุณกำลังติดตามขวาคุณอาจต้องการดูบทความนี้:

http://www.policyalmanac.org/games/aStarTutorial.htm

มันอธิบายการหลีกเลี่ยงการชนขั้นพื้นฐานบางอย่างและการค้นหาเส้นทางโดยใช้อัลกอริทึม A *

แก้ไข:

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


ฉันไม่คิดว่าบทความนั้นเกี่ยวข้องกับคำถามนี้ OP ไม่ได้ถามว่าจะหาเส้นทางที่ดีที่สุดระหว่างสองสถานที่ได้อย่างไร แต่จะทำอย่างไรให้นักแสดงทำตามเส้นทางที่เขาคำนวณไปแล้วภายในบริบทของการจำลองทางฟิสิกส์
David Gouveia

ดีเมื่อฉันอ่านมันอีกครั้งฉันเห็นจุดของคุณไม่ดีแก้ไขคำตอบของฉัน
ระบุชื่อ

:) ฉันเปลี่ยนชื่อและล้างสิ่งต่าง ๆ สนใจเส้นทางในการติดตามอย่างแน่นอนแทนที่จะค้นหาเส้นทาง
TerryB

0

ตัดสินโดยสิ่งที่ @davidluzgouveia แสดงความคิดเห็นในโพสต์ของ annonymously ฉันจะนำเสนอโครงการของฉัน การติดตามเส้นทางและการค้นหาเส้นทางนั้นแตกต่างกันมาก การค้นพบเส้นทางนั้นเป็นสิ่งที่ไม่มีใครรู้จักโพสต์และสำหรับการค้นหาเส้นทางฉันจะดูอัลกอริทึมของ Dijkstra สำหรับเส้นทางต่อไปนี้ฉันใช้เครื่องมือฟิสิกส์ที่ฉันเลือก วิธีที่ฉันตั้งค่าไว้ก็คือแต่ละตำแหน่งที่หน่วยเรียนเดินไปตั้งอยู่ในนั้นกำลังทำเส้นทาง subclass ผ่าน 2D offsets ใช่พวกเขาเป็น 2D และไม่ใช่ 3D นี่เป็นเพราะวิธีที่ฉันตั้งค่าฟิสิกส์ในเกมของฉัน .

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

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

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

โดยเฉพาะ 2D: คุณยังควรมีประเด็นหลักหรือเป็นข้อมูลอ้างอิงบางส่วนเพื่อให้เครื่องยนต์ผลักดันสิ่งนั้นเพื่อการเคลื่อนที่ของยูนิต คุณสามารถให้คลาสย่อยของการค้นหาเส้นทางแต่ละหน่วยที่มีสถานที่เพียงไม่กี่แห่งที่คุณต้องการคุณสามารถระบุไว้ในรหัสระดับ (เช่นตำแหน่ง 1 (x, y) location2 (x, y) ฯลฯ ) วิธีที่ดีที่สุด (ฉันไม่ ไม่ทราบว่าคุณกำลังเล่นเกมประเภทใด) อาจจะระบุตำแหน่งในระดับและให้แต่ละหน่วยประมวลผลตามลำดับที่ระบุในระดับและหลังจากที่มาถึงแต่ละตำแหน่งแล้วให้แทนที่ตำแหน่งที่ต้องการด้วย คนต่อไปที่มันต้องไป

มีหลายวิธีที่คุณสามารถปรับเปลี่ยนได้เช่นมีรายการสถานที่ในสถานที่แรกสำหรับแต่ละหน่วยเนื่องจากจะหมายความว่าทุกหน่วยไม่ต้องไปที่สถานที่เดียวกัน อย่างไรก็ตามด้วยวิธีเดียวกันคุณสามารถทำได้ในรหัสระดับเช่นกัน (unit1.location1 (x, y) unit1.location2 (x, y) grunt.l1 (x, y) knight.loc3 (x, y) อะไรก็ตาม)

เพียงไม่กี่ความคิด! ฉันขอแนะนำให้คุณอ่านเวอร์ชัน 3 มิติแม้ว่าจะมีความเกี่ยวข้องน้อยกว่ามาก

แก้ไข: ฉันตัดสินใจที่จะจัดหาทั้งสำหรับทุกคนที่อาจอ่านนี้ (ใช่แล้วเป็นความจริง) .... (แต่เดิมฉันแค่อ่านคำถามของคุณและไม่ทราบว่ามันเป็น 2D ที่ค่อนข้างเฉพาะจนกว่าฉันจะอ่านซ้ำ>>>

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