Câu trả lời:
Nếu bạn biết vectơ bình thường của tường và có hướng đến của đối tượng, thì điều bạn muốn là sự phản chiếu của vectơ trên một mặt phẳng .
Nếu n là một vectơ chuẩn hóa và v là hướng đến , thì điều bạn muốn là - (2 ( n · v ) n - v ). Dấu trừ cho thấy công thức phản xạ không thực sự đảo ngược hướng, vì vận tốc của vật thể sẽ đảo ngược.
Câu trả lời này được đưa ra dưới dạng toán học vectơ, không phải là một góc, bởi vì điều đó thường thích hợp hơn nếu bạn không có lý do rõ ràng để sử dụng một góc. Lưu ý rằng nếu bạn phải nói về các góc, góc phản xạ bằng góc tới. Nếu góc được đo từ bình thường, góc đi là độ âm của góc đến; nếu góc được đo từ tường, thì đó là phần bù của góc tới.
Bạn đã không chỉ định nếu đó là một trò chơi 2D hoặc 3D. Nhưng nếu đó là một trò chơi 2D và các bức tường của bạn được đảm bảo là ngang hoặc dọc và bạn chỉ muốn đẩy vật thể ra khỏi chúng, có một cách dễ dàng hơn nhiều so với việc phải xử lý các phản xạ.
Đơn giản chỉ cần phủ định thành phần X của vận tốc của vật thể khi va vào tường thẳng đứng hoặc thành phần Y của vận tốc của vật thể khi va vào tường ngang. Thí dụ:
if( /* hit vertical wall */ )
{
object.velocity.x *= -1;
}
if( /* hit horizontal wall */ )
{
object.velocity.y *= -1;
}
Nhưng nếu bạn thực sự quan tâm đến việc biết góc, thì về mặt tổng quát, góc phản xạ giống như góc tới. Góc này được đo liên quan đến bình thường của tường. Đây là một hình ảnh cần làm rõ:
Trong trường hợp bạn cần xử lý việc này đối với các bức tường tùy ý, bạn sẽ cần xem xét cách phản chiếu một vectơ. Nó thực sự chỉ là một công thức nhỏ lấy vectơ bình thường và vectơ tần suất và trả về vectơ phản xạ cho bạn. Đây là công thức XNA sử dụng:
public static Vector3 Reflect(Vector3 vector, Vector3 normal)
{
return vector - 2 * Vector3.Dot(vector, normal) * normal;
}
Và đối với 2D bạn chỉ có thể làm:
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
này không chính xác. Phần thứ hai của câu trả lời nhấn mạnh việc thực hiện đúng. IMHO, thứ tự của các bộ phận nên được đảo ngược, trình bày giải pháp chung trước và trong sự hình thành, trong khi giải pháp góc phải được trình bày như một sự đơn giản hóa cho trường hợp đặc biệt.
Đây chỉ là về việc phản ánh một vector dọc theo các bức tường vector thông thường.