Шрифт:
Интервал:
Закладка:
Питон может преодолеть эти ограничения в ситуациях, когда нам нужны какие-либо специфические измерения, но мы не можем экспортировать нашу модель в САПР-программу. Практическим примером является вычисление объема меша. В настоящее время, множество компаний предлагают возможность восстановить вашу цифровую модель в виде объекта реального мира посредством методов 3D-печати. Я должен сказать, что это - особенное чувство, когда держишь пластиковую или даже металлическую копию вашей Блендер-модели в своих руках, это действительно добавляет целое новое измерение к 3D.
Сейчас основным компонентом цены 3D-печати модели является суммарный объём материала, который будет использован. Часто будет возможно разработать вашу модель как полый объект, который тратит меньше материала при производстве, но это очень неудобно - отправлять промежуточные версии вашей модели снова и снова, чтобы программное обеспечение изготовителя вычисляло объем и давало Вам ценовое предложение. Так что мы хотим иметь скрипт, который может вычислить объем меша достаточно точно.
Общий метод вычисления объема меша иногда именуется Формула Surveyor's (землемера), так как он связан со способом землемеров для вычисления объема холма или горы триангуляцией их поверхности.
Основная мысль в том, чтобы разбить триангулированный меш на множество колонн, которые имеют основание на плоскости xy.
Площадь поверхности треугольника проецируется на плоскость xy, умножается на среднюю координату z трех вершин - это даёт объем такой колонны. Суммирование по всем этим объемам даст в результате объем полного меша (смотри следующий рисунок).
Есть пара вещей, которые должны быть приняты во внимание. Во-первых, меш может оказаться расширенным вниз от плоскости xy. Если мы создаем колонну от грани, которая лежит ниже плоскости xy, произведение спроецированной площади и средней координаты z будет отрицательным числом, так что мы должны вычесть эту величину, чтобы получить объем.
Во-вторых, меш может лежать полностью или частично выше плоскости xy. Если мы взглянем на пример на рисунке сверху, мы увидим что объект имеет два треугольника, которые дают вклад в объем объекта, верхний и нижний (вертикальные треугольники имеют нулевую спроецированную площадь, так что они не дают никакого вклада). Так как обе верхняя и нижняя грани лежат выше плоскости xy, мы должны вычесть объем колонны, создаваемой от нижней грани из объёма, созданного верхней гранью. Если объект будет полностью ниже плоскости xy, он будет с другой стороны, и мы должны будем вычесть объем верхней колонны из объема нижней колонны.
Мы можем сказать, что действие, которое нужно выполнить, определяется направлением нормалей наших треугольников. Если, например, треугольник - выше плоскости xy, но его нормаль указывает вниз (она имеет отрицательный z-компонент), тогда мы должны вычесть рассчитанный объем. Следовательно важно, чтобы все нормали единообразно указывали наружу (в режиме редактирования выберите все грани и нажмите Ctrl + N).
Если мы принимаем во внимание все четыре возможности (нормаль грани направлена вверх или вниз, грань выше или ниже плоскости xy), мы можем написать следующую схему для нашей функции:
1. Убедиться, что у всех граней нормали единообразно указывают наружу.
2. Для всех граней
• Вычислить z-компоненту вектора нормали грани Nz
• Вычислить произведение P среднего числа z-координат и площади спроецированной поверхности.
• Если Nz положительно: прибавить P
• Если Nz отрицательно: вычесть P
Этот отличный алгоритм работает для простых объектов без отверстий так же, как и для объектов, содержащих отверстия (например, тор), или даже полых (то есть, содержащих объект, полностью заключенный в другом объекте), примеры приведены на следующем скриншоте:
Поскольку мы допускаем, что произведение площади и координаты z может быть отрицательным, мы должны проверять только на направления нормали грани, чтобы охватить все ситуации.
Заметьте, что для меша необходимо быть закрытым и быть многогранником (manifold): Там не должно быть никаких отсутствующих граней, а также не должно быть никаких рёбер, которые не разделяют ровно двух граней, таких, как внутренние грани.
Важная часть кода показана здесь (полный скрипт называется volume.py):
def meshvolume(me):
volume = 0.0
for f in me.faces:
xy_area = Mathutils.TriangleArea(vec(f.v[0].co[:2]),
vec(f.v[1].co[:2]),vec(f.v[2].co[:2]))
Nz = f.no[2]
avg_z = sum([f.v[i].co[2] for i in range(3)])/3.0
partial_volume = avg_z * xy_area
if Nz < 0: volume -= partial_volume
if Nz > 0: volume += partial_volume
return volume
Выделенный код показывает, как мы вычисляем площадь треугольника, спроектированного на плоскость xy. TriangleArea() вычислит область двумерного треугольника, если ему передать двух-мерные точки (точки на плоскости xy). Итак, мы не передаем полные координатные векторов вершин, но усекаем их (то есть, мы отбрасываем координату z) до двух-компонентных векторов.
После прогона скрипта из текстового редактора или из меню Scripts в режиме объектов, появляется сообщение, показывающее объем в единицах Блендера. Прежде, чем выполнять скрипт, убедитесь, что все модификаторы применены, масштабирование и вращение применено (Ctrl + A в режиме объектов), меш полностью триангулирован (Ctrl + T в режиме редактирования), и, что меш является закрытым многогранником (manifold), проверив на non-manifold рёбра (Ctrl + Alt + Shift +M в режиме выбора рёбер). Рёбра manifold являются рёбрами, которые используются в точности двумя гранями. Также убедитесь, что все нормали указывают в правильном направлении. Применение модификаторов необходимо сделать, чтобы меш стал закрытым (если это - модификатор зеркальности mirror) и, чтобы сделать вычисление объема точным (если это - модификатор subsurface).
Определение центра масс меша
При печати трехмерного объекта в пластмассе или металле, возможно, всплывёт невинный на вид вопрос, как только мы создадим нашу первую игрушку, основанную на созданном нами меше; где его центр масс? Если наша модель имеет ноги, и мы не хотим, чтобы она неожиданно упала, лучше бы центр масс находился где-нибудь над её ногами, и, по возможности внизу, чтобы она держалась стабильно. Схематически это показано на картинке:
Как только мы узнали, как определять объем меша, мы можем взять оттуда и по-новой использовать многие концепции для разработки скрипта, определяющего центр масс. Нам необходимо знать два дополнительных момента для вычисления позиции центра масс:
• Центры массы проецированных объемов мы построим при расчете объема меша
• Как складывать рассчитанные центры масс всех этих индивидуальных объемов
Все это допускает, что твердые части нашего меша имеют однородную плотность. Меш может иметь любую форму или даже быть полым, но для твердых частей принимается, что их плотность однородна. Это разумное предположение для материалов, осаждаемых 3D-принтерами.
Первый вопрос заключает в себе немного геометрии: спроецированный объем - по существу треугольная колонна (или треугольная призма), закрытая, возможно, наклонной треугольной гранью. Расчет центра масс можно сделать следующим образом: координаты x и y центра масс являются координатами x и y центра спроецированного треугольника на плоскость xy - это просто среднее арифметическое координат x и y соответственно трех точек задающих треугольную грань. Координата z центра масс - это половина средней высоты нашей спроецированной колонны. Это - среднее арифметическое z-координат трех точек треугольной грани, поделенное на два.
К сожалению, такой простой расчет средних значений координат не даст точного положения центра масс, в отличие от расчета объёма в предыдущем разделе. Этот вопрос заключает в себе не «немного геометрии», а много матана. Точный расчет включает в себя, как минимум, вычисление двойного интеграла по площади спроецированного треугольника (для расчета ЦМ произвольного трёхмерного тела необходим тройной интеграл). Формулы расчета координат ЦМ есть, например, в этой книге: http://www.toroid.ru/zaporojecGI.html, стр. 281, пример расчета для похожей призмы (правда, с квадратным основанием) на стр. 285. Совпадение результатов применяемого автором метода с точным возможно только в случае горизонтальности треугольной грани, в остальных случаях будет присутствовать погрешность. Конечно, если площадь треугольника мала, а высота столба много больше любой из сторон этого треугольника (обычная ситуация в высокополигональном меше), то погрешность будет небольшой, однако она всё равно во много раз больше, чем погрешности, обсуждаемые в следующем разделе. — наглая отсебятина переводчика.
- 33 лучшие программы для ноутбука. Популярный самоучитель - Владимир Пташинский - Программы
- Защита вашего компьютера - Сергей Яремчук - Программы
- Delphi. Трюки и эффекты - Валерий Борисок - Программы
- Google Таблицы. Это просто. Функции и приемы - Евгений Намоконов - Программы
- 200 лучших программ для Linux - Сергей Яремчук - Программы