Создаем полигон в плоскости другого полигона через Blender Python API

При построении геометрии в Blender с использованием Blender Python API может понадобиться создать в текущем меше новый полигон, который лежит в той же самой плоскости, что и один из имеющихся уже в меше полигонов.

 

Для простоты будем считать, что мы находимся в режиме редактирования объекта и не переключаем режим работы с ним.

Для начала создадим объект BMesh и скопируем в него геометрию текущего активного меша. Также пересчитаем таблицу вертексов для правильной индексации.

Зададим начальные координаты для нового полигона. Пусть это будет квадрат с центром в точке (0.0, 0.0) и длиной стороны равной 2. Начальные координаты задаем в 2D пространстве плоскости самого полигона.

Чтобы оперировать с координатами меша в глобальной системе координат, получим указатель на матрицу трансформации нашего меша, а так же сделаем ее инвертированную копию.

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

Получим координаты трех точек полигона меша в глобальной системе координат.

Теперь мы на основании этих трех точек можем вычислить так называемый «базис» — матрицу трансформации, определенную по трем этим точкам.

Добавим в базис еще оффсет, чтобы начальная точка базиса совпадала бы с первой из трех точек нашего исходного полигона меша.

Теперь у нас есть готовая матрица трансформации для пересчета координат в плоскость исходного полигона.

Пересчитаем 2D координаты нашего нового полигона в 3D координаты по полученному базису.

Добавим в BMesh новые точки по вычисленным координатам.

И заполним их полигоном.

Для правильного отображения пересчитаем нормали.

На этом все. Теперь мы можем вернуть обновленную геометрию из объекта BMesh в базовый меш и очистить BMesh, который нам больше не нужен.

Таким образом мы построили в меше новый полигон, который лежит точно в плоскости исходного полигона, от которого мы взяли три точки.

Обратите внимание, что центр нового полигона лежит в точке исходного полигона с индексом 0, так как именно ее мы задали, как центр координатной системы в базисе.

0 0 голоса
Article Rating
Подписаться
Уведомить о
guest

0 Комментарий
Новые
Старые Популярные