- Любовные романы
- Фантастика и фэнтези
- Ненаучная фантастика
- Ироническое фэнтези
- Научная Фантастика
- Фэнтези
- Ужасы и Мистика
- Боевая фантастика
- Альтернативная история
- Космическая фантастика
- Попаданцы
- Юмористическая фантастика
- Героическая фантастика
- Детективная фантастика
- Социально-психологическая
- Боевое фэнтези
- Русское фэнтези
- Киберпанк
- Романтическая фантастика
- Городская фантастика
- Технофэнтези
- Мистика
- Разная фантастика
- Иностранное фэнтези
- Историческое фэнтези
- LitRPG
- Эпическая фантастика
- Зарубежная фантастика
- Городское фентези
- Космоопера
- Разное фэнтези
- Книги магов
- Любовное фэнтези
- Постапокалипсис
- Бизнес
- Историческая фантастика
- Социально-философская фантастика
- Сказочная фантастика
- Стимпанк
- Романтическое фэнтези
- Ироническая фантастика
- Детективы и Триллеры
- Проза
- Юмор
- Феерия
- Новелла
- Русская классическая проза
- Современная проза
- Повести
- Контркультура
- Русская современная проза
- Историческая проза
- Проза
- Классическая проза
- Советская классическая проза
- О войне
- Зарубежная современная проза
- Рассказы
- Зарубежная классика
- Очерки
- Антисоветская литература
- Магический реализм
- Разное
- Сентиментальная проза
- Афоризмы
- Эссе
- Эпистолярная проза
- Семейный роман/Семейная сага
- Поэзия, Драматургия
- Приключения
- Детская литература
- Загадки
- Книга-игра
- Детская проза
- Детские приключения
- Сказка
- Прочая детская литература
- Детская фантастика
- Детские стихи
- Детская образовательная литература
- Детские остросюжетные
- Учебная литература
- Зарубежные детские книги
- Детский фольклор
- Буквари
- Книги для подростков
- Школьные учебники
- Внеклассное чтение
- Книги для дошкольников
- Детская познавательная и развивающая литература
- Детские детективы
- Домоводство, Дом и семья
- Юмор
- Документальные книги
- Бизнес
- Работа с клиентами
- Тайм-менеджмент
- Кадровый менеджмент
- Экономика
- Менеджмент и кадры
- Управление, подбор персонала
- О бизнесе популярно
- Интернет-бизнес
- Личные финансы
- Делопроизводство, офис
- Маркетинг, PR, реклама
- Поиск работы
- Бизнес
- Банковское дело
- Малый бизнес
- Ценные бумаги и инвестиции
- Краткое содержание
- Бухучет и аудит
- Ораторское искусство / риторика
- Корпоративная культура, бизнес
- Финансы
- Государственное и муниципальное управление
- Менеджмент
- Зарубежная деловая литература
- Продажи
- Переговоры
- Личная эффективность
- Торговля
- Научные и научно-популярные книги
- Биофизика
- География
- Экология
- Биохимия
- Рефераты
- Культурология
- Техническая литература
- История
- Психология
- Медицина
- Прочая научная литература
- Юриспруденция
- Биология
- Политика
- Литературоведение
- Религиоведение
- Научпоп
- Психология, личное
- Математика
- Психотерапия
- Социология
- Воспитание детей, педагогика
- Языкознание
- Беременность, ожидание детей
- Транспорт, военная техника
- Детская психология
- Науки: разное
- Педагогика
- Зарубежная психология
- Иностранные языки
- Филология
- Радиотехника
- Деловая литература
- Физика
- Альтернативная медицина
- Химия
- Государство и право
- Обществознание
- Образовательная литература
- Учебники
- Зоология
- Архитектура
- Науки о космосе
- Ботаника
- Астрология
- Ветеринария
- История Европы
- География
- Зарубежная публицистика
- О животных
- Шпаргалки
- Разная литература
- Зарубежная литература о культуре и искусстве
- Пословицы, поговорки
- Боевые искусства
- Прочее
- Периодические издания
- Фанфик
- Военное
- Цитаты из афоризмов
- Гиды, путеводители
- Литература 19 века
- Зарубежная образовательная литература
- Военная история
- Кино
- Современная литература
- Военная техника, оружие
- Культура и искусство
- Музыка, музыканты
- Газеты и журналы
- Современная зарубежная литература
- Визуальные искусства
- Отраслевые издания
- Шахматы
- Недвижимость
- Великолепные истории
- Музыка, танцы
- Авто и ПДД
- Изобразительное искусство, фотография
- Истории из жизни
- Готические новеллы
- Начинающие авторы
- Спецслужбы
- Подростковая литература
- Зарубежная прикладная литература
- Религия и духовность
- Старинная литература
- Справочная литература
- Компьютеры и Интернет
- Блог
Написание скриптов для Blender 2.49 - Michel Anders
Шрифт:
Интервал:
Закладка:
Второй вопрос заключен главным образом в здравом смысле: даны две массы m1 и m2 с их центрами масс в v1 и v2 соответственно, их комбинированный центр масс является средне взвешенным. То есть, центр масс - пропорционально ближе к центру масс тяжелого компонента.
Конечно, это у нас теперь здравый смысл, но кто-то вроде Архимеда должен был увидеть, где здесь действительно здравый смысл. После нахождения этого 'закона рычагов' (как он назвал это), он не кричал "эврика!" и не бегал голым, так что потребовалось отчасти больше времени для привлечения внимания.
Давайте поместим всю эту информацию в рецепт, которому мы можем последовать:
1. Убедиться, что у всех граней нормали единообразно указывают наружу.
2. Для всех граней:
• Вычислить z-компоненту вектора нормали грани Nz
• Вычислить произведение P среднего числа z-координат и площади спроецированной поверхности.
• Вычислить ЦМ(x, y, z) с x, y, как среднее от спроецированных координат x, y, и z как (среднее число z-координат грани)/2
• Если Nz положителен: прибавить P, умноженное на ЦМ
• Если Nz отрицателен: отнять P, умноженное на ЦМ
Из схемы выше ясно, что расчет центра масс идет рука об руку с вычислением частичных объемов, так что имеет смысл переопределить функцию 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(). Тем не менее, проследите за тем, чтобы Вы знаете, что Вы делаете).
Питон способен работать с числами потенциально бесконечного размера и точности, но это значительно медленнее, чем выполнение нормальных вычислений с плавающей точкой. Функции и классы, предоставляемые в Mathutils, первоначально закодированы в C для скорости и ограничены числами с плавающей точкой двойной точности. Смотри http://code.activestate.com/recipes/393090/, http://code.activestate.com/recipes/298339/ или Раздел 18.5 Поваренной книги Питона, 2-е издания, O'Reilly для некоторых других методов и математической подготовки.
Растущий подсолнечник - присвоение родителей и группирование объектов
Создание сложнособранных объектов автоматизируется достаточно легко, но мы хотели бы обеспечить конечного пользователя способами выбирать все эти связанные объекты, чтобы затем перемещать их вместе. Этот раздел показывает, как мы можем этого достичь, создавая группы и назначая родителей объектам. В результате в конце у Вас будет связка милых подсолнухов.
ГруппыГруппы разработаны, чтобы облегчить выбор или манипуляцию более, чем один объектом одновременно. Иногда такое поведение является частью большей схемы. Арматура, например - набор костей, но зато такие наборы имеют очень специфические отношения (у костей в арматуре точно определены отношения между собой).
Есть много ситуаций, где мы хотели бы идентифицировать связку объектов, как причастных друг к другу без специфических отношений. Блендер предоставляет два типа групп, чтобы помочь нам определить их свободные отношения: группы объектов (или просто группы) для именованных наборов объектов, и группы вершин для именованных наборов вершин внутри меш-объектов.
Группы объектов позволяют нам выбирать иначе не связанный набор объектов, которые мы добавили к группе (мы могли бы сгруппировать меш, арматуру, и несколько пустышек вместе, например). Групповое отношение отличается от отношений родитель-ребенок. Группы просто позволяют нам выбирать объекты, а объекты, имеющие родителей, перемещаются вслед за их родителем, если его перемещают. Функциональность определения и манипулирования группами предоставлена в модуле Group и его идентично названным классом (группа - это просто тоже тип объекта в Блендере, но он содержит список ссылок на другие объекты, но не на другие группы, к несчастью). Вы можете, например, добавить группу из внешнего .blend файла точно так же, как Лампу или Меш. Следующая таблица включает некоторые часто используемые операции с группами (смотри модуль Blender.Group в документации API Блендера для дополнительной функциональности):
Операция
group=Group.New(name='aGroupName')
Действие
Создаёт новую группу
Операция
group=Group.Get(name='aGroupName')
Действие
Получить ссылку на группу по имени
Группы вершин являются удобным путем идентифицировать группы связанных вершин (как, например, ухо или нога в модели игрушки), но они имеют свою область применения за рамками простого выбора. Их можно использовать для определения влияния деформаций костями или для идентификации по имени регионов эмиттеров для каждой из нескольких систем частиц. На группах вершин мы сфокусируемся в следующей главе.
Отношения родитель-потомокВоспитание детей в реальной жизни может быть труднее в разы, но в Блендере это довольно легко, хотя он иногда удивляет разнообразием вариантов на выбор. Родителем объекта можно назначить другой объект, единственную кость в арматуре, или, одну или три вершины в меш-объекте. Следующая таблица показывает важные методы (Посмотрите Blender.Object в API Блендера для дополнительной функциональности):

