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

Заметьте, что встроенный в Блендер инструмент выбора острых рёбер (sharp edges) (Ctrl + Alt + Shift + S) делает нечто другое, несмотря на свое название; он выбирает те рёбра, которые используются точно двумя гранями, и угол контакта между ними меньше, чем некоторая минимальная величина, или, другими словами, выбираются рёбра между гранями, которые сравнительно плоские.

Мы уже видели, что модуль Блендера Mathutils имеет функцию, вычисляющую угол, так что наш код является очень кратким, так как реальную работу делает единственная функция, показанная ниже. (Полный скрипт предоставлен как sharpfaces.py.)

def sharpfaces(me,minimum_angle):

   for face in me.faces:

      n = len(face.verts)

      edges = [face.verts[(i+1)%n].co - face.verts[i].co 

               for i in range(n)]

      for i in range(n):

         a = AngleBetweenVecs(-edges[i],edges[(i+1)%n])

         if a < minimum_angle :

            face.sel = 1

            break

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

Различие проиллюстрировано на следующем рисунке:

<p>Выбор вершин со множеством рёбер</p>

В идеале меш должен содержать грани, которые состоят из только четырех вершин (эти грани обычно именуются  quads — четырёхугольники), и у них должны быть относительно одинаковые размеры. Такая конфигурация оптимальна при деформации меша, что часто бывает необходимо в анимации. Конечно, нет ничего действительно ужасного в трехсторонних гранях (tris), но в общих чертах  лучше избегать их, поскольку небольшие треугольные грани всё портят при применении модификатора subsurface, заставляя его показывать неприглядную рябь.

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

Выбор полюсов

Для того чтобы выбрать вершины с определённого числа шагов, мы можем выполнить следующие шаги:

1. Независимо проверить, что активный объект - это меш.

2. Независимо убедиться, что мы - в режиме объектов.

3. Показать всплывающее меню для ввода минимального количества рёбер.

4. Для каждой вершины:

• Итерация по всем рёбрам, подсчет вхождений вершины

• Если счет - больше или равен минимуму, выбрать вершину

Этот метод - прямой и простой. Функция, которая ответственна за фактическую работу, показана ниже (полный скрипт называется poleselect1.py). Она близко следует нашей схеме. Фактический выбор вершин осуществляется путем присвоения атрибуту вершины sel. Заметим также, что атрибуты v1 и v2 объекта ребра не являются индексами в атрибуте verts нашего меша, а ссылаются на объекты MVert. Вот почему нам нужно извлекать атрибуты index для сравнения.

def poleselect1(me,n=5):

   for v in me.verts:

      n_edges=0

      for e in me.edges:

         if e.v1.index == v.index or

                    e.v2.index == v.index:

            n_edges+=1

            if n_edges >= n:

               v.sel = 1

               break

Выбор полюсов, ещё раз

Вы вероятно обратили внимание, что мы повторяли обход списка рёбер по новой для каждой вершины (выделено в предыдущем коде). Это может быть дорого с точки зрения производительности и эта стоимость даже усложнена необходимостью сравнивать индексы, которые нужно извлекать снова и снова. Возможно ли написать более эффективный код, который, тем не менее, останется удобочитаемым? Да, если мы будем следовать этой стратегии:

1. Независимо проверить, что активный объект - это меш.

2. Независимо убедиться, что мы - в режиме объектов.

3. Показать всплывающее меню для ввода минимального количества рёбер.

4. Инициализировать словарь, проиндексированный индексом вершин, который будет содержать счетчики рёбер.

5. Повторять цикл по всем рёбрам (обновлять счет для обеих вершин, на которые ссылается ребро).

6. Повторять цикл по всем элементам словаря (если счет - больше или равен минимуму, выбираем вершину).

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

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

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

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

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

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

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

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

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