Помимо новичков игровые проекты

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 отлично подходит для обучения начинающих и продвинутой математике. Плюс theres достижения! Ничто так не похоже на теорию игр, чтобы выжить в любой скучной академии.
замедленная

Ответы:

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 - Дэнни Пфлюгофт
3
@ BlueRaja-DannyPflughoeft, это именно то, что я ему объяснил: незнание уравнения в первую очередь означает, что вы никогда не сможете его понять - и единственный способ понять их - использовать их в реальной ситуации.
Джонатан Дикинсон
3

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

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

Есть много способов выучить / улучшить свои знания по линейной алгебре:

  1. Я подумал о том, чтобы пройти курс линейной алгебры, но моя нагрузка уже довольно большая, поэтому я не смог оправдать дополнительную работу.
  2. Мое понимание линейной алгебры стало намного более значительным, поскольку я прошел серию уроков по программированию игрового движка. Для меня использование Векторов, Матриц и т. Д. (Вообще говоря) более распространено на стороне движка, чем на стороне игры. Конечно, это не значит, что я не использовал матрицы в игровом коде - я просто не использую их так часто, как в кодировании движка. YMMV
  3. Есть также много книг, которые помогут вам понять математику, которую вам нужно знать. Мне нравится эта книга, в которой есть глава под названием «3D математика для игр».

Наконец, если дизайн ваших игр не требует сложной математики, не используйте ее. :) Но, конечно, не позволяйте этому помешать вам в разработке игры, которая это делает.

chaosTechnician
источник
0

Кватернионы для 2D были бы излишними, не говоря уже о том, что в вычислительном отношении они слишком дороги. Поворот растрового изображения (2D) неявно обрабатывается множеством платформ / библиотек, потому что он настолько важен для написания любого приложения, и даже там, где это не так, вращение двумерных растровых изображений является не чем иным, как простой триггером. В 3D все становится значительно менее интуитивно понятным для среднего человека, если, конечно, человек не рос, когда писал 3D-код, когда ему следовало бы кататься на велосипеде.

Линейная алгебра применима к 2D, как и к 3D, и должна быть чем-то знакомым, даже если вы только изучали математику в средней школе. Если вы когда-либо делали пересечение линий или периодическое построение линий (интеграция), то вы использовали линейную алгебру.

Обучение 3D математике обычно начинается с размещения простого объекта (например, куба) в трехмерном пространстве и реализации подвижной камеры, которая может просматривать этот объект с разных точек зрения, и эта перспектива может начинаться ортогонально, чтобы сделать вещи еще проще. Речь идет о проекции точек на трехмерную плоскость, представляющую ваш экран (формула здесь , вы бы расширили это до осей x и z в дополнение к y). Действительно, это начало написания любого 3D-движка, независимо от вашего уровня опыта. Flash и Processing.js - два отличных способа легко создать что-то подобное.

инженер
источник
0

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

Попробуйте создать или проанализировать физическую библиотеку, которая будет охватывать обработку столкновений и реакцию на обычные 2D-формы. Линейная алгебра очень полезна для вычисления векторов траекторий для столкновений. Точечный продукт очень связан с единичным кругом, используемым в тригонометрии. Тем не менее, сложность физики твердого тела увеличивается экспоненциально при применении его в 3D.

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

ChrisC
источник
0

Если вы пишете 2D-игры, вы, вероятно, уже используете линейную алгебру ... вы просто этого не знаете! Формально выучить хотя бы основы векторов довольно легко, но это значительно облегчает понимание сложных движений.

Например, мы получаем много вопросов о том, какие уравнения использовать для имитации изогнутого движения, например, для выстрела из пушечного ядра из пушки или ракеты-самонаведения. Но если вы понимаете векторы, единственное «уравнение», которое вам нужно, - это сложение двух векторов вместе. Не только это, но и добавление таких вещей, как воздушное сопротивление или трение, становится невероятно простым - просто рассчитайте вектор сопротивления и добавьте его к скорости. Presto!

BlueRaja - Дэнни Пфлугхофт
источник