ดังนั้นฉันจึงมีวัตถุเคลื่อนที่ไปในทิศทางไปยังผนังแนวนอนหรือแนวตั้ง ฉันจะคำนวณมุมที่วัตถุควรกระเด็นได้อย่างไร วัตถุสามารถเข้าใกล้กำแพงในมุมใดก็ได้
ดังนั้นฉันจึงมีวัตถุเคลื่อนที่ไปในทิศทางไปยังผนังแนวนอนหรือแนวตั้ง ฉันจะคำนวณมุมที่วัตถุควรกระเด็นได้อย่างไร วัตถุสามารถเข้าใกล้กำแพงในมุมใดก็ได้
คำตอบ:
ถ้าคุณรู้ว่าเวกเตอร์ปกติของผนังและมีทิศทางขาเข้าสำหรับวัตถุแล้วสิ่งที่คุณต้องการคือภาพสะท้อนของเวกเตอร์ทั่วเครื่องบิน
ถ้าnเป็นเวกเตอร์ที่ทำให้เป็นมาตรฐานและvคือทิศทางที่เข้ามาสิ่งที่คุณต้องการคือ - (2 ( n · v ) n - v ) เครื่องหมายลบแสดงถึงความจริงที่ว่าสูตรการสะท้อนไม่ได้กลับทิศทางจริง ๆ เนื่องจากความเร็วของวัตถุจะย้อนกลับ
คำตอบนี้ให้ไว้ในรูปของเวกเตอร์คณิตศาสตร์ไม่ใช่มุมเพราะปกติแล้วจะดีกว่าถ้าคุณไม่มีเหตุผลที่ชัดเจนในการใช้มุม โปรดทราบว่าหากคุณต้องพูดถึงมุมมุมของการสะท้อนเท่ากับมุมของการเกิดอุบัติเหตุ หากวัดมุมจากปกติมุมที่ส่งออกคือการปฏิเสธมุมที่เข้ามา ถ้าวัดมุมจากผนังแล้วมันคือส่วนประกอบของมุมเข้า
คุณไม่ได้ระบุว่ามันเป็นเกม 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;
}
if it's a 2D game and your walls are guaranteed to be horizontal or vertical
ไม่ถูกต้อง ส่วนที่สองของคำตอบคือการใช้งานที่ถูกต้อง IMHO ลำดับของชิ้นส่วนควรย้อนกลับนำเสนอวิธีแก้ปัญหาทั่วไปก่อนและเน้นในขณะที่วิธีการแก้ปัญหามุมขวาถูกนำเสนอเป็นความเรียบง่ายสำหรับกรณีพิเศษ
นี่เป็นเพียงการสะท้อนเวกเตอร์ตามแนวผนังเวกเตอร์ปกติ