Примерно месяц назад проект Крита успешно завершил кампанию по сбору средств на Кикстартере (см. прошлый пост), теперь разработчики полностью погружены в процесс написания обещанных плюшек. Первой реализованной целью стали четырехточечные перспективные трансформации. В этой статье я расскажу об их реализации и применении.
Вообще, «выглядящие трехмерными» преобразования существовали в Крите довольно давно, однако пользоваться ими было неудобно. Дело в том, что стандартный инструмент трансформаций позволял лишь вращать объект вокруг трех осей. Что весьма плохо подходит для самого востребованного пользовательского сценария: добавить текстуру на объект нарисованный с учетом перспективы. Самый простой пример — поместить окна на стены здания.
Наиболее простым решением этой задачи является задание перспективы по четырем точкам: выделяем окно, перетаскиваем его углы в нужную позицию и готово! Этот метод и был реализован.
Математика преобразования
Как известно, перспективная трансформация на плоскости задается матрицей преобразования однородных координат.
Эта матрица состоит из восьми значащих элементов (масштабы-повороты (), смещения (), перспектива ()) и одного масштабного коэффициента. Таким образом, чтобы однозначно задать преобразование, нам нужно иметь 8 уравнений, связывающих эти значения. Четыре точки, каждая с двумя координатами, как раз и зададут эти уравнения, при условии, что любые три из них не лежат на одной прямой.
Пусть имеются четыре точки (x1,y1)… (x4,y4) в координатах исходного изображения. Выразим четвертую точку через линейную комбинацию первых трех:
Решим систему и запишем матрицу преобразования, которая будет переводить (1,0,0) в кратное (x1,y1,1), (0,1,0) в кратное (x2,y2,1), (0,0,1) в (x3,y3,1) и (1,1,1) в (x4,y4,1)
Теперь повторим эти шаги для координат точек в конечном пространстве и получим матрицу B в штрихованных координатах.
Тогда искомая матрица преобразования будет иметь вид
Матрица будет преобразовывать исходные координаты точек в промежуточные фиктивные точки (1,0,0), (0,1,0), (0,0,1) и (1,1,1), а матрица , в свою очередь, преобразует их к желаемым значениям.
Искомая матрица получена!
Преобразование точек схода
Точкой схода называется точка, в которой сходятся на перспективном изображении параллельные линии предмета. Одним из требований художников была возможность перетаскивать эти точки напрямую. Сначала было не совсем понятно, как реализовать такой функционал, однако вскоре выяснилось, что в однородных координатах точки схода выражаются элементарно:
Дальнейшие преобразования никак не изменяются.
Вместо заключения
Описанный функционал доступен в последний сборках Криты под Windows и в репозитариях Krita Lime для Ubuntu. Можно обновляться и рисовать!
Напоследок видео от Павла Гераськина, демонстрирующее возможности нового инструмента:
Автор: dkazakov-dev