Копирование в ракурсе с коррекцией края

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

  Наверное, такие возможности есть и в других программах, я не очень хорошо об этом знаю, но у меня, как мне кажется, это получилось неплохо.
  Среди описанных задач есть и поворот изображения в ракурсе. Конечно повернуть плоское изображение в ракурсе невозможно, но можно его исказить, так, чтобы создать иллюзию такого поворота. Результат вы можете видеть на иллюстрации.
  Поворот в ту или другую сторону регулируется движками, раздельно по координатам X и Y. Движок включается кнопочкой справа от него, а чёрточкой, показывающей на отклонение регулятора от центра, выставляется величина ракурса - от нулевой до максимальной.

  Образец для копирования выделяется на рисунке тонкой пунктирной рамочкой, так, как это показано на иллюстрации, и представляет собой прямоугольник, ограниченный координатами X2-X3 и Y2-Y3, белый цвет считается прозрачным, и пиксели этого цвета не копируются.
  Если регуляторы выключены, или чёрточки на них находятся в центре, то цвет для копирования берётся от оригинала в том месте, на которое указывают координаты X,Y. Но если движок, например по Х, включён, и задаёт некий ракурс R, то тогда цвет пикселя для аппликации берётся с другого места – с места Х1=f(X,R), где f – функция, осуществляющая пересчёт координаты Х.
  Для простоты рассуждений проведём линейные преобразования и приведём -прямоугольник X2,Y2-X3,Y3 к квадрату с единичной стороной 0,0-1,1. Так же, на единицу, нормируем и значение ракурса – ракурс у нас будет принимать значения от -1 до 1. И примем
   Х1=Х   для ракурса 0
   Х1=Х^2 для ракурса 1
В первом случае это прямая линия, а во втором, это парабола. В остальных же случаях будем брать среднее значение между ними. Что получается, показано на иллюстрации слева синими и красными кривыми – от максимального ракурса постепенно переходим к прямой линии и от неё к ракурсу в другую сторону.

  Всё это получается хорошо, но вот незадача – у изображения в ракурсе имеется сильно растянутый край, на котором кудри развиваются как по ветру. Чтобы подрезать этот край снова применяется перевычисляющая координаты функция, но уже другая, типа
    Х1=Х1/(1-Х), где Х уже не координата нашей точки, а её расстояние от центра изображения, а чтобы при подрезании учитывался ракурс, можно функцию записать так - Х1=Х1/(1-Х*R) или так Х1=Х1/(1-Х*R/2), вдвое приуменьшив влияние ракурса.
  Эксперимент однако показал, что влияние ракурса лучше не приуменьшать, а наоборот, вдвое увеличить. Эти и те кривые приведены в средней части иллюстрации для сравнения.    

  По этой схеме и были сделаны аппликации, приведённые на иллюстрации справа. Кудри на них тоже развиваются, но в меру.

__________
10.08.2023


Рецензии