Окрім ігрових проектів «Новачок»


22

Я читав цю відповідь про тип математики, який повинен знати розробник гри, і ця частина справді виділялася у мене:

How do I move my game object? The novice might say:

"I know! I'll just do:" object.position.x++.

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

Насправді я не використовував багато лінійної алгебри і навіть не чув про кватерніонів, перш ніж читати цю публікацію. Це тому, що ця математика не з’являється, поки ви не працюєте з 3D, чи це тому, що мої 2D ігри досить прості, що я пішов з наївних реалізацій.

Наступне запитання: Якщо я хочу ознайомитись з таким видом математики, який тип проектів я повинен взяти на себе? IE: написати ігровий движок, працювати над 3D-грі тощо.


1
khanacademy.org чудово підходить для вивчення початківців та просунутих математики. Плюс їхні досягнення! Нічого, як теорія ігор, щоб оживити будь-які нудні академії.
deceleratedcaviar

Відповіді:


16

Справжня хитрість у цьому - наука на рівні середньої школи; що ви мали б зробити. Якщо ви не зробили швидкий пошук в Google, ви почнете роботу . Щоб пояснити, як ви уникаєте «початківців» думок, візьміть приклад місячного грунту .

Після того, як ви прочитали, що [change in position] = [velocity] * [time passed]стає зрозумілим, що потрібно буде відслідковувати ці змінні:

float x, y; // Your X and Y co-ordinates.
float vx, vy; // Your X and Y velocity.
float deltaTime; // Change in time.

Виходячи з цього, ви просто застосуєте швидкість до положення кожного кадру:

// Change X by the velocity multiplied by the time.
x = x + vx * deltaTime;
y = y + vy * deltaTime;

Тепер ми хотіли б змінити швидкість кожного кадру, щоб ми могли додати гравітації. За точно таким же джерелом [change in velocity] = [acceleration] * [time passed]. Тому ми можемо застосувати абсолютно той самий принцип:

const float gravity = 9.8f; // The gravity of the earth.

// Add gravity to the vertical velocity.
vy = vy + gravity * deltaTime;
// Change X by the velocity multiplied by the time.
x = x + vx * deltaTime;
y = y + vy * deltaTime;

Тепер вам потрібен спосіб для гравця керувати своїм космічним апаратом. Читаючи детальніше про основну фізику, ви дізнаєтесь, що рух є результатом сили - я не можу знайти джерело, але [change in acceleration] = ([force] / [mass]) * time(наскільки я пам’ятаю). Тому , коли гравець натискає кнопку , яку ви б просто встановити fxі fyзмінні до чого - то і застосувати рівняння під час оновлення.

Зрештою, вам потрібно подумати про фізику навколо об'єктів у вашій грі - і замість того, щоб намагатися змусити їх рухатися так, як ви думали, скоріше шукайте рівняння .

Майбутня примітка: Пам’ятайте, що це, безумовно, не найкращий спосіб займатися фізикою (це називається інтеграція Ейлера і може призвести до деяких дивних сценаріїв з низькою швидкістю кадрів) - вам потрібно розглянути інші способи здійснення справ (ця стаття має досить приємна написання також на голих засадах). Однак зараз дотримуйтесь Euler Integration, оскільки це означає, що ви намагаєтесь навчитися чомусь менше.

Які ігри навчили б вас думати в правильному режимі мислення?

Як би ви перевірили, що ви все робили правильно і з правильним мисленням? Вставте Sleep(10 milliseconds)в свій ігровий цикл, і все має рухатися та реагувати так само, як і повний кадр.

Нарешті, будь ласка, тримайтеся подалі від 3D (а отже, кватерніонів та матриць), поки у вас не буде хорошого досвіду роботи над тим, щоб 2D-ігри працювали. Я б ризикну сказати, що досить багато розробників ігор насправді не знають, як працюють Quaternions або Matrices - а просто знають, як їх використовувати - підходити до них набагато пізніше (або ніколи, 2D ігри не дуже цікаво і можуть бути досить цікавими) вдалий). Вам не потрібно знати лінійну алгебру і так далі, щоб зробити це на базовому рівні (але це дійсно допомагає, тому ходіть на деякі нічні заняття, якщо можете).

Остаточний бонус: одне, що мій учитель мистецтв мені завжди казав, - це "не малюй те, що ти думаєш, що бачиш, малюй те, що бачиш". Те ж саме стосується і тут: "не моделюйте те, що ви думаєте, що відбувається ( object.position++), моделюйте те, що відбувається (` object.position + = швидкість * час) "- принаймні до розумних меж (ви не моделюєте ідеально точну систему, але робите те, що є гарним наслідуванням).


Мені подобається ваша ідея вставити штучне відставання для тестування. Також гравітація Землі становить 9,8, а не 9,1
Стів

Будьте обережні, "не моделюйте те, що ви думаєте, що трапиться, моделюйте те, що станеться", якщо ви не пишете фактичне моделювання. Нараховуйте масштаб, необхідний для вашого проекту. Іноді "те, що ти думаєш, відбувається" - це хороша відповідь для твого дизайну.
хаосТехнік

@chaosTechnician на цьому рівні "те, що ви думаєте, що відбувається" object.position++. Я уточню відповідь.
Джонатан Дікінсон

-1 для instead of trying to make them move in the way you would think, rather look up the equation. Йдеться про розуміння рівнянь, а не для їх пошуку. Найголовніше - це зробити гру веселою, і хто знає, можливо, ви знайдете якесь змінне прискорення, що зробить гравітацію веселішою. Але дуже важко буде міркувати, як це зробити, якщо ви не розумієте рівнянь.
BlueRaja - Danny Pflughoeft

3
@ BlueRaja-DannyPflughoeft це саме те, що я йому пояснив: в першу чергу не знаючи рівняння, це означає, що ти його ніколи не можеш зрозуміти - і єдиний спосіб зрозуміти їх - використовувати їх у реальній ситуації.
Джонатан Дікінсон

3

Я думаю, що частина відповіді, з якою ви пов'язуєтесь, є дещо елітарною у своїй презентації. Виявляючи чесноти векторної математики, а потім говорити, що об'єкт потребує позиції, напрямку та прискорення, є непослідовно специфічним, оскільки він дійсно просто зводиться до чогось типу, object.position.x += (object.velocity.x + object.acceleration.x) * deltaTimeщо, по суті, не так відрізняється від object.position.x++. Кватерніони - один із багатьох способів представити обертання; Мені вони подобаються, але вони не важливі для розуміння обертання 3D. Незважаючи на те, що багато користувачів Quaternion матиме на увазі, вони не є Святим Граалом ротаційної математики.

Принципи лінійної алгебри присутні у простому двовимірному русі, обертанні тощо, але математика є більш простою, оскільки існує лише два виміри. Ось приклад .

Існує маса способів дізнатися / покращити свої знання про лінійну алгебру:

  1. Я думав про те, щоб пройти курс лінійної алгебри, але моє навантаження вже досить важке, тому я не змогла виправдати зайву роботу.
  2. Моє розуміння лінійної алгебри значно зросло, коли я взяв ряд уроків програмування ігрових двигунів. Для мене використання векторів, матриць тощо було (загалом кажучи) більш поширеним на моторних сторонах речей, ніж на стороні гри. Звичайно, це не означає, що я не використовував матриці в ігровому коді - я просто не використовую їх так часто, як у мене в кодуванні двигуна. ymmv
  3. Існує також безліч книг, які допоможуть вам зрозуміти математику, яку ви також повинні знати. Мені подобається ця книга, в якій є розділ під назвою «3D математика для ігор».

Нарешті, якщо дизайн ваших ігор не вимагає складної математики, не використовуйте його. :) Але, звичайно, не дозволяйте цьому заважати замислюватися над розробкою гри.


0

Кватерніони для 2D були б повними надмірними, не кажучи вже про обчислювально занадто дорогим. Обертанням растрових зображень (2D) керується безліччю платформ / бібліотек неявно, тому що це дуже важливо для написання будь-якої програми, і навіть там, де її немає, обертання 2D-растрових зображень - це не що інше, як простий триггер. У 3D-то речі стають значно інтуїтивнішими для пересічної людини, якщо, звичайно, не сказати, що людина виросла, пише 3D-код, коли їм слід було їздити на велосипеді.

Лінійна алгебра застосовна для двовимірної, як і для 3D, і повинна бути чимось, з чим ви знайомі, навіть якщо ви займалися лише математикою молодшої середньої школи. Якщо ви коли-небудь робили перехрестя ліній або періодичні графіки на лінії (інтеграція), то ви використовували лінійну алгебру.

Навчання 3D-математиці зазвичай починається з розміщення простого об’єкта (наприклад, куба) у тривимірному просторі та реалізації пересувної камери, яка може переглядати цей об’єкт з різних точок зору, і ця перспектива може починати ортогональну, щоб зробити речі ще простішими. Йдеться про проеціювання точок на тривимірну площину, що представляє ваш екран (формула тут , ви б продовжили це на вісь x і z додатково до y). Дійсно, це початок написання будь-якого 3D-двигуна, незалежно від рівня вашого досвіду. Flash і Processing.js - це два чудових способи легко прототипувати щось подібне.


0

Ви правильно відстежуєте, що лінійна алгебра та більш складна математика зазвичай включає 3D графіку та тривимірний простір. Але є ще більше математики, яку можна зробити в 2D іграх. Математика фізики може отримати досить хардкор, і вона стає складнішою, якщо врахувати фізику м'якого тіла та динаміку B-сплайну (і все ще в 2D, майте на увазі)

Спробуйте створити або розчленовувати бібліотеку фізики, яка охоплюватиме обробку зіткнень та відповідь на поширені 2D форми. Лінійна алгебра є досить корисною для обчислення векторів траєкторії для зіткнень. Точковий добуток досить пов'язаний з одиничним колом, що використовується в тригонометрії. Тим не менш, складність фізики жорстких тіл зростає експоненціально при застосуванні її в 3D.

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


0

Якщо ви пишете 2D ігри, ви, ймовірно, вже використовуєте лінійну алгебру. Ви просто цього не знаєте! Офіційно вивчити принаймні основи векторів досить легко, але пройде довгий шлях у спрощенні роздумів про інакше складний рух.

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

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