Написание скриптов для Blender 2.49 - страница 27

стр.



Во-вторых, меш может лежать полностью или частично выше плоскости 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).


Определение центра масс меша

При печати трехмерного объекта в пластмассе или металле, возможно, всплывёт невинный на вид вопрос, как только мы создадим нашу первую игрушку, основанную на созданном нами меше; где его центр масс? Если наша модель имеет ноги, и мы не хотим, чтобы она неожиданно упала, лучше бы центр масс находился где-нибудь над её ногами, и, по возможности внизу, чтобы она держалась стабильно. Схематически это показано на картинке: