Трехмерная триангуляция рисунка жирным карандашом
Мы в Les Fées Spéciales любим карандаш Blender Grease Pencil. Он не только позволяет рисовать и анимировать в 2D, но также позволяет делать это в 3D прямо в сцене Blender.
Тогда почему бы не использовать его для рисования 3D-поверхностей? С помощью нескольких штрихов мы могли бы, например, заполнить 3D-анимацию элементами FX. В этой области мы реализовали алгоритм для триангуляции штрихов жирным карандашом.
Подробнее
Эта статья существует на французском языке / существует статья во французском языке.
Пример трехмерного штриха жирным карандашом в Blender
Эта система поднимает вопрос триангуляции, потому что нарисованные штрихи могут быть неплоскими, а камера может быть не направлена вперед к рисунку. На самом деле, каждый штрих жирным карандашом имеет триангуляцию, доступную из API Python.
Однако предложенная триангуляция имеет плохое качество сетки: многие треугольники вырождены, и часто появляются разрывы, когда граница штриха не плоская. Одна из основных причин заключается в том, что сетка не содержит других вершин, кроме границы.
Возможный способ улучшить эту триангуляцию — разделить каждый треугольник, добавив его барицентр к набору вершин. С помощью нескольких операторов Blender мы можем украсить лица и преобразовать треугольники в четырехугольники, когда это возможно. Тем не менее, нет гарантии качества полученной сетки.
В этом посте мы представляем метод, который мы реализовали для решения этой проблемы. Этот метод не нов, он вдохновлен научной литературой по этой теме, которая цитируется в тексте. Примечательно, что аналогичный метод использовался для триангуляции сетей кривых [Stanko et al. 16].
Обзор метода триангуляции
Локальный кадр
Во-первых, нам нужно вычислить локальный кадр, в котором мы можем выполнить нашу двумерную триангуляцию. Мы находим нормаль наиболее подходящей плоскости, вычисляя собственные векторы ковариационной матрицы точек. Если вы не знакомы с ними, не беспокойтесь, библиотека numpy все равно вычислит их для нас. Идея состоит в том, что собственные векторы ковариационной матрицы образуют набор векторов, которые ортогональны в трехмерном пространстве и указывают направления от наименьшего к наибольшему расхождению точек. Мы выбираем направление, в котором точки изменяются меньше всего, чтобы быть нормалью к плоскости.
# Барицентр и координаты центра бар = барицентр (верт) x = np.asarray([v - полоса для v в вершинах]) # Ковариационная матрица и собственные значения M = np.cov(x.T) собственные значения, собственные векторы = np.linalg.eig(M)# Локальный фрейм # u : направление наибольшего отклонения координат # n : направление наименьшего отклонения координат # => нормаль плоскости фитинга # v : вектор, ортогональный как u, так и n u = вектор (собственные векторы [:, собственные значения.argmax()]) n = вектор (собственные векторы [:, собственные значения.argmin()]) v = n.cross(u)
Теперь у нас есть ортонормированная система отсчета, означающая 3 единичных вектора (u,v,n), которые ортогональны, и местное начало координат Ω, которое вычисляется как барицентр всех точек штриха. Мы можем переключить любую координату точки из глобального (мирового) пространства в локальное пространство репера, используя матрицу изменения базиса M = [u v n] по следующей формуле.
2D-триангуляция
Теперь мы можем вычислить координаты 2D-проекции для каждой точки кривой, просто взяв первые две координаты (˜x, ˜y) локальной системы отсчета. Затем мы используем библиотеку Triangle для вычисления двумерной триангуляции. Эта библиотека Python основана на алгоритме и коде C, созданном Джонатаном Шевчуком [Shewchuk 96]. Его можно легко установить с помощью pip :
pip install треугольник
Как вы можете прочитать в документации, многие параметры могут быть переданы в функцию triangulate
. Мы используем параметры -p
, -q
и -a0.05
:
треугольник.triangulate(strokes, 'pqa0.05')
Первый параметр -p
означает «Плоская прямая линия». График’. Мы используем его, потому что он позволяет учитывать вогнутые формы. Без него триангуляция покрывает выпуклую оболочку точек, как в этом примере:
Второй параметр позволяет поддерживать углы треугольников выше 20 градусов. Без этого мы можем получить вытянутые треугольники, подобные этим:
Триангуляция без параметра -q Наконец, мы определяем максимальную площадь поверхности с параметром -a
. Здесь мы выбираем 0,05 произвольно, но этот параметр можно менять в зависимости от размера объекта жирного карандаша или сцены.
Подъем сетки в 3D
Теперь у нас есть сетка с двумерными вершинами в локальной системе координат, которую мы вычислили ранее. Мы можем вычислить координаты этих вершин в мировом пространстве, используя обратное уравнение. Та же самая сетка теперь выражается с 3D-координатами в плоскости, в лучшем случае соответствующей обводке. Если обводка должна быть плоской, то наша работа выполнена, потому что сетка должна соответствовать границам и иметь правильную топологию, к которой мы стремимся. В противном случае нам потребуется дополнительный шаг, чтобы граничные вершины меша соответствовали обводке, сохраняя при этом хорошее качество меша. Более конкретно, мы хотели бы сохранить поверхность гладкой от разрывов.
Минимальные поверхности
Обратите внимание, что существует множество способов расчета гладкой сетки, соответствующей трехмерным границам. Нам нужен критерий, чтобы вести наши вычисления. Здесь мы используем так называемую лапласовскую минимизацию, которая представляет собой процесс оптимизации для минимизации средней кривизны поверхности. Полученная сетка представляет собой приблизительную минимальную поверхность.
Чтобы получить более наглядное представление о том, что представляет собой минимальная поверхность, представьте, что штрихи жирного карандаша — это провода, которые вы опускаете в мыльную воду. Пузырьковая мембранная оболочка вокруг проводов представляет собой минимальную поверхность. См. например это.
Реализация
Технические детали метода можно найти в [Botsch and Sorkine 07]. Вот попытка подвести итог, используя как можно меньше непонятных математических уравнений.
У нас есть входные данные трехмерной плоской триангуляции, что означает набор из n вершин { v i = (x i , y i , z i ) } i∈{0..n-1 } вместе с треугольными гранями. Мы хотим изменить эту сетку так, чтобы она соответствовала штриху жирного карандаша, сохраняя при этом минимальную среднюю кривизну. Мы формулируем этот вопрос как задача минимизации наименьших квадратов , что означает, что мы задаем набор неизвестных x и набор линейных ограничений, выраженных в виде матриц A и b, и решаем систему Ax=b. Здесь наши неизвестные значения представляют собой набор n 3D-смещений d i = (dx i , dy i , dz i ), которые нужно применить к каждой вершине сетки, чтобы получить нашу результирующую поверхность.
Матрицы A и b определяют набор ограничений вида: a 0 k *d 0 + .
. .. a n-1 k *d n-1 = b k
Такая система может быть решена с помощью функции разрешения наименьших квадратов linalg.lstsq, которая возвращает значения x, удовлетворяющие в лучшем случае равенству Ax = b. В нашем случае мы можем вычислить результирующую сетку, переместив каждую вершину триангуляции на полученное смещение d i .
Обратите внимание, что равенство Ax = b может быть недостижимо, поскольку некоторые ограничения могут конфликтовать. Метод наименьших квадратов возвращает значения, минимизирующие ∑ к || ∑ i a i k d i -b k || 2
.
Таким образом, минимизация Лапласа выражается через значения матриц A и b. Идея состоит в том, чтобы минимизировать среднюю кривизну поверхности в каждой вершине сетки. Средняя кривизна аппроксимируется дискретизацией оператора Лапласа-Бельтрами, основанного на площади Вороного вершин (площади близкого соседства каждой вершины сетки).
Результатом является матричный набор ограничений формы:
(-k s L s + k b L s M -1 s M -1 L ) 0,
где :
– k s , k b – веса растяжения и смешивания (в нашей реализации оба установлены на 0,5),
– M – диагональная матрица, содержащая площадь Вороного каждой вершины,
– L s – матрица коэффициентов {ω ij } для i≠j и {-∑ k≠i ω ki } по диагонали,
– и ω ij = 0,5*( cotan α ij + cotan β ij ) если ( , j) — смежные вершины сетки, где ( α ij , β ij ) — углы, противоположные ребру (i,j), а ω ij = 0 в противном случае.
Подробнее см. в документе.
Это дает нам хорошую основу для системы наименьших квадратов, которая минимизирует среднюю кривизну сетки, где A = (-k s L s + k b L s M -1 L s ), и b = 0. они есть. Действительно, изначально триангуляция плоская, а значит, ее средняя кривизна уже минимальна, она везде равна 0. Нам нужно граничное ограничение, чтобы уравновесить лапласову минимизацию и заставить вершины границы отойти от плоскости, содержащей триангуляцию.
Есть два способа добавить граничное ограничение в систему:
1. Мягкое ограничение .
Добавим несколько строк к матрицам A и b, чтобы учесть дополнительные ограничения вида: i — координаты вершины плоской триангуляции, а b i — координаты соответствующей вершины на границе.
2. Жесткое ограничение.
В качестве альтернативы мы можем считать, что вершины, принадлежащие границе, не являются неизвестными в системе, а являются фиксированными значениями. В этом случае не нужно добавлять строки в матрицы, а переставить столбцы так, чтобы все коэффициенты, соответствующие граничным вершинам, были перемещены в правую часть уравнения. Таким образом, в матрице A меньше столбцов, потому что меньше неизвестных переменных.
Мы реализовали оба метода и не заметили разницы в производительности в тех примерах, которые у нас были. Теоретически второй вариант должен быть лучшим, поскольку он гарантирует идеальное соответствие границы и уменьшает размер системы.
Результаты
Результаты удовлетворяют нашим требованиям: для большинства кривых сетка регулярна, а граница всегда подобрана. С помощью нескольких модификаторов вы можете добавить толщину и некоторый скос, чтобы получить 3D-элементы для интеграции в 3D-анимации, подобные этим.
Ограничения возникают в основном, когда проекция входной кривой на аппроксимируемую плоскость самоперекрывается. В этом случае сетка теряет качества топологии, которые она приобрела в результате двумерной триангуляции, как в примере выше.
В настоящее время наш алгоритм также не работает с дырами. С точки зрения производительности наиболее затратной частью алгоритма является оптимизация по Лапласу. Таким образом, важно выполнять его только в том случае, если входная кривая действительно не плоская.
Как получить?
Реализация триангуляции бесплатна и доступна на GitLab: https://gitlab.com/lfs.coop/blender/gp-triangulation.
Обратите внимание, что код для выполнения триангуляции + лапласианской оптимизации (почти) содержится в файле laplacian.py и в функция laplacian_triangulation
(для ее работы необходимы некоторые функции из файла utils.py).
Ссылки
[Stanko et al. 16] Станко, Т., Хаманн, С., Бонно, Г. П., и Сагин-Спрынски, Н. (2016). Поверхностные кривые сети с нормальным управлением. Компьютеры и графика , 60 , 1-8.
[Шевчук 96] Шевчук, Дж. Р. (1996, май). Треугольник: разработка генератора сетки 2D-качества и триангулятора Делоне. В Практикум по прикладной вычислительной геометрии (стр. 203-222). Шпрингер, Берлин, Гейдельберг.
[Ботш и Соркин 07] Ботч, М., и Соркин, О. (2007). О линейных вариационных методах поверхностного деформирования. Транзакции IEEE по визуализации и компьютерной графике , 14 (1), 213-230.
Невероятные 3D рисунки карандашом |
Бен Хайне
Автор Валентина Романо
Сегодняшняя статья The Golden Scope посвящена некоторым действительно невероятным и увлекательным произведениям искусства.
Следующие рисунки, нарисованные простым карандашом на простом листе бумаги, могут показать, как что-то без размеров может выглядеть как трехмерный объект!
Рисунок Алессандро Дидди. Поэтому мы решили показать их всех и скомпилировать их работы вместе, демонстрируя различные стили и изображенные предметы.
Рисунок Фредо
Художники, которые будут представлены в этой статье: Рамон Брюин, Алессандро Дидди, Фредо, Джулия Баринова, Мухаммад Эджлех Карменхара, Вамос Арт, Хидеюки и Серый Капюшон . Все эти люди приехали из разных уголков мира, и, несмотря на это, все они разделяют одинаковый интерес и навыки в 3D-рисовании.
Рисунок Хидедзюки Нагаи
Как вы заметили, все художники делают рисунки, похожие на статуи и/или настоящие вещи.