Чому ми використовуємо теорему Піфагора у фізиці ігор?


38

Нещодавно я дізнався, що ми багато використовуємо теорему Піфагора у своїх фізичних обчисленнях, і я боюся, що я не розумію цього.

Ось приклад із книги, щоб переконатися, що об’єкт не рухається швидше, ніж MAXIMUM_VELOCITYконстанта в горизонтальній площині:

MAXIMUM_VELOCITY = <any number>;
SQUARED_MAXIMUM_VELOCITY = MAXIMUM_VELOCITY * MAXIMUM_VELOCITY; 

function animate(){
    var squared_horizontal_velocity = (x_velocity * x_velocity) + (z_velocity * z_velocity);

    if( squared_horizontal_velocity <= SQUARED_MAXIMUM_VELOCITY ){

        scalar = squared_horizontal_velocity / SQUARED_MAXIMUM_VELOCITY;

        x_velocity = x_velocity / scalar;
        z_velocity = x_velocity / scalar;
    }
}

Спробуємо це з деякими цифрами:

Об'єкт намагається перемістити 5 одиниць у x та 5 одиниць у z. Він повинен мати змогу переміщувати лише 5 одиниць по горизонталі!

MAXIMUM_VELOCITY = 5;
SQUARED_MAXIMUM_VELOCITY = 5 * 5;
SQUARED_MAXIMUM_VELOCITY = 25;

function animate(){
    var x_velocity = 5;
    var z_velocity = 5;

    var squared_horizontal_velocity = (x_velocity * x_velocity) + (z_velocity * z_velocity);
    var squared_horizontal_velocity = 5 * 5 + 5 * 5;
    var squared_horizontal_velocity = 25 + 25;
    var squared_horizontal_velocity = 50;

//  if( squared_horizontal_velocity <= SQUARED_MAXIMUM_VELOCITY ){
    if( 50 <= 25 ){
        scalar = squared_horizontal_velocity / SQUARED_MAXIMUM_VELOCITY;
        scalar = 50 / 25;
        scalar = 2.0;

        x_velocity = x_velocity / scalar;
        x_velocity = 5 / 2.0;
        x_velocity = 2.5;

        z_velocity = z_velocity / scalar;
        z_velocity = 5 / 2.0;
        z_velocity = 2.5;

        // new_horizontal_velocity = x_velocity + z_velocity
        // new_horizontal_velocity = 2.5 + 2.5
        // new_horizontal_velocity = 5
    }
}

Зараз це добре працює, але ми можемо зробити те ж саме і без Піфагора:

MAXIMUM_VELOCITY = 5;

function animate(){
    var x_velocity = 5;
    var z_velocity = 5;

    var horizontal_velocity = x_velocity + z_velocity;
    var horizontal_velocity = 5 + 5;
    var horizontal_velocity = 10;

//  if( horizontal_velocity >= MAXIMUM_VELOCITY ){
    if( 10 >= 5 ){
        scalar = horizontal_velocity / MAXIMUM_VELOCITY;
        scalar = 10 / 5;
        scalar = 2.0;

        x_velocity = x_velocity / scalar;
        x_velocity = 5 / 2.0;
        x_velocity = 2.5;

        z_velocity = z_velocity / scalar;
        z_velocity = 5 / 2.0;
        z_velocity = 2.5;

        // new_horizontal_velocity = x_velocity + z_velocity
        // new_horizontal_velocity = 2.5 + 2.5
        // new_horizontal_velocity = 5
    }
}

Переваги робити це без Піфагора:

  1. Менше ліній
  2. У цих рядках простіше читати, що відбувається
  3. ... і для обчислення потрібно менше часу, оскільки примноження менше

Мені здається, що комп'ютери і люди отримують кращу справу без теореми Піфагора! Тим НЕ менше, я впевнений , що я не маю рації , як я бачив теорему Піфагора в ряді відомих місць, тому я хотів би хто - небудь пояснити мені переваги використання теореми Піфагора до математики новачка .

Чи має це щось спільне з одиничними векторами? Для мене одиничний вектор - це коли ми нормалізуємо вектор і перетворимо його на дріб. Ми робимо це діленням вектора на більшу постійну. Я не впевнений, яка це константа. Загальний розмір графіка? У будь-якому випадку, тому що це частка, я вважаю, що одиничний вектор - це в основному графік, який може вміститися всередині 3D-сітки з віссю x, що працює від -1 до 1, осі z працюють від -1 до 1, а y -ось працює від -1 до 1. Це буквально все, що я знаю про одиничні вектори ... не багато: P І я не бачу їх корисності.

Крім того, ми не реально створюємо одиничний вектор у наведених вище прикладах. Чи слід визначати скаляр так:

// a mathematical work-around of my own invention. There may be a cleverer way to do this! I've also made up my own terms such as 'divisive_scalar' so don't bother googling
var divisive_scalar = (squared_horizontal_velocity / SQUARED_MAXIMUM_VELOCITY);
var divisive_scalar = ( 50 / 25 );
var divisive_scalar = 2;

var multiplicative_scalar = (divisive_scalar / (2*divisive_scalar));
var multiplicative_scalar = (2 / (2*2));
var multiplicative_scalar = (2 / 4);
var multiplicative_scalar = 0.5;

x_velocity = x_velocity * multiplicative_scalar
x_velocity = 5 * 0.5
x_velocity = 2.5

Знову ж таки, я не бачу, чому це краще, але це більше "одиниця-вектор-у", тому що мультиплікативний_скаляр є одиницею-вектором? Як бачите, я використовую такі слова, як "одиниця-вектор-у", тому я насправді не з математики! Також усвідомлюйте, що одиничні вектори можуть не мати нічого спільного з теоремою Піфагора, тому ігноруйте все це, якщо я гаваю неправильне дерево.

Я дуже візуальна людина (3D-модельєр та художник-концептолог у галузі торгівлі!) І знаходжу діаграми та графіки справді, дуже корисні, щоб якомога гуманніше просимо!


2
Насправді жоден із алгоритмів, написаних правильно, не обмежує швидкість. Вектор (2.5, 2.5)має величину приблизно 3,54, а не 5.
Христос

1
sqrt(2.5*2.5 + 2.5*2.5)
bcrist

1
Ми ні, філософ помер 2500 років тому, і теорему, яка носить його ім'я, зрозуміли інші цивілізації тисячоліттями ще до того, як він навіть народився. Це трохи схоже на те, що ми використовуємо Ейнштейна в ядерних підводних човнах, смішна думка напевно (кожен підрозділ, який має Ейнштейна в екіпажі), але те, що ми робимо, - це частина теорії, яку він опублікував. У випадку з Ейнштейном він відомий багатьма теоріями фізики, тому можна назвати теорію, з якої похідна масово-енергетична еквівалентність використовується лише частиною його назви (наприклад, "відносність" замість "спеціальної відносності"), не плутаючи її з особа.
Андон М. Коулман

3
Проблема вашої позиції полягає в тому, що "ми можемо зробити те ж саме без Піфагора". Але відстань на Манхеттені не така, як відстань Евкліда, тому ви порівнюєте яблука та апельсини. Якщо ви хочете евклідової відстані від пари X / Y, ви повинні зробити математику.
Джеррі Б

3
пов'язані: "чому ми використовуємо математику з фізики" та "чому ми використовуємо математику в іграх?"
vaxquis

Відповіді:


104

Ваш код без Піфагора не обчислює довжину, як ми зазвичай думаємо про це.

Зазвичай у 3D-іграх ми моделюємо світ як евклідовий простір, і ми використовуємо евклідову метрику відстані ( також відому як теорема Піфагора ) для обчислення загальної довжини вектора v з компонентами vx та vy, а саме:

EuclideanLength(v) = sqrt(v.x * v.x + v.y * v.y)

(Зверніть увагу, що цей квадратний корінь відсутній у вашому зразковому коді вище. Ось чому два підходи дають однакову відповідь. Більше про це незабаром ...)

Код, який ви описали, використовує показник відстані на Манхеттені :

ManhattanLength(v) = abs(v.x) + abs(v.y)

(Хоча ви не включили абсолютні значення, що може змусити себе поводитись несподівано для негативних чисел)

Неважко помітити, що ці дві функції відстані збігаються, коли vx або vy дорівнює нулю, і ми рухаємось лише по одній осі. Як вони порівнюють, хоча ми рухаємось по діагоналі?

Скажімо, vx = vy = 1. Скільки триває цей вектор (еквівалентно, наскільки велика швидкість, яку він описує)?

Euclidean                              Manhattan

sqrt(v.x*v.x + v.y * v.y)              abs(v.x) + abs(v.y)
sqrt(1 * 1 + 1 * 1)                    abs(1) + abs(1)
sqrt(2)                                1 + 1
1.414...                               2

Ви можете бачити, що ці показники насправді не узгоджуються для діагональних ліній.

Побудуємо на графіку набір точок, про які говорить кожен показник, на відстані 1 від початку:

Показники відстані

Наша знайома евклідова метрика - це червоне коло. Це безліч усіх точок x, y таких, що x ^ 2 + y ^ 2 = 1. Ви можете бачити, що він обертально-симетричний, і тому нам це подобається: він акуратно представляє думку, що відстань не змінюється за напрямок.

Манхеттенська метрика - це синій алмаз. Не чудова відповідність нашої інтуїтивної ідеї відстані - але це не робить це погано. У багатьох іграх на основі плиток, де ви рухаєтесь дискретно кроками у чотирьох кардинальних напрямках, метрика Манхеттена дає правильну відстань між точками (з точки зору "скільки рухів знадобиться, щоб потрапити туди?")

Нарешті я кинув у Чебишева метрику заради забави - це зелений квадрат:

ChebyshevLength(v) = max(abs(v.x), abs(v.y))

Це також добре для ігор на основі плиток, де вам дозволяється рухатися по діагоналях. Король у шахах рухається за метрикою Чебишева.

Я сподіваюся, що з’ясується, в чому різниця між типовим кодом піфагорійського стилю та прикладом, який ви подали вище.


11

Без Піфагора ви пов'язані з фіксованою швидкістю на кожній осі. У вас є x-швидкість, y-швидкість і (у 3d-світі) z-швидкість, які незалежні одна від одної. Будь-який рух буде вирівняний до цих перпендикулярних осей.

Однак у Піфагора у вас є швидкість, яка може бути постійною під будь-яким кутом. Це дозволяє змусити сітку зникнути і змусити об’єкти рухатися з постійною швидкістю в будь-якому можливому напрямку.

Територія, якою об’єкт подорожує за одну секунду, виглядає без Піфагора (метрика Фе Чебишева):

введіть тут опис зображення

І це з Піфагором:

введіть тут опис зображення

Останнє в багатьох випадках здається набагато більш природним.

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