Сопоставьте изображение/текстуру с заданной неровной поверхностью (футболка со складками, кружка и т. д.)

В основном я пытался добиться этого: наложить произвольное изображение на заранее заданную неровную поверхность. (См. примеры ниже).

Любое изображение--> введите здесь описание изображения

У меня нет большого опыта в обработке изображений или 3D-алгоритмах, поэтому вот лучший метод, который я могу придумать:

  1. Предопределить набор координат (скажем, если у нас есть сетка 10x10, у нас есть 100 координат, которые начинаются с (0,0), (0,10), (0,20), ... и т. д. Будет 9x9 = 81 сетки.
  2. Запишите преобразования для каждой отдельной координаты на изображении футболки, например. (0,0) становится (51,31), (0, 10) становится (51, 35) и т. д.
  3. Триангулируйте исходное изображение на 81x2=162 треугольника (по 2 треугольника на каждую сетку). Преобразуйте каждый треугольник изображения на основе преобразований координат, полученных на шаге 2, и нарисуйте его на изображении футболки.

Проблемы/вопросы, которые у меня есть:

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

Спасибо!


person settinghead    schedule 19.12.2012    source источник
comment
вы всегда можете увеличить разрешение и создать более мелкие треугольники: P Я думаю, вам нужен другой алгоритм вместо этой триангуляции. Что-то для сдвига и разрыва.   -  person Adrian    schedule 19.12.2012
comment
Вы можете просто использовать сплайн-интерполяцию из координат футболки в координаты текстуры. Таким образом, вы получаете плавное сопоставление каждого пикселя изображения футболки с изображением текстуры и можете просто искать текстуру для каждого пикселя. Однако не сработает для складок или окклюзий.   -  person Niki    schedule 19.12.2012


Ответы (2)


Это называется деформацией цифрового изображения. На нем был популярный графический текст в 1990-е (вероятно, из чьей-то диссертации). Вы также можете найти статью об этом от Dr. Журнал Добба.

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

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

person Adrian McCarthy    schedule 19.12.2012

На самом деле это не решение проблемы, это просто обходной путь:

Если у вас есть 3D-модель, представляющая футболку. вы можете использовать DirectX\OpenGL и поместить свое изображение в качестве текстуры футболки. Затем вы можете попросить его сделать изображение, которое вы хотите, с любой точки зрения.

person OopsUser    schedule 19.12.2012