Відповіді:
Якщо ви знаєте нормальний вектор стіни і маєте вхідний напрямок для об'єкта, то те, що ви хочете, - це відображення вектора по площині .
Якщо 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
невірне. Друга частина відповіді стосується правильної реалізації. ІМХО, порядок деталей слід змінити, подаючи загальне рішення спочатку та в енфазі, в той час як рішення прямокутного рішення подано як спрощення для виняткового випадку.
Мова йде лише про відображення вектора вздовж стінок нормального вектора.