Читаем Написание скриптов для Blender 2.49 полностью

Из схемы выше ясно, что расчет центра масс идет рука об руку с вычислением частичных объемов, так что имеет смысл переопределить функцию meshvolume() в следующую:

def meshvolume(me):

   volume = 0.0

   cm = vec((0,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

      avg_x = sum([f.v[i].co[0] for i in range(3)])/3.0

      avg_y = sum([f.v[i].co[1] for i in range(3)])/3.0

      centroid = vec((avg_x,avg_y,avg_z/2))

      if Nz < 0: cm -= partial_volume * centroid

      if Nz > 0: cm += partial_volume * centroid

   return volume,cm/volume

Добавленные или изменённые строки выделены

Некоторые замечания о точности

Хотя большинство из нас - художники, а не инженеры, мы все еще можем спросить, насколько точным является число, которое мы вычисляем для нашего объема или центра масс меша. Есть два вопроса для рассмотрения - существенная точность и вычислительная точность нашего алгоритма.

Существенная точность (Intrinsic accuracy) - это когда мы ссылаемся на рассмотрение того факта, что наша модель сделана из небольших многоугольников, которые аппроксимируют некоторую представляемую форму. При выполнении моделирования органических объектов это не имеет особого значения, если наша модель выглядит хорошо, она хорошая. Тем не менее, если мы пытаемся аппроксимировать некоторую идеальную форму, например сферу, полигональной моделью (скажем uv-сферой, или ico-сферой) найдется различие между рассчитанным объемом и известным объемом идеальной сферы. Мы можем улучшить эту аппроксимацию, увеличивая количество разбиений (или, что тоже самое, уменьшая размер полигонов), но мы никогда не сможем полностью устранить это различие, и используемый алгоритм для вычисления объема не сможет изменить это.

Вычислительная точность (Computational accuracy) имеет несколько аспектов. Во-первых, есть точность чисел, при расчетах с ними. На большинстве платформ, на которых Блендер работает, вычисления выполняются с использованием чисел с плавающей точкой двойной точности. Это соответствует приблизительно 17 цифрам точности и мы ничего не можем сделать, чтобы улучшить это.  К счастью, это более чем достаточная точность для работы.

Затем есть точность нашего алгоритма. Если вы посмотрите на код, вы увидите, что мы складываем и умножаем потенциально огромное количество величин, а типичная модель с высоким разрешением может содержать более 100 тысяч граней или даже миллион. Для каждой грани мы вычисляем объем спроецированного столба, и все эти объемы складываются (или вычитаются) вместе. Проблема в том, что эти объемы могут значительно отличиться по величине, не только потому, что площади граней могут отличаться, но особенно потому, что площади проекций вблизи вертикальной плоскости очень малы по сравнению теми, что близки к горизонтальной плоскости.

Теперь, если мы складываем очень большое и очень маленькое число с ограниченной точностью вычислений, мы потеряем маленькое число. Например, если наша точность должна быть ограничена тремя значимыми цифрами, при сложении 0.001 и 0.0001 мы должны получить 0.001, теряя эффект от маленького числа. Реально наша точность намного лучше (около 17 цифр), но мы и складываем намного больше, чем два числа. Однако, если мы осуществляем функцию volume(), используя один из приведенных алгоритмов, разница никогда не вырастет более чем до 1 миллиона, так что пока мы не начнём заниматься ядерной физикой в Блендере, нет необходимости беспокоиться. (Для тех кто всё-таки беспокоится, альтернатива приведена в скрипте как функция volume2(). Тем не менее, проследите за тем, чтобы Вы знаете, что Вы делаете).

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных