Что представляет собой матрица?

19

Я недавно начал изучать OpenGL, и у меня возникают проблемы с визуализацией матриц и их роли в компьютерной графике. Учитывая шаблон матрицы 4x4, как это:

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

Я бы предположил, что каждая подобная матрица - это координаты вершины в мировом пространстве. И несколько из них вместе взятые и затененные дают объект?

Но почему есть а Xx, Xyа Xz? Я читал, что это другая ось (вверх, влево, вперед), но все еще не может сделать головы или хвосты значения.

Грустный разработчик CRUD
источник

Ответы:

19

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

Построение преобразования основано на одном из трех типов преобразования: Перевести, Повернуть и Масштабировать.

Матрица перевода выглядит примерно так:

Матрица перевода

И масштабная матрица: Матрица шкалы

Матрицы вращения выглядят так:

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

Чтобы объединить любую из этих матриц, вы просто умножаете их вместе. Чтобы применить преобразование к вершине, просто умножьте ее на вершину (как показано на диаграмме перевода).

Алекс Шепард
источник
4
О, поэтому матрицы не представляют точки. Я сейчас в замешательстве
Сад CRUD Developer
Часто они применяются к объекту или к области просмотра в целом (именно так вы получаете свое орто или перспективное представление)
Алекс Шепард
3
@BDillan: Нет, но они, безусловно, могут содержать точки. Последний столбец в матрице ModelView (GL / column-major), например, определяет, как переводится источник. Или, другими словами, он определяет, где находится глаз в мировом пространстве и может буквально использоваться как точка сам по себе.
Andon M. Coleman
ваша координата 3-кортеж. почему матрица не в 3 раза 3? Предположим, что у вас есть возможность объединить три типа преобразования в одну матрицу и все еще иметь достаточно места, что делает нижний правый угол, похоже, он всегда равен 1?
n611x007
Четвертая строка / столбец специально для переводов. Одной из самых приятных особенностей математической математики является то, что я могу объединить все переводы и повороты, которые я хочу выполнить, в одну матрицу. Это означает, что очень, очень сложные наборы преобразований (теоретически бесконечные) могут быть сжаты до 1 матрицы. Да, эта последняя ячейка остается 1, но она позволяет нам делать остальную часть математики.
Алекс Шепард
10

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

Матрицы, которые содержат только преобразования преобразования, поворота или масштабирования, имеют обычно используемую интерпретацию: верхний левый 3x3 матрицы содержит только данные поворота или масштабирования, нижний ряд или правый столбец содержит данные перевода. Это не общность, но достаточно часто справедливо для подмножества преобразований, представленных в компьютерной графике, которые люди используют.

Аналогичным образом, существует связь между значениями матрицы и соответствующей системой координат, которую представляет матрица (что не всегда является «мировым пространством», я должен отметить). Верхние левые столбцы (или строки) 3x3 представляют оси X, Y и Z системы координат.

Являются ли строки осями или столбцом, зависит от того, используете ли вы соглашение умножения как row vector * matrixили matrix * column vector. При выполнении умножения матриц внутренние размеры двух матриц должны совпадать, и поэтому выбор этих векторов в качестве матриц строк или матриц столбцов влияет на выбор (OpenGL и традиционная математика предпочитают векторы столбцов).

Я рекомендую получить хорошую книгу по линейной алгебре или, по крайней мере, взглянуть на часто задаваемые вопросы по Matrix и Quaternion и этот пост по макетам матриц в DirectX и OpenGL .

WJL
источник
У меня тонны «хороших» книг по линейной алгебре, некоторые из которых я даже читал и понимал. Дело в том, что это немного не помогает, не то, что у меня их нет, и что я это понял. У меня такое чувство, что твой последний совет отвечает неверному предположению.
n611x007
9

Что такое матрица?

Матрица со mстолбцами и nстроками представляет функцию, которая использует вектор * с mэлементами (или координатами) и создает вектор с nэлементами.

Из этого вы можете заметить, что если и только если матрица является квадратной, размерность вектора не изменится. Например. Вы получаете 3D вектор от преобразования 3D вектора, 2D от 2D и т. д.

* : В физике векторы обычно используются для обозначения сил или других «влияний», которые «движутся» вокруг таких вещей, как скорость или ускорение. Но ничто не мешает вам использовать вектор для представления точки или любого произвольного массива чисел (некоторые библиотеки и языки программирования даже используют «вектор» в значении «1D массив»). Для использования с матрицами все элементы вашего вектора (даже строки или цвета) могут быть чем угодно, при условии, что у вас есть способ сложения, вычитания и умножения их на любые элементы вашей матрицы. Отсюда и название вектора , что означает «перевозчик» - он несет или хранит для вас значения.

Что означает умножение на матрицу?

Итак, если матрица - это функция, то какая это функция ? Что делает функция? Рецепт для этого определяется элементами матрицы. Давайте назовем вход u, выход v, матрицу M(умножение M*u=vтогда такое же, какf(u)=v ) и u(i)даст iэлемент th u(например, 2-й элемент - это координата y). Для матрицы M(i,j)означает строку i, столбец j.

Построение элемента v(1), первого в результате, описывается первой строкой матрицы. u(1)разM(1,1) , плюс u(2)раз M(1,2), ... плюс u(i)раз M(1,i). Матрица немного похожа на очень простой язык программирования, который хорош только для функций программирования, которые работают, перетасовывая вводы, добавляя их к себе и т. Д. **

Полезно представить, что вы работаете с одним элементом вывода за раз, следовательно, вы используете только одну строку матрицы за раз. Вы пишете uгоризонтально. Вы пишете i-й ряд Mниже. Вы умножаете каждую пару выше / ниже и пишете продукты ниже, затем складываете продукты. Повторите для каждой строки, чтобы получить каждый элементv . (Теперь вы понимаете, почему матрица mby nдолжна работать с mвектором и создаватьn вектор.)

Еще один способ думать об этом - скажем, мы делаем преобразование 3D в 3D, поэтому матрица 3x3 (или 3D преобразование, как их часто называют, потому что вы можете притвориться, что эта «функция» «перемещает» 3D-точки, даже если на самом деле это просто меняю цифры). Допустим, первый ряд[1 2 0] . Это значит, чтобы получить x результата, получить 1 из входных данных x, 2 из входных данных y и 0 из входных данных z. Так что это действительно рецепт.

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

Что означает умножение двух матриц?

Если они обе являются матрицами соответствующего размера, то A*Bозначает «функция, которая применяется сначала, Bзатем A». Вы можете понять, почему существуют ограничения на размеры для умножения, потому что размер определяет размер входных и выходных данных, а одна матрица потребляет выходные данные другой. Почему умножение означает объединение функций? Проще заметить, что так и должно быть. Если A*uто же самое, что f(u)и B*uто же самое, что и g(u)то f(g(u))же f(B*u)самое, что иA*(B*u) .

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

Чем полезны матрицы?

Что хорошего в том, чтобы делать подобное преобразование new_x = 1*x+2*y+0*z(если первая строка [1 2 0])? Это не очень очевидно, но давайте возьмем другую 2D-матрицу, чтобы объяснить это. Матрица:

[ 0 1
  1 0 ]

Или [0 1; 1 0]используя удобную запись Matlab. Что делает эта матрица? Он преобразует двумерный вектор следующим образом: для x результата возьмите 1 из y входных данных. Для y результата возьмите 1 из x входных данных. Мы только что поменяли координаты x и y на входе - эта матрица отражает точки вокруг линии x = y. Это что-то полезное! По расширению вы увидите, что все матрицы с 1 по линии SW - NE отражают. Вы также можете увидеть, почему единичные матрицы возвращают вам входные данные (для x выходных данных берут x входных данных; для y выходных данных берут y входных данных ...).

Теперь вы видите, почему символы, например. Xx, Yx- они имеют в виду , сколько входных X, Yи т.д. переходит в выходной x.

Чем еще полезны матрицы?

Какие еще преобразования вы можете сделать? Вы можете изменить размер, взяв единичную матрицу, но с другим номером, отличным от 1 по диагонали. Например, [2.5 0; 0 22.5]умножит каждую координату ввода на 2,5, и если вы примените эту матрицу к каждой точке на изображении, картинка будет в 2,5 раза больше. Если вы поместите только 2.5 в одну строку ( [2.5 0; 0 1]), то умножится только координата x, поэтому вы будете растягиваться только вдоль x.

Другие матрицы могут давать другие преобразования, такие как «перекос», которые имеют различную степень полезности. Лично, перекос - мой наименее любимый, потому что матрица выглядит так просто, но само преобразование редко делает что-либо, кроме искажения изображения. Полезным является «вращение» - как вы вращаете точку? Попробуйте определить положение точки (x, y)после поворота наtheta градусов против часовой стрелки относительно начала координат. Вы обнаружите, что новые координаты x и y получаются в результате умножения старых x и y на некоторые синусы и косинусы тэты. Вы должны быть в состоянии легко написать матрицу вращения, используя синусы и косинусы, которые соответствуют этой функции.

С неквадратными матрицами вы также можете изменить размерность ввода. Превращение 2D-ввода в 3D не очень полезно, так как трудно «изготовить» что-то, чтобы вставить новую координату, но 3D в 2D очень полезно. Помимо всего прочего, это то , как ваш компьютер знает проецировать *** 3D - сцены в 2D - изображение , чтобы нарисовать на экране монитора.

Поскольку векторы могут содержать разные вещи, вы могли бы даже описать матрицу, которая зашифровывает строку из n символов за раз, перетасовывая их или «умножая» их (вам придётся придумать функцию умножения / сложения).

*** : Когда вы проецируете , вы берете 3D-объект, например, скульптуру, освещаете его и видите, какой вид 2D-тени падает на стену.

Каковы ограничения матриц?

Можете ли вы сделать каждую функцию с матрицами? Нет. Если мыслить графически, трудно представить то, что матрица не может сделать (но она существует: например, эффект «вихря» не может быть достигнут). Тем не менее, вот простой пример: допустим, функция fтакова, что f(u)возвращает вас u с каждым элементом в квадрате . Вы увидите, что вы не можете написать матрицу для этого: с матрицами есть только средство для описания рецептов, которые умножают координаты на постоянное число, никакие другие необычные функции, такие как мощность, не могут быть выражены.

**** : По этой же причине она называется линейной алгеброй - степенная функция нелинейна , она не образует прямую линию при построении графика.

О странной лишней строке в 4D матрицах

Теперь, почему матрица в вашем примере 4 на 4? Разве это не означает 4-мерное пространство? У нас нет 4D компьютеров, так почему? На самом деле это интересный трюк с матрицами, который относится к предыдущему пункту о линейных операциях.

Относительно того, какие функции не могут быть выполнены с матрицами: Какова матрица для перемещения 2D-точки на 2 единицы вправо (которая создает точку (x+2, y)? Опять же, мы застряли. Есть способ умножить ввод, но нет способа добавить константа. Для 2D-работы хитрость заключается в том, чтобы притворяться, что вы на самом деле не в 2D-пространстве, а в 3D-пространстве, за исключением того, что высота (координата z или 3-й элемент) всего всегда равна 1 (это немного похоже на то, как 2D-юниверс просто «пластинка», лежащая ровно по полу трехмерной вселенной - в этом случае третья координата всегда равна 0). Затем вы можете использовать эту магическую последнюю координату как константу, потому что вы знаете, что она всегда равна 1 для каждого входа.

Аналогично, для перемещения 3D-точек вам нужны 4D-координаты. Вот почему все матрицы 3D-преобразования, которые вы видите, будут иметь [0 0 0 1]последнюю строку - вы никогда не должны изменять 4-е измерение, иначе результат будет слишком сложным для представления в 3D!

Superbest
источник
так как ты делаешь матрицу для сложения? скажем, строка Xx Yx Zx Tx... и последняя строка на самом деле, 0t 0t 0t 1tкак заменить из Xt Yt Zt Tt. Чтобы сделать (x+2, y)из (x, y)вас можно пойти 1x 0y 0z 2t, что даст вам, 1*x + 0*y + 0*z + 2*1так как t=1верно? Что в значительной степени составляет х + 2. О, дорогой, теперь ты можешь испортить свой рендеринг с забавными значениями T, не так ли? -grin- (долго читать, все еще лучшее значение,
спасибо
2

Это матрица 4x4-мажор, и, судя по всему, матрица представления.

Первые 3 столбца определяют направление ваших базовых векторов (вверх, влево, вперед, как вы их назвали), а последний столбец определяет перевод точки зрения. Сложите их вместе, и вы сможете описать ориентацию вашей камеры, и, что более важно, вы можете использовать эту матрицу для преобразования точек в координатное пространство, известное как «пространство глаза», «пространство обзора» или «пространство камеры».

Это все синонимы для одного и того же координатного пространства. К сожалению, вам приходится изучать все синонимы при работе с компьютерной графикой, потому что разные книги и люди будут называть их разными именами. Большинство координатных пространств имеют несколько имен.

Кстати, три столбца в вашей матрице вида обычно ортогональны, то есть они образуют прямые углы друг к другу. Это не обязательно, но это очень распространенное свойство при создании традиционной камеры.

Андон М. Коулман
источник
1

TL; версия DR:

Первые три элемента [x y z]в каждом ряду представляют один базисный вектор преобразованной системы координат. Последний элемент wявляется компонентом перевода.

Длинная версия

Если вы хотите, чтобы матрица, которая при применении к вершине поворачивала вершину относительно начала координат, скажем, на 45 градусов, вы бы заполнили матрицу тремя векторами, представляющими преобразованные оси:

  • Точка iна xоси [1 0 0], но повернута на 45 градусов. Это просто [i_x i_y i_z], где i_xиi_y являются ноги треугольника с 45 градусов внутренним углом по отношению к оси X: [cos(45) sin(45) 0].
  • Точка jна оси Y[0 1 0] , но повернута на 45 градусов от этой оси. Нарисуйте его на листе бумаги, и вы увидите, что при вращении против часовой стрелки компоненты становятся [-sin(45) cos(45) 0].
  • Точка kна zоси. В этом примереz это не затронуто, так как мы вращаемся (в плоскости экрана) по оси xy

Итак, у нас есть три новых вектора: i, j, k. Простой способ визуализировать это - просто взять оси X и Y и вращать всю поперечную схему.

Как мы помещаем их в матрицу?

i_x i_y i_z
j_x j_y j_z
k_x k_y k_z

Или

 cos(45)  sin(45)    0
-sin(45)  cos(45)    0
    0        0       1

Если вы умножите любую вершину на эту матрицу, вы получите

v1_x = v_x cos(Θ)     - v_y sin(Θ) + v_z * 0
V1_y = v_x*sin(Θ)    + v_y cos(Θ) + v_Z * 0
V1_z = v_x * 0        + v_y * 0    + v_z * 1

для v = [1 0 0], и Θ = 90°это становитсяv1 = [0 1 0]

Для перевода мы добавляем четвертую строку и столбец и помещаем компоненты перевода в последний столбец. Мы добавляем четвертый компонент к вершине, wкоторая обычно 1. Это так, что когда мы умножаем вершину на матрицу, компонент w приводит к добавлению последнего столбца к входной вершине, поэтому вершина перемещается или переводится. Мы называем эти «однородные координаты». (Для наших целей «однородный» означает только 4-й компонентw в каждом векторе , и мы используем матрицу 4x4 вместо 3x3. Часто вы будете видеть шейдеры, которые используют матрицы 4x3, чтобы избежать отправки бесполезной 4-й строки в графический процессор, который потребляет ценную память и пропускную способность. 4-й ряд необходим для перспективного проецирования, но не более того.)

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

3Dave
источник
2
В тот момент, когда вы осознаете, что только что ответили на вопрос, который уже был три года назад ...
3Dave
: P Всегда смотрите на дату вопроса, прежде чем отвечать ...
HolyBlackCat