Почему мы используем матрицы 4х4, чтобы преобразовать вещи в 3D?

36

Чтобы перевести вектор на 10 единиц в направлении X, зачем нам использовать матрицу?

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

Мы можем просто добавить 10 к мату [0] [0], и мы получили тот же результат.

ngoaho91
источник

Ответы:

28

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

Например, вращение обычно выполняется с использованием матрицы (см. Комментарий @MickLH, чтобы узнать о других способах обращения с вращениями), поэтому, чтобы иметь дело с несколькими преобразованиями (вращение / перемещение / масштабирование / проекция ... и т. Д.) Единообразным способом, вам нужно закодировать их в матрице.

Ну, более технически говоря; преобразование отображает точку / вектор в другую точку / вектор.

p` = T(p); 

где p` - преобразованная точка, а T (p) - функция преобразования.

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

p1 = T (p);

р финал = М (р1);

Матрица может не только объединять несколько типов преобразований в одну матрицу (например, аффинно, линейно, проективно).

Использование матрицы дает нам возможность объединить цепочки преобразований, а затем пакетно умножить их. Это экономит нам массу циклов, обычно выполняемых графическим процессором (спасибо @ChristianRau за указание на это).

T финал = T * R * P; // перевод поворота проект

р финал = Т финал * р;

Также хорошо отметить, что графические процессоры и даже некоторые процессоры оптимизированы для векторных операций; Процессоры, использующие SIMD и графические процессоры, по своей конструкции являются управляемыми данными параллельными процессорами, поэтому использование матриц идеально подходит для аппаратного ускорения (фактически, графические процессоры были разработаны для работы с матрично-векторными операциями).

concept3d
источник
да, я знаю, что матрица полезна для вращения. но каждый урок поможет мне использовать матрицу для таких простых вычислений: D
ngoaho91
1
Сказать, что вращение может быть «только» сделано с матрицей, неверно, от макушки головы Кватернионы и тригонометрия также будут работать отлично
MickLH
17
И даже более того, если у вас есть вращение и перемещение в виде матриц 4х4, вы можете просто умножить их и объединить преобразование в одну матрицу без необходимости преобразовывать каждую вершину тысячами различных преобразований, используя разные конструкции. Тот факт, что матрица 4x4 является избыточным для одного перевода или одного поворота, является перевесом из-за того, что вы обычно не просто преобразовываете вершину одним перемещением или одним вращением.
Крис говорит восстановить Монику
1
@ concept3d Да, я знаю, ответ хороший. Тем не менее, еще большее преимущество, получаемое от единообразного использования матрицы, заключается не только в единообразии, но и в представлении всей цепочки преобразований в одной операции. Хотя это могло подразумеваться, я нашел это неясным и достаточно важным, чтобы упомянуть об этом явно. Но ответ все равно был хорошим, это не было критикой.
Крис говорит восстановить Монику
1
Да, trig вычисляет матрицу вращения, но векторная математика фактически «вращает» точки, используя набор данных, включенный в trig. Когда я говорил о тригонометрии, я имел в виду использовать ее напрямую, а не через матрицу, для генерации некоторых простых вещей.
MickLH
6

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

Реальная сила использования матрицы заключается в том, что вы можете легко объединить ряд сложных операций вместе и применить один и тот же ряд операций к нескольким объектам.

В большинстве случаев это не так просто, и если вы сначала поверните объект и захотите трансформироваться вдоль его локальных осей вместо мировых осей, вы обнаружите, что вы не можете просто добавить 10 к одному из чисел и заставить его работать правильно ,

user43497
источник
5

Чтобы кратко ответить на вопрос «почему», это потому, что матрица 4x4 может описывать операции поворота, перемещения и масштабирования одновременно. Возможность последовательно описывать любое из них упрощает многие вещи.

Различные виды преобразований могут быть проще представлены с помощью различных математических операций. Как вы заметили, перевод можно сделать, просто добавив. Равномерное масштабирование путем умножения на скаляр. Но должным образом созданная матрица 4x4 может делать все что угодно. Таким образом, использование 4x4 последовательно делает код и интерфейсы намного проще. Вы платите немного за понимание этих 4х4, но потом многое становится проще и быстрее из-за этого.

Leopd
источник
2
Это должен был быть выбранный ответ.
инженер
4

причина использования матрицы 4x4 заключается в том, что операция представляет собой линейное преобразование . это пример однородных координат . То же самое делается в случае 2d (с использованием матрицы 3x3). Причиной использования однородных координат является то, что все 3 геометрических преобразования могут быть выполнены с использованием одной операции; в противном случае нужно будет умножить матрицу 3х3 и сложить матрицу 3х3 (для перевода). эта ссылка от cegprakash полезна.

Рэй Тайек
источник
2
Вы должны уточнить. Краткое объяснение лучше, чем просто ссылка на википедию.
Сет Бэттин
3

Переводы не могут быть представлены 3D матрицами

Простой аргумент в том, что перевод может принимать исходный вектор:

0
0
0

от источника, скажи x = 1:

1
0
0

Но для этого потребуется матрица, такая что:

| a b c |   |0|   |1|
| d e f | * |0| = |0|
| g h i |   |0|   |0|

Но это невозможно.

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

Почему матрицы можно использовать?

Многие моделируемые объекты (например, автомобильное шасси) или часть моделируемых объектов (например, автомобильная шина, ведущее колесо) являются твердыми телами: расстояния между вершинами никогда не меняются.

Единственные преобразования, которые мы хотим сделать для них - это ротации и переводы.

Матричное умножение может кодировать как вращения, так и сдвиги.

Матрицы вращения имеют явные формулы, например: 2D матрица вращения для угла aимеет вид:

cos(a) -sin(a)
sin(a)  cos(a)

Существуют аналогичные формулы для 3D , но обратите внимание, что для 3D-поворотов требуется 3 параметра вместо 1 .

Переводы менее тривиальны и будут обсуждаться позже. Именно по этой причине нам нужны 4D-матрицы.

Почему круто использовать матрицы?

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

Например, если мы собираемся перевести тысячу векторов vнашего автомобильного шасси с матрицей, Tа затем вращаться с матрицей R, вместо того, чтобы делать:

v2 = T * v

а потом:

v3 = R * v2

для каждого вектора мы можем предварительно рассчитать:

RT = R * T

и затем сделайте только одно умножение для каждой вершины:

v3 = RT * v

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

Это, естественно, ведет к поддержанию стека матриц:

  • рассчитать матрицу шасси
  • умножить на матрицу шин (толкать)
  • удалить матрицу шин (поп)
  • умножить на матрицу рабочего колеса (толкать)
  • ...

Как добавление одного измерения решает проблему

Давайте рассмотрим случай от 1D до 2D, который проще визуализировать.

Матрица в 1D - это всего лишь одно число, и, как мы видели в 3D, она не может выполнять перевод, только масштабирование.

Но если мы добавим дополнительное измерение как:

| 1 dx | * |x|  = | x + dx |
| 0  1 |   |1|    |      1 |

и тогда мы забываем о новом дополнительном измерении, мы получаем:

x + dx

как мы и хотели.

Это двумерное преобразование настолько важно, что оно имеет название: сдвиговое преобразование .

Круто представить это преобразование:

Источник изображения .

Обратите внимание, что каждая горизонтальная линия (фиксированная y) просто переводится.

Мы просто взяли эту линию в y = 1качестве нашей новой 1D линии и перевели ее с помощью 2D матрицы.

Вещи аналогичны в 3D, с 4D матрицами сдвига в виде:

| 1 0 0 dx |   | x |   | x + dx |
| 0 1 0 dy | * | y | = | y + dy |
| 0 0 1 dz |   | z |   | z + dz |
| 0 0 0  1 |   | 1 |   |      1 |

И наши старые 3D вращения / масштабирования теперь имеют форму:

| a b c 0 |
| d e f 0 |
| g h i 0 |
| 0 0 0 1 |

Это видеоурок Джейми Кинга также стоит посмотреть.

Аффинное пространство

Аффинное пространство - это пространство, генерируемое всеми нашими трехмерными линейными преобразованиями (матричными умножениями) вместе с 4D-сдвигом (трехмерные переводы).

Если мы умножим матрицу сдвига и линейное трехмерное преобразование, мы всегда получим что-то в форме:

| a b c dx |
| d e f dy |
| g h i dz |
| 0 0 0  1 |

Это наиболее общее возможное аффинное преобразование, которое выполняет 3D вращение / масштабирование и перевод.

Одним из важных свойств является то, что если мы умножим 2 аффинных матрицы:

| a b c dx |   | a2 b2 c2 dx2 |
| d e f dy | * | d2 e2 f2 dy2 |
| g h i dz |   | g2 h2 i2 dz2 |
| 0 0 0  1 |   |  0  0  0   1 |

мы всегда получаем другую аффинную матрицу формы:

| a3 b3 c3 (dx + dx2) |
| d3 e3 f3 (dy + dy2) |
| g3 h3 i3 (dz + dz2) |
|  0  0  0          1 |

Математики называют это свойство замыканием и обязаны определять пространство.

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

Проекция усеченного

Но подождите, есть еще одна важная трансформация, которую мы делаем все время: она glFrustumделает объект в 2 раза дальше, выглядит в 2 раза меньше.

Во- первых получить некоторую интуицию о glOrthoпротив glFrustumна: https://stackoverflow.com/questions/2571402/explain-the-usage-of-glortho/36046924#36046924

glOrthoможет быть сделано только с переводами + масштабирование, но как мы можем реализовать glFrustumс помощью матриц?

Предположим, что:

  • наш глаз в начале координат, глядя на -z
  • экран (около плоскости) z = -1- это квадрат длины 2
  • дальняя плоскость усеченного z = -2

Если бы мы только допустили более общие 4-векторы типа:

(x, y, z, w)

с w != 0, и, кроме того, мы отождествляем каждый (x, y, z, w)с (x/w, y/w, z/w, 1), тогда преобразование усеченного с матрицей будет:

| 1 0  0 0 |   | x |   |  x |               | x / -z |
| 0 1  0 0 | * | y | = |  y | identified to | y / -z |
| 0 0  1 0 |   | z |   |  z |               |     -1 |
| 0 0 -1 0 |   | w |   | -z |               |      0 |

Если мы выбрасываем zи wв конце мы получаем:

  • x_proj = x / -z
  • y_proj = y / -z

что именно то, что мы хотели! Мы можем проверить это для некоторых значений, например:

  • если z == -1именно на плоскости мы выступающую к, x_proj == xи y_proj == y.
  • если z == -2, то x_proj = x/2: объекты имеют половинный размер.

Обратите внимание, что glFrustumпреобразование не имеет аффинной формы: оно не может быть реализовано только с помощью поворотов и переводов.

Математическая «хитрость» сложения wи деления на нее называется однородными координатами

См. Также: связанный вопрос переполнения стека: https://stackoverflow.com/questions/2465116/understanding-opengl-matrices

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
источник
@ Downvoters, пожалуйста, объясни, чтобы я мог учиться и совершенствоваться.
Чиро Сантилли 新疆 改造 中心 法轮功 六四 事件
Лично я думаю, что это просто долго и бессвязно, часть, которая касается первоначального вопроса, не является чем-то новым (что не очень хорошо отражено в других ответах), а остальная часть не имеет значения, делая его действительно трудным для понимания.
Джош
@JoshPetrie спасибо за отзыв! Я думаю, что те, кто еще не понимает, с большей вероятностью поймут из моего ответа, поскольку он более нагляден и нагляден. Если вы найдете конкретные ошибки или пункты, которые совершенно не имеют значения, укажите их, чтобы я мог их исправить. Приветствия.
Чиро Сантилли 新疆 改造 中心 法轮功 六四 事件
Как я уже сказал, я думаю, что большая часть ответа не имеет значения. На вопрос «зачем использовать матрицы 4х4, почему мы не можем просто добавить?» Ответ на это хорошо покрыт объяснением типа «да, вы можете добавить, но матрица также позволяет вам переводить / вращать / масштабировать, но из-за того, как работает матричная математика, 3x3 не может кодировать перевод, но 4x4 можно." Если вы осветите это в этой стене текста, это будет очень трудно найти. В остальном это учебник по математике для матриц, о котором не спрашивали, и хотя он, вероятно, подойдет как ответ на другой вопрос, я не думаю, что он подходит для этого вопроса.
Джош
1
Я оценил внимание к деталям. Чтобы решить проблему, возникшую у предыдущего пользователя, ответ должен быть преобразован так, чтобы он начинался со слов «Переводы не могут быть представлены трехмерными матрицами». Это отвечает на поставленный непосредственный вопрос, и ФП может перейти к дальнейшим хорошо написанным и восторженным деталям; эти мелкие детали - вот что меня интересует, поэтому я могу быть предвзятым, но это, конечно, не «бессвязно».
dskinner
1

Смотрите это видео, чтобы понять концепции модели, просмотра и проекции.

Матрицы 4х4 используются не только для перевода трехмерного объекта. Но и для различных других целей.

Посмотрите это, чтобы понять, как вершины в мире представлены в виде 4-мерных матриц и как они преобразуются.

cegprakash
источник
1
Это на самом деле не отвечает на вопрос ОП.
concept3d
Ред. Звучит хорошо?
cegprakash