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


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.