Интерактивная версия этой статьи доступна здесь: http://wordsandbuttons.online/interactive_guide_to_homogen_coordinates.html

Зачем вам нужны однородные координаты, какими бы они ни были? Что ж, если вы работаете с геометрией: 3D-графикой, обработкой изображений, физическим моделированием, ответ очевиден. Знание математики, лежащей в основе выбранной вами структуры, позволяет писать более эффективный код. Однажды мне пришлось ускорить работу одного .NET-приложения, которое сгибает изображения, и просто правильно повторно реализовать некоторые примитивные операции дало мне 100-кратное повышение производительности.

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

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

Поэтому, если вы работаете с трехмерной графикой, вы можете заметить, что довольно часто трехмерные точки записываются в виде кортежа из 4 чисел. Обычный вопрос здесь: «Что означает эта четвертая координата?» И обычный ответ: «Просто установите его на 1 и надейтесь, что ничего не напортачите!»

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

Декартовы координаты - это всего лишь первые 3 числа однородных координат, разделенных на четвертое. Таким образом, если это 1, то однородные координаты - это то же самое, что и декартовы. Но чем меньше он становится, тем дальше точка в декартовых координатах перемещается от нуля. До одного момента это все довольно просто. Что, если четвертая координата 0?

Интуиция подсказывает, что она должна быть дальше от 0, чем любая другая точка. Любая другая точка в евклидовом пространстве. Однородные координаты действительно обозначают точки не только в евклидовом или, в более общем смысле, аффинном пространстве, но и в проективном пространстве, которое включает и расширяет аффинное пространство.

С прагматической точки зрения это позволяет нам составлять 3D-сцену таким образом, чтобы каждый объект, до которого можно добраться, помещался в аффинном пространстве с координатами (x, y, z, 1), а все объекты, которые никогда не будут достигнуты, будут принадлежать проективному расширению (x, y, z, 0).

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

Но можем ли мы просто поставить точку очень-очень далеко и не вдаваться в эту тему 1/0? Иногда мы можем, но это может не всегда работать должным образом. Дело в том, что числа с плавающей запятой, обычно используемые для хранения геометрии, не такие уж большие, как кажется. Да, технически они могут хранить числа от 0.000000000000000000000000000000001 до 10000000000000000000000000000000000, но не в одном выражении. Числа с разным показателем степени теряют точность при каждой операции, а числа с одинаковым показателем степени имеют только 23 значимых двоичных цифры. Это примерно обозначает диапазон от 0 до 8000000. Если вы хотите иметь детали миллиметрового размера в каждой части вашей сцены, это означает, что ваша сцена не должна быть больше 8 километров. Достаточно хорошо для шутера от третьего лица, но не для космического симулятора.

Использование проективного пространства дает вам больше возможностей. Но это еще не все, для чего он нужен. Фактически, мы только начинаем понимать преимущества.

В евклидовом пространстве есть два вида проекции: центральная и параллельная. Центральная проекция - это то, что делает перспективу, поэтому более близкие объекты кажутся больше, и это то, что мы используем в видеоиграх, чтобы визуализировать трехмерную сцену в плоское изображение на экране. Параллельная проекция сохраняет пропорции, поэтому мы обычно используем их в системах САПР для отображения болтов и гаек на чертежах.

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

Так что имейте в виду, что если вы хотите создать игру о зомби, которые оказались инженерами САПР, вам не нужно реализовывать оба вида проекций. Просто установите центральную проекцию на (x, y, z, 0), и она автоматически превратится в параллельную.

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

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

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

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

В проективном мире это не только формулы, но и матрицы.

На самом деле это довольно просто. Вы хотите сделать перевод. Вы берете (x, y, w) и умножаете его на матрицу перевода. В результате вы получите этот вектор: (1 * x + 0 * y + A * w, 0 * x + 1 * y + B * , 0 *x + o * y + 1 * w) или (x + Aw, Y + Bw, w). Если вы трансформируете евклидову точку, тогда w = 1, и вы получите точно аффинный перевод.

Но это работает, даже если вы этого не сделаете. (x, y, 0), умноженное на ту же матрицу перевода, дает (x, y, 0). Что в точности показывает, что перевод делает с точкой из аффинного пространства - ничего!

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

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

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

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

У нас есть формула преобразования, и у нас есть числа для углов особого куба до и после преобразования. Чего у нас нет, так это коэффициентов. A, B, C, D, E, F, a, b, c. Дилемма здесь в том, что даже если мы запишем каждое преобразование координат в виде линейного уравнения, а мы сможем это сделать, все равно будет больше коэффициентов, чем уравнений. Сможем ли мы это решить?

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

Итак, среди всех матриц, которые подходят для наших уравнений, давайте просто выберем ту, которая имеет c = 1. Тогда система нахождения всех оставшихся коэффициентов будет выглядеть так:

C = x1`
F = y1`
B + C - x2`b = x2`
E + F - y2`b = y2`
A + B + C - x3`a - x3`b = x3`
D + E + F - y3`a - y3`b = y3`
A + C - x4`a = x4`
D + F - y4`a = y4`

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

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

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

Обратное преобразование подходит для 2.1, но вы можете использовать уравнения проективного преобразования и делать математику самостоятельно. Выбирая решение c=1 вместо вычисления справедливой обратной матрицы, вы в основном пропускаете поиск определителя 3x3. Это работает примерно в 2 раза быстрее, чем традиционный метод.

Обратное преобразование работает и для 2.3, но вам действительно не нужно делать даже упрощенную версию, так как вам нужно определить только 6 коэффициентов, а не 9. Это занимает около двух третей проективной инверсии с точки зрения производительности.

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

Я надеюсь, что этот текст немного раскрывает это. Надеюсь, это сделает его более заслуживающим доверия.

Если вам это понравилось, вам также могут понравиться:





Хакерский полдень - это то, с чего хакеры начинают свои дни. Мы часть семьи @AMI. Сейчас мы принимаем заявки и рады обсудить рекламные и спонсорские возможности.

Если вам понравился этот рассказ, мы рекомендуем прочитать наши Последние технические истории и Современные технические истории. До следующего раза не воспринимайте реалии мира как должное!