Чому Однорідні координати використовуються в комп'ютерній графіці?
Яка б була проблема, якби однорідні координати не використовувались у матричних перетвореннях?
Чому Однорідні координати використовуються в комп'ютерній графіці?
Яка б була проблема, якби однорідні координати не використовувались у матричних перетвореннях?
Відповіді:
Вони спрощують та уніфікують математику, що використовується у графіці:
Вони дозволяють представляти переклади з матрицями.
Вони дозволяють представляти поділ по глибині в перспективних прогнозах.
Перший пов'язаний з афінною геометрією. Другий пов'язаний з проективною геометрією.
Це в назві: Однорідні координати добре ... однорідні. Бути однорідним означає рівномірне зображення обертання, перекладу, масштабування та інших перетворень.
Рівномірне представлення дозволяє проводити оптимізацію. Обладнання для 3D-графіки може бути спеціалізованим для виконання матричного множення на матрицях 4x4. Він навіть може бути спеціалізованим для розпізнавання та збереження на множеннях на 0 або 1, оскільки вони часто використовуються.
Якщо не використовувати однорідні координати, можливо ускладнити використання сильно оптимізованого обладнання в повному обсязі. Яка б програма не визнавала, що можна використовувати оптимізовані інструкції обладнання (як правило, компілятор, але іноді складніше) для однорідних координат, буде важко з оптимізацією для інших представлень. Він обере менш оптимізовані інструкції і, таким чином, не використає потенціал обладнання.
Як були дзвінки для прикладів: PS4 Sony може виконувати великі множення матриць. Це настільки добре, що він був розпроданий на деякий час, адже кластери з них використовувались замість дорожчих суперкомп'ютерів. Згодом Sony вимагала, щоб їх обладнання не використовувалося для військових цілей. Так, суперкомп'ютери - це військова техніка.
Дослідникам стало звично використовувати графічні картки для обчислення їх матричного множення, навіть якщо жодна графіка не бере участь. Просто тому, що вони в них кращі, ніж процесори загального призначення. Для порівняння, сучасні багатоядерні процесори мають порядку 16 конвеєрів (x0,5 або x2 не має великого значення), тоді як GPU мають близько 1024 конвеєрів.
Це не стільки ядер, скільки трубопроводів, які дозволяють реально паралельно обробляти. Ядра працюють над нитками. Нитки повинні бути запрограмовані чітко. Трубопроводи працюють на рівні інструкцій. Чіп може більш-менш паралелізувати інструкції самостійно.
доповнення:
однорідні координати також дозволяють представляти нескінченність: в 3D, тобто точка в нескінченності в напрямку . Зазвичай джерела світла в кінцевому або нескінченному положенні можуть бути представлені однаково. х,
Щодо перспективної трансформації, вона навіть дозволяє правильно інтерполювати без викривлення в перспективі (всупереч ранній графічній техніці на ПК).
Як особистий смак, я завжди утримувався (коли це було можливо) від використання однорідних координат і віддав перевагу простому декартовому формулюванню.
Головною причиною є той факт, що однорідні координати використовують 4 тривіальних запису в матрицях перетворення (0, 0, 0, 1), що передбачають марне зберігання та обчислення (також накладні загальні підрахунки матричних обчислень, які "за замовчуванням" використовуються в цей випадок).
Мінус полягає в тому, що вам потрібно більше дбати при написанні рівнянь і втрачати підтримку теорії матриць, але поки що я вижив.
plain Cartesian formulation
або посилання на ресурс, який описує його використання в 3D-графіці?
w
?
Уявіть, що ви хочете представляти перетворення за допомогою матриць. Окуляри можуть бути збережені як і ви можете представляти обертання як та масштабування як Вони відомі як лінійні перетворення, і вони дозволяють робити перетворення як матриці множення. Але зауважте, що ви не можете робити переклади як матричне множення. Натомість ви повинні зробити
Нехай R і S - матриці обертання і масштабування, а T - вектор перекладу. У комп'ютерній графіці вам може знадобитися зробити ряд перекладів до певної точки. Ви могли собі уявити, наскільки хитро це може вийти.
Масштабуйте, перекладіть, потім обертайте та масштабуйте, а потім перекладіть знову: Не дуже погано, але уявіть, що ви зробили це обчислення на мільйон балів. Ми хотіли б представляти обертання, масштабування та переклад все як матричне множення. Тоді ці матриці можна попередньо помножити разом на одну матрицю перетворення, з якою легко обчислити.
Масштабуйте, перекладіть, потім обертайте та масштабуйте, а потім перекладіть знову:
Ми можемо досягти цього, додавши до наших точок ще одну координату. Я збираюся показати все це для двовимірної графіки (3D точок), але ви можете розширити все це до 3D графіки (4D балів). Матриця обертання: Матриця масштабу: Матриця перекладу: Вам слід розробити кілька прикладів, щоб переконати себе, що вони насправді дають вам бажане перетворення і що ви можете скласти ряд перетворень шляхом множення кількох матриць разом.
Ви можете піти далі і дозволити додатковій координаті приймати будь-яке значення. і скажіть, що ця однорідна (x, y, w) координата являє собою евклідову (x, y) координату при (x / w, y / w) ). Зазвичай ви не можете робити поділ за допомогою матричних перетворень, однак, дозволяючи w бути дільником, ви можете встановити w до деякого значення (шляхом множення матриці) і дозволити йому представляти поділ. Це корисно для проектування, оскільки (у 3D) вам потрібно буде розділити координати x і y на -z (у правій системі координат). Домогтися цього можна просто встановивши w до -z, використовуючи таку матрицю проекцій: Q = [ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 - 1 0 ]
Розрахунки за афінними координатами часто вимагають поділів, які є дорогими порівняно з додаваннями чи множеннями. Зазвичай не потрібно ділитися при використанні проективних координат.
Використання проективних координат (і загалом, геометрії проективних проектів) має тенденцію до усунення і спеціальних випадків, що робить все простішим і більш рівномірним.