กำหนดมุมที่เป็นผลลัพธ์ของการชนกันของผนัง


14

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

คำตอบ:


18

ถ้าคุณรู้ว่าเวกเตอร์ปกติของผนังและมีทิศทางขาเข้าสำหรับวัตถุแล้วสิ่งที่คุณต้องการคือภาพสะท้อนของเวกเตอร์ทั่วเครื่องบิน

ถ้าnเป็นเวกเตอร์ที่ทำให้เป็นมาตรฐานและvคือทิศทางที่เข้ามาสิ่งที่คุณต้องการคือ - (2 ( n · v ) n - v ) เครื่องหมายลบแสดงถึงความจริงที่ว่าสูตรการสะท้อนไม่ได้กลับทิศทางจริง ๆ เนื่องจากความเร็วของวัตถุจะย้อนกลับ

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


คำอธิบายที่ดี มันยอดเยี่ยมสำหรับฉัน! ขอบคุณ!
DRIFTy

13

คุณไม่ได้ระบุว่ามันเป็นเกม 2D หรือ 3D แต่ถ้ามันเป็นเกม 2D และกำแพงของคุณรับประกันว่าจะเป็นแนวนอนหรือแนวตั้งและคุณเพียงแค่ต้องการที่จะเด้งวัตถุนั้นออกไปมันมีวิธีที่ง่ายกว่าการรับมือกับการสะท้อนกลับ

เพียงแค่ลบล้างองค์ประกอบ X ของความเร็วของวัตถุเมื่อชนกำแพงแนวตั้งหรือองค์ประกอบ Y ของความเร็วของวัตถุเมื่อชนกำแพงแนวนอน ตัวอย่าง:

if( /* hit vertical wall */ )
{
    object.velocity.x *= -1;
}
if( /* hit horizontal wall */ )
{
    object.velocity.y *= -1;
}

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

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

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

public static Vector3 Reflect(Vector3 vector, Vector3 normal)
{
    return vector - 2 * Vector3.Dot(vector, normal) * normal;
}

และสำหรับ 2D คุณสามารถทำได้:

public static Vector2 Reflect(Vector2 vector, Vector2 normal)
{
    return vector - 2 * Vector2.Dot(vector, normal) * normal;
}

ขออภัยที่เป็นเกม 2D ฉันอยากให้มันเป็นมุมเพราะคุณบอกว่าฉันอยากจะใช้กำแพงใดก็ได้ ขอบคุณ!
DRIFTy

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

กำแพงในเกม 2D อาจทำมุมดังนั้นคำสั่งif it's a 2D game and your walls are guaranteed to be horizontal or verticalไม่ถูกต้อง ส่วนที่สองของคำตอบคือการใช้งานที่ถูกต้อง IMHO ลำดับของชิ้นส่วนควรย้อนกลับนำเสนอวิธีแก้ปัญหาทั่วไปก่อนและเน้นในขณะที่วิธีการแก้ปัญหามุมขวาถูกนำเสนอเป็นความเรียบง่ายสำหรับกรณีพิเศษ
XenoRo

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