Krita: четырехточечные перспективные трансформации

d6b50ecef424468ab4c37e8176849d0d.pngПримерно месяц назад проект Крита успешно завершил кампанию по сбору средств на Кикстартере (см. прошлый пост), теперь разработчики полностью погружены в процесс написания обещанных плюшек. Первой реализованной целью стали четырехточечные перспективные трансформации. В этой статье я расскажу об их реализации и применении.Вообще, «выглядящие трехмерными» преобразования существовали в Крите довольно давно, однако пользоваться ими было неудобно. Дело в том, что стандартный инструмент трансформаций позволял лишь вращать объект вокруг трех осей. Что весьма плохо подходит для самого востребованного пользовательского сценария: добавить текстуру на объект нарисованный с учетом перспективы. Самый простой пример — поместить окна на стены здания.

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

Математика преобразованияКак известно, перспективная трансформация на плоскости задается матрицей преобразования однородных координат.1fe6a7c9ff9c4d6fb50c4046183be9c2.gif

Эта матрица состоит из восьми значащих элементов (масштабы-повороты (4060953929454eae99ed35bf0a840b0c.gif), смещения (27f93d692d7247b093e3527fb0b07069.gif), перспектива (cf3a4a587861428480a382864f72b1b9.gif)) и одного масштабного коэффициента. Таким образом, чтобы однозначно задать преобразование, нам нужно иметь 8 уравнений, связывающих эти значения. Четыре точки, каждая с двумя координатами, как раз и зададут эти уравнения, при условии, что любые три из них не лежат на одной прямой.

Пусть имеются четыре точки (x1, y1)… (x4, y4) в координатах исходного изображения. Выразим четвертую точку через линейную комбинацию первых трех:

62ef96f831504433a137600b2ca230fc.gif

Решим систему и запишем матрицу преобразования, которая будет переводить (1,0,0) в кратное (x1, y1,1), (0,1,0) в кратное (x2, y2,1), (0,0,1) в (x3, y3,1) и (1,1,1) в (x4, y4,1)

afb2155b8855444083b04f23aba2096d.gif

Теперь повторим эти шаги для координат точек в конечном пространстве и получим матрицу B в штрихованных координатах.

df9974fabbbd41359ae80c2256f12da8.gif

Тогда искомая матрица преобразования будет иметь вид

4849f47b939d46ad998af249042f3964.gif

Матрица f81a8d68aa6748d48e7f08ffc1840db1.gif будет преобразовывать исходные координаты точек в промежуточные фиктивные точки (1,0,0), (0,1,0), (0,0,1) и (1,1,1), а матрица cf7cc466efd64d07b4210d3252a0c23e.gif, в свою очередь, преобразует их к желаемым значениям.

Искомая матрица получена!

Преобразование точек схода Точкой схода называется точка, в которой сходятся на перспективном изображении параллельные линии предмета. Одним из требований художников была возможность перетаскивать эти точки напрямую. Сначала было не совсем понятно, как реализовать такой функционал, однако вскоре выяснилось, что в однородных координатах точки схода выражаются элементарно: 83641e042ea14a9f9ddba1967c701fdf.gif

Дальнейшие преобразования никак не изменяются.

Вместо заключения Описанный функционал доступен в последний сборках Криты под Windows и в репозитариях Krita Lime для Ubuntu. Можно обновляться и рисовать! Напоследок видео от Павла Гераськина, демонстрирующее возможности нового инструмента:

[embedded content]

© Habrahabr.ru