Изучение игрового программирования (часть 2) (математика)

Итак, прошло несколько месяцев с тех пор, как я написал этот вопрос, с тех пор я играл с "сырыми" С++ D3D, графическими движками Ogre и Irrlicht и в последнее время Microsoft XNA. Я создал несколько 2D-игр (в основном, реплики старых вещей, таких как тетрис, астреиды и т.д.) И сделал несколько (очень) маленьких шагов в 3D-мире в вышеупомянутых технологиях.

Мне не составит труда создать реальную логику игры, абстрагируя взаимодействие объектов, чтобы позволить мне подключать различные формы управления (компьютер, плеер, сеть и т.д.), делать потоки или любой другой материал, который я "Я привык изо дня в день работать, что для меня совершенно естественно. Я очень мало разбирался в HLSL и эффектах частиц (очень простой).

Но 3D-математика с участием матриц и векторов (и кватернионов (?) в Ogre3D, действительно ли они нужны?)... действительно получает меня, я могу следовать примерам (например, книга Learning XNA 3.0 Я купил у O'Reilly, что является потрясающей книгой, и я понимаю, почему и как что-то происходит в этом примере, но когда я пытаюсь что-то сделать сам, я чувствую, что мне не хватает понимания этого типа математики способный действительно получить его и заставить его работать сам.

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

Ответы

Ответ 1

Хорошо, быстрый курс расчета матриц/векторов:

Матрица представляет собой набор чисел, упорядоченных в прямоугольной сетке типа:

[ 0,  1,  2 ]
[ 2,  3,  5 ]
[ 2,  1,  3 ]
[ 0,  0,  1 ]

Вышеупомянутая матрица имеет 4 строки и 3 столбца и, как таковая, представляет собой матрицу размером 4 х 3. Вектор представляет собой матрицу с 1 строкой (вектор строки) или 1 столбец (вектор-столбец). Нормальные числа называются скалярами, контрастирующими с матрицами.

Также распространено использование заглавных букв для матриц и строчных букв для скаляров.

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

Добавление

Матрицы могут быть добавлены, если они имеют одинаковые размеры. Таким образом, матрица 2x2 может быть добавлена ​​к матрице 2x2, но не к матрице 3x5.

[ 1,  2 ] + [ 2,  5 ] = [ 3,  7 ]
[ 2,  4 ]   [ 0,  3 ]   [ 2,  7 ]

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

Матричное умножение

Матрицы могут быть умножены, но это немного сложнее. Чтобы умножить матрицу A на матрицу B, вам нужно умножить числа в каждой строке, если матрица A с каждым столбцом в матрице B. Это означает, что если вы умножаете матрицу axb с матрицей acxd, b и c должны быть равны, а результирующая матрица равна axd:

[1,2,3] x [4,6] = [1x4+2x2+3x2, 1x6+2x1+3x3 ] = [4+4+6,  6+2+9  ] = [14, 20]
[1,4,5]   [2,1]   [1x4+4x2+5x2, 1x6+4x1+5x3 ]   [4+8+10, 6+4+15 ]   [22, 25]
          [2,3] 

Как вы можете видеть, с матрицами A x B отличается от B x A.

Матричное скалярное умножение

Можно умножить матрицу со скаляром. В этом случае каждая ячейка умножается на это число:

3 x [1,2] = [ 3, 6]
    [4,7]   [12,21]

Инвертирование матрицы Матричное деление невозможно, но вы можете создать инверсию матрицы, так что A x A-inv - матрица со всем нулем, кроме этой главной диагонали:

[ 1, 0, 0 ]
[ 0, 1, 0 ]
[ 0, 0, 1 ]

Инвертирование матрицы может быть выполнено только с квадратными матрицами, и это сложное задание, которое не имеет результата.

Начнем с матрицы A:

    [ 1, 2, 3 ]
A = [ 1, 3, 4 ]
    [ 2, 5, 1 ]

Мы добавляем 3 дополнительных столбца и заполняем их единичной матрицей:

[ 1, 2, 3, 1, 0, 0 ]
[ 1, 3, 4, 0, 1, 0 ]
[ 2, 5, 1, 0, 0, 1 ]

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

[ 1, 2, 3, 1, 0, 0 ]
[ 0, 1, 1,-1, 1, 0 ]
[ 0, 1,-5,-2, 0, 1 ]

Теперь мы повторяем это со вторым столбцом (дважды из первой строки и один раз из третьего)

[ 1, 0, 1, 3,-2, 0 ]
[ 0, 1, 1,-1, 1, 0 ]
[ 0, 0,-6,-1,-1, 1 ]

Для третьего столбца мы имеем небольшую проблему. Числовое значение составляет -6, а не 1. Но мы можем решить это, умножив всю строку на -1/6:

[ 1, 0, 1,   3,  -2,    0 ]
[ 0, 1, 1,  -1,   1,    0 ]
[ 0, 0, 1, 1/6, 1/6, -1/6 ]

И теперь мы можем вычесть третью строку из первой и второй:

[ 1, 0, 0, 17/6,-13/6,  1/6 ]
[ 0, 1, 0, -7/6,  5/6,  1/6 ]
[ 0, 0, 1,  1/6,  1/6, -1/6 ]

Теперь у нас есть обратное к A:

[ 17/6,-13/6,  1/6 ]
[ -7/6,  5/6,  1/6 ]
[  1/6,  1/6, -1/6 ]

Мы можем записать это как:

      [ 17,-13,  1 ]
1/6 * [ -7,  5,  1 ]
      [  1,  1, -1 ]



    [ 1, 2, 3 ]   [ 17,-13,  1 ]                [ 6, 0, 0 ]    [ 1, 0, 0 ]
A = [ 1, 3, 4 ] x [ -7,  5,  1 ] x 1/6  = 1/6 x [ 0, 6, 0 ] =  [ 0, 1, 0 ]
    [ 2, 5, 1 ]   [  1,  1, -1 ]                [ 0, 0, 6 ]    [ 0, 0, 1 ]

Надеюсь, это немного поможет.

Ответ 2

Фредрик - короткий ответ: да, вы должны изучить Матрицы и Векторы, поскольку они являются математическими основами для 3D-работы.

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

Еще одна вещь: существуют различные двигатели для 3D-моделирования, которые делают это для вас на рынке. Наиболее известным из них является, возможно, Source Engine от Valve. Вы можете использовать этот движок (построенный для HalfLife2 и CounterStrike) для создания довольно сложных игр при работе над уровнем 3D-моделирования. На самом деле, одна из самых популярных игр в сети Steam, Garry mod началась с того, что кто-то просто играл с крутыми вещами, которые вы можете делать с Steam Engine, Здесь ссылка на сайт, который предоставляет учебные пособия для создания ваших собственных миров с использованием Source Engine в случае, если вы заинтересованы.

Ответ 3

Вам определенно нужно изучить линейную алгебру. MIT бесплатно выпустил весь класс на youtube. Вы можете начать с здесь. Это не так сложно, поверьте! Удачи;)

Ответ 4

'Математика для приложений компьютерной графики" - это учебник начального уровня и подходит для класса, подходящего для всей необходимой математической математики для ознакомления с 3D-программированием (главным образом, матрицами и векторами)

И примечание о кватернионах: они очень полезны для определенных приложений. SLERP (Spherical Linear intERPolation) может быть очень удобен для создания гладких/привлекательных движений камеры (между прочим). SLERP - это боль (дорого), связанная с матрицами, но дешевая и простая с Quaternions. Научитесь использовать и любить их, даже если вы не полностью их понимаете.

Ответ 5

Для векторов, в частности, вводный текст или курс по линейной алгебре должны быть способны быстро довести вас до скорости.