Визначте результуючий кут зіткнення стіни


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. Насправді це те саме, лише з двовимірними векторами, тими ж операціями та формулами
Густаво Масьєль

Стіна у 2D грі може бути кутовою, тому твердження if it's a 2D game and your walls are guaranteed to be horizontal or verticalневірне. Друга частина відповіді стосується правильної реалізації. ІМХО, порядок деталей слід змінити, подаючи загальне рішення спочатку та в енфазі, в той час як рішення прямокутного рішення подано як спрощення для виняткового випадку.
XenoRo

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.