Jawaban:
Jika Anda tahu vektor normal dinding dan memiliki arah masuk untuk objek, maka yang Anda inginkan adalah refleksi dari vektor melintasi pesawat .
Jika n adalah vektor yang dinormalisasi, dan v adalah arah yang masuk , maka yang Anda inginkan adalah - (2 ( n · v ) n - v ). Tanda minus menjelaskan fakta bahwa rumus pantulan sebenarnya tidak membalik arah, karena kecepatan objek akan terbalik.
Jawaban ini diberikan dalam bentuk vektor matematika, bukan sudut, karena itu biasanya lebih baik jika Anda tidak memiliki alasan eksplisit untuk menggunakan sudut. Perhatikan bahwa jika Anda harus berbicara tentang sudut, sudut pantulan sama dengan sudut kejadian. Jika sudut diukur dari normal, sudut keluar adalah negasi dari sudut masuk; jika sudut diukur dari dinding, maka itu adalah pelengkap dari sudut yang masuk.
Anda tidak menentukan apakah itu game 2D atau 3D. Tetapi jika ini adalah permainan 2D dan dinding Anda dijamin horizontal atau vertikal dan Anda hanya ingin memantulkan objeknya, ada cara yang jauh lebih mudah daripada harus berurusan dengan pantulan.
Cukup meniadakan komponen-X dari kecepatan objek ketika mengenai dinding vertikal, atau komponen-Y dari kecepatan objek ketika mengenai dinding horizontal. Contoh:
if( /* hit vertical wall */ )
{
object.velocity.x *= -1;
}
if( /* hit horizontal wall */ )
{
object.velocity.y *= -1;
}
Tetapi jika Anda benar-benar peduli tentang mengetahui sudut, maka secara umum, sudut refleksi sama dengan sudut kejadian. Sudut ini diukur dalam kaitannya dengan normal dinding. Inilah gambar yang harus membuatnya jelas:
Jika Anda perlu menangani ini untuk dinding sewenang-wenang, Anda harus melihat cara memantulkan vektor. Ini benar-benar hanya formula kecil yang mengambil vektor normal dan vektor insiden dinding, dan mengembalikan vektor yang dipantulkan untuk Anda. Berikut rumus yang digunakan XNA:
public static Vector3 Reflect(Vector3 vector, Vector3 normal)
{
return vector - 2 * Vector3.Dot(vector, normal) * normal;
}
Dan untuk 2D Anda bisa melakukannya:
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
tidak benar. Bagian kedua dari jawaban mendukung implementasi yang benar. IMHO, urutan bagian-bagian harus dibalik, menyajikan solusi umum terlebih dahulu dan dalam penekanan, sedangkan solusi sudut kanan disajikan sebagai penyederhanaan untuk kasus luar biasa.
Ini hanya tentang memantulkan vektor sepanjang dinding vektor normal.