Сначала мы вычисляем расстояние:
d1 = (vec(verts[a[0]]) - vec(verts[b[0]])).length + \
(vec(verts[a[1]]) – vec(verts[b[1]])).length
Затем мы проверяем с перевёрнутым ребром b, будет ли в результате расстояние короче:
d2 = (vec(verts[a[0]]) - vec(verts[b[1]])).length + \
(vec(verts[a[1]]) - vec(verts[b[0]])).length
if d2
b =(b[1],b[0])
d1 = d2
Если рассчитанное расстояние не самое короткое, мы откладываем ребро для следующей итерации, если оно не первое, с которым мы столкнулись:
if distance == None or d1
if best != None:
enot.append(best)
best = b
distance = d1
else:
enot.append(b)
Список отклонённых рёбер становится новым e2, затем мы заполняем список граней новой парой рёбер, и переходим к новой итерации по первому списку рёбер (a) – доп. пер.
e2 = enot
faces.append((a,best))
Наконец, мы преобразуем наш список граней, состоящий из кортежей двух рёбер, в список кортежей из четырех индексов:
return [(a[0],b[0],b[1],a[1]) for a,b in faces]
Есть много больше в этом скрипте, и мы вновь будем рассматривать creepycrawlies.py в следующей главе, где мы добавим модификаторы, группы вершин и арматуру к нашей модели. Иллюстрация показывает образцы бестиария, которые могут быть созданы скриптом.
Ослепите вашего босса - гистограммы в стиле Блендер
Чтобы доказать, что Блендер адаптируется ко многим задачам помимо интерактивного создания 3D-графики, мы покажем Вам, как импортировать внешние данные (электронная таблица в формате CSV) и автоматизировать задачу создания и рендеринга представленной в 3D гистограммы.
Идея в том, чтобы запустить Блендер с аргументами, указывающими ему запустить скрипт, который читает .csv файл, рендерит изображение и сохраняет это изображение по окончании. Чтобы это было возможным, нам нужен способ вызывать Блендер с правильными параметрами. Мы дойдём скоро до этого скрипта, но сначала давайте увидим, как передавать параметры в Блендер, чтобы он запускал скрипт на Питоне:
blender -P /full/path/to/barchart.py
Также возможно вместо этого запустить скрипт из текстового буфера внутри .blend файла по имени этого текстового буфера. Обратите внимание на порядок параметров в этому случае - сначала ставится имя .blend файла:
blender barchart.blend -P barchart.py
В противоположность тому, что описано в документации API, в Питоне мы можем просто получить доступ к аргументам командной строки следующим образом:
import sys
print sys.argv
Последний фрагмент выведет все аргументы, включая имя программы Блендера первым. Наш скрипт должен пропускать любые аргументы, предназначенные для самого Блендера при использовании этого списка. Любые аргументы, предполагаемые только для нашего скрипта, которые не должны быть интерпретированы самим Блендером, должны находится после аргумента конца-опций(end-of-options), двойного минуса (--).
Наконец, мы не хотим, чтобы Блендер появлялся и показывал графический интерфейс пользователя. Вместо этого, мы укажем ему работать в фоне и выйти по завершении. Это делается посредством прохождения опции -b. Задав всё это вместе, командная строка будет выглядеть похожей на это:
blender -b barchart.blend -P barchart.py –- data.csv
Если Блендер работает в фоновом режиме, Вы должныопределить .blend файл, в противном случае Блендер разрушится. Если мы должны определить .blend файл, мы так же хорошо можем использовать внутренний текст для нашего скрипта на Питоне, иначе нам пришлось бы держать два файла одновременно вместо одного.
Скрипт построения гистограммы
Здесь мы покажем важные части кода кусками (полный файл доступен как barchart.blend, который включает barchart.py как вложенный текст). Мы начинаем с создания нового объекта Мира и установки цветов его зенита и горизонта целиком в нейтральный белый (выделенная часть следующего кода):
if __name__ == '__main__':
w=World.New('BarWorld')
w.setHor([1,1,1])
w.setZen([1,1,1])
Затем, мы извлекаем последний аргумент, переданный в Блендер и проверяем является ли расширение файла тем же самым .csv . Реальный промышленный код должен, конечно, иметь более серьёзную проверку на ошибки:
Читать дальше