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


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

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

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



    Математика преобразования


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



    Эта матрица состоит из восьми значащих элементов (масштабы-повороты (), смещения (), перспектива ()) и одного масштабного коэффициента. Таким образом, чтобы однозначно задать преобразование, нам нужно иметь 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. Можно обновляться и рисовать!

    Напоследок видео от Павла Гераськина, демонстрирующее возможности нового инструмента:

    • +16
    • 11,9k
    • 2

    Krita Foundation

    34,00

    Компания

    Поделиться публикацией

    Похожие публикации

    Комментарии 2
      +1
      И всё-таки штуки вроде krita пугают. Ну зачем ей 330Мб места после распаковки всех библиотек? Жуть. soprano-daemon, ruby, plasma-scriptengine-javascript, vlc-plugin-pulse, ntfs-3g, libssh-4, sgml-data, libqtwebkit4

      Чёрт, мы точно про программу рисования говорим?
        0
        Сам пакет Криты занимает около 110Мб, остальное — зависимости, в том числе транзитивные от kdelibs.

        Мы говорим не о «программе для рисования», а «программе для профессиональных художников», которая поддерживает множество современных технологий и база кода которой составляет более 700 тысяч строк кода.

        Простой пример. Есть библиотека libpigmentcms.so. Она производит все низкоуровневые операции с цветом: смешение, конвертация и т.д. Ей требуется обрабатывать данные со скоростью порядка 0.5-0.9Гб в секунду. Естественно, для обеспечения такой скорости мы используем векторные инструкции процессоров Intel. Однако у каждого процессора, поддерживаемый набор инструкций разный, поэтому эта библиотека имеет около 5 копий одного и того же кода, каждая из которых собрана с разными ключами. Одна для SSE2, другая для SSE3, и так до AVX2. Эти копии все вместе могут занимать около 10Мб.

        По поводу зависимостей kdelibs скажу лишь, что KF5 будет иметь лучшую модульность и мы будем зависеть только от KF5 Tier1.

      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

      Самое читаемое