Я читал этот ответ о типе математики, которую должен знать разработчик игры, и эта часть действительно выделялась на меня:
How do I move my game object? The novice might say:
"I know! I'll just do:" object.position.x++.
Вот как я мог бы подумать, чтобы сделать это, поэтому я предполагаю, что это показывает мой уровень мастерства. По крайней мере, для тех двухмерных игр с боковой прокруткой, аркадных, которые я делал в прошлом, это все, что мне было нужно. Это и немного тригонометрии.
На самом деле, я не использовал много линейной алгебры и даже не слышал о кватернионах перед тем, как читать этот пост. Это потому, что эта математика не появляется, пока вы не работаете с 3D, или это потому, что мои 2D-игры довольно просты, и мне не покончили с наивными реализациями.
Следующий вопрос: Если я хочу познакомиться с этим типом математики, какие проекты мне следует предпринять? IE: написать игровой движок, работать над 3D-игрой и т. Д.
Ответы:
Настоящий трюк с этим - наука на уровне средней школы; что вы должны были сделать. В том случае, если вы не быстрый поиск Google поможет вам начали . Чтобы объяснить, как вы избегаете «новичка», возьмите пример с лунного корабля .
После прочтения
[change in position] = [velocity] * [time passed]
становится ясно, что необходимо отслеживать эти переменные:После этого вы просто примените скорость к позиции каждого кадра:
Теперь мы хотели бы изменить скорость каждого кадра, чтобы добавить гравитацию. По точно такому же источнику
[change in velocity] = [acceleration] * [time passed]
. Поэтому мы можем применить тот же принцип:Теперь вам нужен способ управлять своим космическим кораблем. Прочитав больше об основной физике, вы узнаете, что движение является результатом силы - я не могу найти источник, но
[change in acceleration] = ([force] / [mass]) * time
(насколько я помню). Поэтому , когда игрок нажимает клавишу , которую вы бы просто установитьfx
иfy
переменные к чему - то и применить уравнение во время обновления.В конечном счете, вам нужно подумать о физике вокруг объектов в вашей игре - и вместо того, чтобы пытаться заставить их двигаться так, как вы думаете, лучше взгляните на уравнение .
Примечание на будущее: помните, что это определенно не лучший способ заниматься физикой (это называется интеграцией Эйлера и может привести к некоторым странным сценариям с низкой частотой кадров) - вам нужно искать другие способы ведения дел (в этой статье довольно хорошая запись на голые основы, а). Однако пока придерживайтесь Euler Integration, поскольку это означает, что вы пытаетесь научиться чему-то меньшему.
Какие игры научат вас правильно мыслить?
Как бы вы проверили, что вы сделали все правильно и с правильным мышлением? Вставьте
Sleep(10 milliseconds)
в свой игровой цикл, и все должно двигаться и реагировать так же, как и полная частота кадров.Наконец, пожалуйста, держитесь подальше от 3D (и, следовательно, кватернионов и матриц), пока у вас не будет достаточного опыта в создании 2D-игр. Рискну сказать, что довольно много разработчиков игр на самом деле не знают, как работают Quaternions или Matrices, - а просто знают, как их использовать, - подойти к ним гораздо позже (или никогда, 2D-игры - это очень весело и может быть довольно успешно). Вам действительно не нужно знать линейную алгебру и так далее, чтобы делать это на базовом уровне (но это действительно помогает, поэтому, если можете, сходите на вечерние занятия).
Финальный бонус: одна вещь, которую мой учитель рисования всегда говорил мне: «Не рисуй то, что, как ты думаешь, ты видишь, рисуй то, что ты видишь». Здесь применимо то же самое: «не моделируйте то, что, по вашему мнению, происходит (
object.position++
), моделируйте то, что происходит (` object.position + = скорость * время) "- по крайней мере, в разумных пределах (вы не моделируете совершенно точную систему, но что-то хорошее подражание).источник
object.position++
. Я уточню ответ.instead of trying to make them move in the way you would think, rather look up the equation
. Речь идет о понимании уравнений, а не их поиске. Самое главное - сделать игру веселой, и кто знает, может быть, вы найдете переменное ускорение, которое сделает гравитацию более увлекательной. Но будет очень сложно рассуждать, как это сделать, если вы не понимаете уравнения.Я думаю, что части ответа, с которым вы связаны, немного элитарны в своей презентации. Превозносить достоинства векторной математики, а затем говорить, что объекту требуется позиция, направление и ускорение, непоследовательно, потому что на самом деле он просто сводится к чему-то вроде того,
object.position.x += (object.velocity.x + object.acceleration.x) * deltaTime
что, по сути, ничем не отличается отobject.position.x++
. Кватернионы являются одним из многих способов представления вращений; Они мне нравятся, но они не важны для понимания 3D вращений. Несмотря на то, что подразумевают многие пользователи Quaternion, они не являются Святым Граалем ротационной математики.Принципы линейной алгебры присутствуют в простом двухмерном движении, вращении и т. Д., Но математика более проста, потому что есть только два измерения. Вот пример .
Есть много способов выучить / улучшить свои знания по линейной алгебре:
Наконец, если дизайн ваших игр не требует сложной математики, не используйте ее. :) Но, конечно, не позволяйте этому помешать вам в разработке игры, которая это делает.
источник
Кватернионы для 2D были бы излишними, не говоря уже о том, что в вычислительном отношении они слишком дороги. Поворот растрового изображения (2D) неявно обрабатывается множеством платформ / библиотек, потому что он настолько важен для написания любого приложения, и даже там, где это не так, вращение двумерных растровых изображений является не чем иным, как простой триггером. В 3D все становится значительно менее интуитивно понятным для среднего человека, если, конечно, человек не рос, когда писал 3D-код, когда ему следовало бы кататься на велосипеде.
Линейная алгебра применима к 2D, как и к 3D, и должна быть чем-то знакомым, даже если вы только изучали математику в средней школе. Если вы когда-либо делали пересечение линий или периодическое построение линий (интеграция), то вы использовали линейную алгебру.
Обучение 3D математике обычно начинается с размещения простого объекта (например, куба) в трехмерном пространстве и реализации подвижной камеры, которая может просматривать этот объект с разных точек зрения, и эта перспектива может начинаться ортогонально, чтобы сделать вещи еще проще. Речь идет о проекции точек на трехмерную плоскость, представляющую ваш экран (формула здесь , вы бы расширили это до осей x и z в дополнение к y). Действительно, это начало написания любого 3D-движка, независимо от вашего уровня опыта. Flash и Processing.js - два отличных способа легко создать что-то подобное.
источник
Вы правы на том пути, что линейная алгебра и более сложная математика обычно включают 3D-графику и 3D-пространство. Но есть еще больше математики, которые можно сделать в 2D играх. Математика по физике может стать довольно хардкорной, и она станет более сложной, если учесть физику мягкого тела и динамику B-сплайнов (и все же в 2D, имейте в виду)
Попробуйте создать или проанализировать физическую библиотеку, которая будет охватывать обработку столкновений и реакцию на обычные 2D-формы. Линейная алгебра очень полезна для вычисления векторов траекторий для столкновений. Точечный продукт очень связан с единичным кругом, используемым в тригонометрии. Тем не менее, сложность физики твердого тела увеличивается экспоненциально при применении его в 3D.
3D-графика дает вам лучшее понимание матричных вычислений, кватернионов, линейной алгебры и некоторых прикладных исчислений. Первое, что вы, вероятно, заметите, - это использование матриц для перемещения и манипулирования объектами в трехмерном пространстве.
источник
Если вы пишете 2D-игры, вы, вероятно, уже используете линейную алгебру ... вы просто этого не знаете! Формально выучить хотя бы основы векторов довольно легко, но это значительно облегчает понимание сложных движений.
Например, мы получаем много вопросов о том, какие уравнения использовать для имитации изогнутого движения, например, для выстрела из пушечного ядра из пушки или ракеты-самонаведения. Но если вы понимаете векторы, единственное «уравнение», которое вам нужно, - это сложение двух векторов вместе. Не только это, но и добавление таких вещей, как воздушное сопротивление или трение, становится невероятно простым - просто рассчитайте вектор сопротивления и добавьте его к скорости. Presto!
источник