วิธีการพิจารณาแรงโน้มถ่วงเมื่อย้าย AI


9

ฉันกำลังสร้างเกม 2D ขณะนี้มีเฮลิคอปเตอร์ที่บินอยู่รอบ ๆ ซึ่งควบคุมโดยผู้เล่น มันถูกควบคุมโดยใช้ปุ่มลูกศร: ขึ้นซ้ายและขวา

มันความเร็วตามแกน Y คือdyและความเร็วพร้อมแกน x dxคือ

ฟิสิกส์เป็นดังนี้:

เมื่อใดก็ตามที่ขึ้นไม่ได้กด , dyเร่งในการเร่งความเร็วอย่างต่อเนื่องไปเรื่อย ๆต่อลง (แรงโน้มถ่วง) dxยังคงอยู่ในค่าปัจจุบัน

เมื่อUP กด , dyเร่งในการเร่งความเร็วคงที่จากสิ่งที่มันเป็นอยู่ในปัจจุบัน, ถึง 4 (ขึ้นจนกว่าจะถึงความเร็ว 4) dxยังคงอยู่ในค่าปัจจุบัน

เมื่อซ้ายกด , dxเร่งในการเร่งความเร็วคงที่จากสิ่งที่มันเป็นอยู่ในปัจจุบัน, ถึง -4

เมื่อขวากด , DX เร่งในการเร่งความเร็วคงที่จากสิ่งที่มันเป็นอยู่ในปัจจุบัน, ถึง 4

(เมื่อกดซ้ายหรือขวาและไม่กดขึ้นพร้อมกันดังที่ฉันพูด: dyยิ่งเล็กลงเรื่อย ๆ เพราะแรงโน้มถ่วงส่งผลต่อเฮลิคอปเตอร์)

ทั้งหมดนี้ทำให้เฮลิคอปเตอร์มักตามโค้งในอากาศมากกว่าเป็นเส้นตรง

นี่สร้างฟิสิกส์ที่ดูเหมือนจริงมาก

คำถามของฉันคือ:

เฮลิคอปเตอร์ฝ่ายตรงข้าม, AI ควรย้ายโดยใช้ระบบฟิสิกส์เดียวกัน

ให้บอกว่า AI ต้องการได้รับจากจุดที่เป็นอยู่ในปัจจุบันไปยังจุด B

ป้อนคำอธิบายรูปภาพที่นี่

หากไม่มีแรงโน้มถ่วงและไม่มีการเร่งความเร็วในเกมมันจะง่าย ฉันแค่วาดเวกเตอร์จากตำแหน่งของ AI ถึงจุด B และทำให้ AI ติดตามมัน

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

ฉันจะนำแรงโน้มถ่วงมาพิจารณาเมื่อย้าย AI ไปยังปลายทางที่ต้องการได้อย่างไร

(หากอธิบายได้ง่ายขึ้นโปรดพิจารณาจุด B ให้อยู่ในระดับเดียวกับแกน y กับ AI และไม่ใช่แนวทแยงมุม)

ขอบคุณ


คุณสามารถปิดการใช้งานฟิสิกส์ใน AI ในขณะที่มันกำลังเคลื่อนไหวได้หรือไม่? ถ้าเป็นเช่นนั้นคุณสามารถปิดการใช้งานในขณะที่มันเคลื่อนไปยังจุดและเปิดใช้งานเมื่อมันมาถึง
Zhafur

@Zhafur สิ่งนี้จะทำให้การเคลื่อนไหวของ AI ดูเหมือนไม่สมจริงหรืออย่างน้อยก็แตกต่างจากการเคลื่อนไหวของผู้เล่น ฉันต้องการให้การเคลื่อนไหวของ AI ดูคล้ายกับการเคลื่อนไหวของผู้เล่น
user3150201

คำตอบ:


4

TL; DR:

TimeToStop.x = CurrentSpeed.x / Accelaration.x;

if (TimeToStop.x * CurrentSpeed.x >= 1.99 * DistanceFromTarget.x)
    slow_down_x(); // CurrentSpeed += Acc.x * direction;
else
    speed_up_towards_target_x(); // CurrentSpeed += Acc.x * direction;

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

รุ่นยาว: หากไม่มีสิ่งกีดขวางการเคลื่อนไหวบนแกน y จะไม่เกี่ยวข้องอย่างสมบูรณ์กับการเคลื่อนไหว (และไม่ส่งผลกระทบ) บนแกน x ดังนั้นคำถามที่คุณอธิบายอาจถูกแบ่งออกเป็นสองคำถาม

  1. ย้ายไปที่นั่นบนแกน x
  2. และเคลื่อนที่ไปที่นั่นบนแกน y

CS.x& CS.yคือความเร็วปัจจุบันของเราบนแกน x และ y

TS.x& TS.yเป็นเวลาที่คุณหยุดเพียงแค่พิจารณาในแนวตั้งหรือแนวนอนพิจารณาความเร็วปัจจุบันของคุณในแกนที่เกี่ยวข้อง

D.x& D.yคือระยะทางของแต่ละแกน

tl; dr: คุณยังคงเร่งความเร็ว (ถ้าเป็นไปได้ [เว้นแต่คุณจะได้ความเร็วสูงสุด]) บนแกน x จนกว่าจะถึงจุดที่มีเงื่อนไขต่อไปนี้:

if (TS.x * CS.x >= 1.99 * D.x) hit_the_breaks_on_x();

เช่นเดียวกันกับ y


2

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

ดังนั้นให้ทำมุมที่เซ็นชื่อระหว่างเวกเตอร์ความเร็วกับเวกเตอร์เป้าหมายแล้วใช้แรงขับเทียบกับขนาดของเวกเตอร์

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

โปรดทราบว่าคุณจะต้องปฏิบัติต่อจตุภาคทั้งสี่ที่เป้าหมายอาจแตกต่างกัน (ราวกับว่าเป้าหมายอยู่ที่มุมซ้ายบนมุมบวกจะต้องใช้แรงผลักดัน)

นอกจากนี้ตรวจสอบให้แน่ใจว่าได้ใช้จำนวนแรงขับที่สัมพันธ์กับการเบี่ยงเบนจากความเร็วเป้าหมาย

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


1
ขอบคุณ หลายคำถามเกี่ยวกับเรื่องนี้: 1 "... ใช้แรงผลักดันเมื่อเทียบกับขนาดของเวกเตอร์ " คุณหมายถึง"size of the angle "หรือไม่? 2- โดย 'มุมเซ็น' คุณหมายถึงบวกหรือลบ - ถูกต้อง? ถ้าเป็นเช่นนั้นมุมจะเป็นบวกถ้ามันอยู่เหนือเส้นสีน้ำตาลและลบถ้ามันอยู่ต่ำกว่าเส้นสีน้ำตาล ขวา? 3- หากฉันเข้าใจอย่างถูกต้องสิ่งที่คุณหมายถึงคือ: ทุกเฟรมรับมุมระหว่างเวกเตอร์ความเร็วปัจจุบันกับเวกเตอร์ปัจจุบันไปยังเป้าหมาย จากนั้นเพิ่ม / ลบออกจาก dx และ dy ตามลำดับ ถูกต้องหรือไม่
user3150201

@ user3150201 ใช่กับคำถามมุม ใช่กับคำถามที่ลงนาม / ไม่ได้ลงนาม atan2 สามารถให้มุมที่เซ็นชื่อระหว่างสองเวกเตอร์ได้ ดูเหมือนว่าคุณเข้าใจประเด็นของฉันขอโทษถ้าฉันไม่ชัดเจน
Bornander

1

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

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