Получаем экранный Bounding Box для объекта в Blender

Для корректного расчета упрощенных взаимодействий между объектами обычно используются так называемые Bounding Box — параллелепипеды, которые своим объемом полностью охватывают всю геометрию меша. За счет того что такой параллелепипед имеет и использует для расчетов всего шесть точек, в отличие от самого меша, который может иметь миллионы точек, все вычисления производятся очень быстро. Встроенный Bounding Box есть у каждого объекта, и его отображение можно включить в параметрах меша. Этот Bounding Box работает в пространстве трехмерной сцены, а бывают случаи, когда нужно контролировать взаимодействие объектов в двухмерном пространстве экрана. Для вьюпорта предрасчитанных Bounding Box нет, однако при помощи Blender Python API мы можем получить его сами.

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

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

Обращаясь к объекту через полученный указатель object_evaluated мы можем получить координаты его точек, рассчитанные с учетом действия модификаторов и трансформаций.

Получим список глобальных координат нашего объекта. Для этого каждую координату перерасчитанного меша мы умножаем на его мировую матрицу трансформации.

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

Получим указатели на рабочую область, собственно вьюпорт, и его регион отрисовки.

Теперь получим экранные координаты для каждого вертекса нашего объекта.

Определим функцию, которая будет рассчитывать координаты Bounding Box на основании списка координат вертексов.

И сразу вызовем ее, передав в нее полученные экранные координаты объекта.

Функция возвращает четыре координаты. Это координаты двух точек главной диагонали рассчитанного Bounding Box. Из них мы легко можем получить координаты оставшихся двух точек Bounding Box.

Мы получили координаты Bounding Box для объекта в 3D вьюпорте. И далее мы можем использовать их в нужных нам расчетах.

Для наглядности и проверки правильности наших расчетов давайте отобразим во вьюпорте полученный экранный Bounding Box.

Для рисования во вьюпорте мы будем использовать модуль gpu.

Подготовим нужные для отрисовки данные. Нам требуются координаты четырех точек, по которым мы отрисуем наш Bounding Box.

Цвета для каждой из этих точек.

И шейдер для рисования.

Соберем все данные в пакет для отрисовки.

Определим функцию отрисовки и добавим ее в обработчик отрисовки вьюпорта. Так же перерисуем 3D вьюпорт, чтобы отрисованный нами Bounding Box сразу же отобразился на экране.

Теперь мы наглядно видим рамочку Bounding Box во вьюпорте для нашего объекта.

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

0 Комментарий
Новые
Старые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии