Що являє собою матриця?


19

Я нещодавно почав вивчати OpenGL, і у мене виникають проблеми з уявленням про те, які матриці є та їх роль у комп'ютерній графіці. Враховуючи такий шаблон матриці 4x4:

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

Я б припустив, що кожна така матриця є координатами вершини у світовому просторі. І кілька з них, складених разом і затінених, дають предмет?

Але чому є a Xx, a Xyі an Xz? Я читав, що його інша вісь (вгору, вліво, вперед), але все ще не може зробити головою або хвостами значення.

Відповіді:


19

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

Побудова трансформації ґрунтується на одному з трьох типів перетворень: Перекласти, Повернути та Шкала.

Матриця перекладу - це щось на зразок:

Матриця перекладу

І матриця масштабу: Матриця масштабу

Матриці обертання мають вигляд:

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

Щоб поєднати будь-яку з цих матриць, ви просто помножте їх разом. Щоб застосувати перетворення до вершини, просто помножте на вершину (як видно з діаграми перекладу).


4
О тому матриці не представляють точок. Мене зараз хвилює
Сумний розробник CRUD

Дуже багато разів вони застосовуються до об'єкта або до огляду в цілому (саме так ви отримуєте свій орто-проти перспективних поглядів)
Алекс Шепард

3
@BDillan: Ні, але вони, безумовно, можуть містити очки. Наприклад, останній стовпець у матриці ModelView (GL / стовпчик-мажор) визначає, як переводиться походження. Або, кажучи іншим способом, воно визначає, де знаходиться око у світовому просторі, і його можна буквально використовувати як крапку.
Андон М. Коулман

ваша координата 3-кортеж. чому матриця не 3 рази 3? Припустимо, що ви зможете поєднати три типи перетворень в одну матрицю і все ще мати достатньо місця, що ж робити, як це зроблено в нижньому правому куті, схоже, що це завжди 1?
n611x007

Четвертий рядок / стовпець спеціально є для перекладів. Однією з найприємніших особливостей математики матриці є те, що я можу поєднувати всі переклади та обертання, які хочу виконати, в одну матрицю. Це означає, що дуже і дуже складні набори перетворень (теоретично нескінченні) можна стиснути до 1 матриці. Так, у останньої комірки залишається 1, але це дозволяє нам робити решту математики.
Алекс Шепард

10

У комп'ютерній графіці ми використовуємо матриці для кодування перетворень .

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

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

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

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


є багато "хороших" книг про лінійну алгебру, деякі з яких я навіть читав і розумів. річ у тому, що це нітрохи не допомагає, не те, що я їх маю, ні що я це зрозумів. У мене є відчуття, що ваша остання порада відповідає на неправильне припущення.
n611x007

9

Що таке матриця?

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

З цього можна помітити, що якщо і лише якщо матриця квадратна, розмірність вектора не зміниться. Напр. ви отримуєте 3D-вектор від перетворення 3D-вектора, 2D з 2D і т.д.

* : У фізиці вектори зазвичай використовуються для позначення сил або інших "впливів", які "рухаються навколо" таких речей, як швидкість або прискорення. Але ніщо не заважає вам використовувати вектор для представлення точки або будь-якого довільного масиву чисел (деякі бібліотеки та мови програмування навіть використовують "вектор", щоб означати "1D масив"). Для використання з матрицями будь-що може бути елементами вашого вектора (навіть рядки або кольори), якщо у вас є спосіб їх додавання, віднімання та множення на будь-які елементи вашої матриці. Звідси вектор імені , що означає "оператор" - він несе або утримує значення для вас.

Що означає множення на матрицю?

Отже, якщо матриця - це функція, то яка функція ? Що робить функція? Рецепт його визначається елементами матриці. Назвемо вхід u, вихід v, матрицю M(множення M*u=vтоді те саме f(u)=v) і u(i)подаємо ith елемент u(наприклад, другий елемент - координата 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. (Тепер ви бачите , чому з mдопомогою nматриці повинні працювати на mвектор і виробляти nвектор.)

Ще один спосіб подумати над цим - скажімо, ми робимо перетворення 3D в 3D, тому матриця 3x3 (або 3D-трансформація, як їх часто називають, тому що ви можете зробити вигляд, що ця "функція" - це "переміщення" 3D-точок, хоча насправді це просто зміна чисел). Скажімо, перший ряд є [1 2 0]. Це означає, щоб отримати х результату, отримайте 1 вхідних х, 2 вхідних у і 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])? Це не дуже очевидно, але для пояснення цього візьмемо ще одну двовимірну матрицю. Матриця така:

[ 0 1
  1 0 ]

Або [0 1; 1 0]використовуючи зручні позначення Matlab. Що робить ця матриця? Він перетворює 2D вектор так: Для х результату візьміть 1 з y вхідного сигналу. Для y результату візьміть 1 з x введення. Ми щойно поміняли координати x і y на вході - ця матриця відображає точки щодо лінії x = y. Це щось корисне! За розширенням ви побачите, що всі матриці з 1s по лінії SW - NE відображають. Ви також можете побачити, чому матриці ідентичності повертають вам вхід назад (для x виводу, 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 на деякі синуси та косинуси. Ви повинні мати можливість легко записати матрицю обертання, використовуючи синуси та косинуси, що відповідає цій функції.

За допомогою неквадратичних матриць ви також можете змінити розмірність введення. Перетворення двовимірного вводу в 3D не дуже корисно, оскільки важко «виготовити» щось, щоб ввести нову координату, але 3D в 2D дуже корисно. Крім усього іншого, саме так ваш комп'ютер знає, як проектувати *** 3D-сцену на 2D зображення, щоб намалювати на моніторі.

Оскільки вектори можуть вміщувати різні речі, ви навіть можете описати матрицю, яка зашифровує рядкові n-символи одночасно, перетасовуючи їх навколо або «множуючи» їх (вам доведеться придумати функцію множення / додавання).

*** : Коли ви проектувати , ви берете 3D - об'єкт , як скульптури, пролити світло на нього, і подивитися , які 2D тіні падає на стіну.

Які обмеження матриць?

Чи можете ви виконати кожну функцію з матрицями? Ні. Якщо подумати графічно, важко уявити щось, чого матриця не змогла зробити (але вона існує: наприклад, ефект "вихору" неможливо зробити). Однак ось простий приклад: Скажімо, функція fтака, що f(u)повертає вас u з кожним елементом у квадрат . Ви побачите, що ви не можете написати матрицю для цього: З матрицями є лише можливість опису рецептів, що множать координати на постійне число, ніяких інших фантазійних функцій, таких як потужність, не можна виразити.

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

На дивному додатковому рядку в 4D матрицях

Тепер, чому матриця у вашому прикладі 4 на 4? Це не означає 4-мірний простір? У нас немає 4D-комп'ютерів, так чому? Це насправді цікавий трюк з матрицями, що стосується попереднього пункту про лінійні операції.

Щодо того, які функції неможливо виконати за допомогою матриць: Що таке матриця для переміщення 2D точки на 2 одиниці праворуч (що створює крапку (x+2, y)? Знову ми зациклюємось. Є спосіб множення вводу, але немає способу додати константа. Для роботи в 2D фокус полягає в тому, щоб зробити вигляд, що ви насправді не в двовимірному просторі, а в тривимірному просторі, за винятком висоти (координата z або третього елемента) все завжди 1 (це трохи схоже на те, як 2D Всесвіт просто "тарілка", що лежить плоскою вздовж підлоги 3D-Всесвіту - у цьому випадку третя координата завжди дорівнює 0). Тоді ви можете використовувати цю магічну останню координату як постійну, тому що ви знаєте, що це завжди 1 на кожен вхід.

Так само для переміщення 3D точок потрібні 4D координати. Ось чому всі матриці 3D-перетворень, які ви бачите, матимуть [0 0 0 1]як останній рядок - ви ніколи не повинні змінювати 4-й вимір, інакше результат буде занадто складним для подання у 3D!


так як же зробити матрицю для додавання? скажімо, що рядок є 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? Що в значній мірі становить x + 2. О, дорогий, тепер ти можеш зіпсувати свою візуалізацію із смішними значеннями Т, чи не так? -grin- (довго читати, все ще найкраща цінність, thx)
n611x007

2

Це матриця основного стовпця 4х4, а з вигляду - матриця перегляду.

Перші 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на осі у [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 призводить до додавання останнього стовпчика до вхідної вершини, тому вершина переміщується або перекладається. Ми називаємо ці "однорідні координати". (Для наших цілей "однорідний" просто означає, що wв кожному векторі є 4-й компонент. Ми використовуємо матрицю 4x4 замість 3x3. Часто ви побачите шейдери, які використовують матриці 4x3, щоб уникнути надсилання в основному непридатного 4-го рядка до графічного процесора, який споживає цінну пам'ять і пропускну здатність. 4-й рядок потрібен для перспективного проектування, але не багато іншого.)

Сподіваюсь, це допомагає.


2
Того моменту, коли ти зрозумієш, що ти щойно відповів на вже відповів на запитання за три роки тому ...
3Dave

: P Завжди дивіться на дату питання, перш ніж відповідати ...
HolyBlackCat
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.