Читаем Введение в написание скриптов на Питоне для Блендера 2.5x. Примеры кода онлайн бесплатно
Введение в написание скриптов на Питоне для Блендера 2.5x. Примеры кода
Третье издание, расширенное и обновлённое для Blender 2.57
Компьютеры и Интернет / Программирование / Книги по ITПримеры кода
Введение в написание скриптов на Питоне для Блендера 2.5x.
Третье издание, расширенное и обновлённое для Блендера 2.57
Thomas Larsson
14 Апреля 2011 г.
Перевод: Striver
С появлением у Блендера версий 2.5x, написание скриптов на Питоне получило новый уровень. Поскольку API Питона вплоть до Блендера 2.49 был не совсем полным и специальным, для API в Блендере 2.5x обязались предоставить доступ из Питона ко всем возможностям Блендера, полным и систематическим путём.
Тем не менее, кривая изучения этого удивительного инструмента может быть очень крутой. Цель этих заметок в том, чтобы упростить процесс изучения, предоставив скрипты примеров, которые иллюстрируют различные аспекты написания скриптов на Питоне в Блендере.
Блендер все еще находится в стадии переработки, и API Питона еще не совсем стабильно. В течение нескольких месяцев, которые прошли между первыми двумя изданиями этих заметок, API Питона подвергалось капитальным переделкам, ломающим все старые скрипты. Различия между вторым изданием (для 2.54.0) и настоящим третьим изданием (для Блендера 2.57.0) значительно менее драматические. Тем не менее, даже незначительные изменения в API могут остановить работу скриптов. Скрипты в этих заметках протестированы на Блендере 2.57.0 rev 35147 (эта информация доступна на экране заставки).
Поскольку Блендер 2.57 разрекламирован как первый стабильный выпуск, есть некоторая надежда, что API сможет оставаться стабильным в будущем. Следовательно есть приличный шанс, что скрипты в этих заметках останутся рабочими долгое время, но гарантий на это нет.
Охваченные темы входят в следующие категории:
• Создание и манипуляция данными. Большинство программ не слишком полезны, так как созданы только для иллюстрации концепций.
• Свойства, определяемые пользователем.
• Интерфейсы пользователя: панели, кнопки и меню.
• Превращение скриптов в аддоны Блендера, которые могут автоматически загружаться при старте Блендера.
• Скрипты, распространяемые в составе нескольких файлов.
• Симуляции частиц, волос, ткани, мягких тел, дыма, жидкости, и т.п..
• Ноды.
Каждый пример скрипта, за исключением многофайловых пакетов, является законченной программой. Он может быть скопирован и вставлен в Текстовый Редактор в Блендере, который можно найти на экране
Скрипты также доступны как отдельные файлы на Питоне, расположенные в каталоге scripts, который должен был поставляться в комплекте с этим файлом. Просто загрузите файл Питона в Текстовый редактор
Предполагается что скрипты расположены в каталоге batc.py, texture.py, и uvs.py), нужно соответственно исправить. Питон сообщит Вам, если он не найдёт важных файлов.
Возможно сделать пакетный запуск всех скриптов в каталогах object и simulation, загрузив и выполнив файл batch.py. Мы можем легко убедиться, что все скрипты работают правильно (или по крайней мере, что они не генерируют никаких ошибок), выполнив пакетный скрипт. Если случились проблемы, посмотрите в окно консоли для получения подробной информации.
Скрипты примеров — это только царапины на поверхности того, что можно сделать со скриптами на Питоне в Блендере 2.5x. Когда Вы начнёте писать ваши собственные скрипты, Вы несомненно захотите получить доступ к операторам и переменным, не упомянутым здесь. Есть несколько способов получить эту информацию.
• Главный источник информации — это Blender Python documentation. Эту страницу удобно открывать из меню
• Есть также официальный урок по написанию скриптов здесь Использование встроенных подсказок (tooltips). Например, удержание курсора мыши над опцией
Illuminates objects only on the same layer the lamp is on
Python: PointLamp.use_own_layer
(Освещение объектов только в том же слое, что включен у лампы)
Из этого мы заключаем, что эта опция доступна как lamp.use_own_layer, где lamp является данными активного объекта, то есть lamp = bpy.context.object.data
• Также существуют подсказки при добавлении
Construct an UV sphere mesh
Python: bpy.ops.primitive_uv_sphere_add
(Сконструировать меш UV-сферы)
Это сообщает нам, вызов какого оператора нужен для добавления примитива меша UV-сферы.
• Как только оператор выполнен, он оставляет след в окне сообщений на экране
bpy.ops.mesh.primitive_uv_sphere_add(segments=32, rings=16,
size=1, view_align=False, enter_editmode=False,
location=(0, 0, 0), rotation=(0, 0, 0), layer=(True, False, False,
False, False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False))
Когда мы добавляем UV-сферу из меню, у неё всегда есть 32 сегмента, 16 колец, и т.п.. Но несложно выяснить, как мы должны вызывать функцию, чтобы получить сферу с другими данными, например, 12 сегментов (segments), 6 колец (rings), радиус 3 (radius), и отцентрированную в (1, 1, 1):
bpy.ops.mesh.primitive_uv_sphere_add(
segments=12,
rings=6,
size=3,enter_editmode=True,
location=(1, 1, 1))
В окно сообщений записывается только выполненный оператор, а не, например, установленная величина.
В последних версиях Блендера, скриптовый след печатается в окне
• Учиться на программах других людей. Скрипты, которые поставляются встроенными с Блендером — большой источник вдохновения.
• Также процветает он-лайн сообщество людей, пишущих скрипты на Питоне в BlenderArtist
Эта программа создает два меша. Первый — закрытая пирамида, как с треугольными, так и с четырёхугольными гранями. Второй — проволочный треугольник. Имена обоих мешей отображаются. Треугольник сдвигается вбок, так чтобы его можно было увидеть рядом с пирамидой. Для этого требуется его выбрать.
#----------------------------------------------------------
# File meshes.py
#----------------------------------------------------------
import bpy
def createMesh(name, origin, verts, edges, faces):
# Создание меша и объекта
me = bpy.data.meshes.new(name+'Mesh')
ob = bpy.data.objects.new(name, me)
ob.location = origin
ob.show_name = True
# Привязка объекта к сцене
bpy.context.scene.objects.link(ob)
# Создание меша из передаваемых списков вершин, рёбер, граней.
# Или рёбра или грани должны быть [], иначе Вам нужны проблемы
me.from_pydata(verts, edges, faces)
# Обновляет меш с новыми данными
me.update(calc_edges=True)
return ob
def run(origin):
(x,y,z) = (0.707107, 0.258819, 0.965926)
verts1 = ((x,x,-1), (x,-x,-1), (-x,-x,-1), (-x,x,-1), (0,0,1))
faces1 = ((1,0,4), (4,2,1), (4,3,2), (4,0,3), (0,1,2,3))
ob1 = createMesh('Solid', origin, verts1, [], faces1)
verts2 = ((x,x,0), (y,-z,0), (-z,y,0))
edges2 = ((1,0), (1,2), (2,0))
ob2 = createMesh('Edgy', origin, verts2, edges2, [])
# Сдвигает второй объект с дороги
ob1.select = False
ob2.select = True
bpy.ops.transform.translate(value=(0,2,0))
return if __name__ == "__main__":
run((0,0,0))
Эта программа добавляет UV-сферу с двумя группами вершин (Left И Right) и четырьмя ключами формы.
#----------------------------------------------------------
# File shapekey.py
#----------------------------------------------------------
import bpy, random
def run(origin):
# Добавление UV-сферы
bpy.ops.mesh.primitive_uv_sphere_add(
segments=6, ring_count=5, size=1, location=origin)
ob = bpy.context.object
ob.name = 'ShapeKeyObject'
ob.show_name = True
# Создаёт левую (Left) и правую (Right) группы вершин
left = ob.vertex_groups.new('Left')
right = ob.vertex_groups.new('Right')
for v in ob.data.vertices:
if v.co[0] 0.001:
left.add([v.index], 1.0, 'REPLACE')
elif v.co[0] -0.001:
right.add([v.index], 1.0, 'REPLACE')
else:
left.add([v.index], 0.5, 'REPLACE')
right.add([v.index], 0.5, 'REPLACE')
# Добавление ключа Basis (базовый)
bpy.ops.object.shape_key_add(None)
basis = ob.active_shape_key
# Добавление ключа FrontForward:
# передние вершины сдвигаются на единицу вперёд
# Пределы изменения (Slider) от -1.0 до +2.0
bpy.ops.object.shape_key_add(None)
frontFwd = ob.active_shape_key
frontFwd.name = 'FrontForward'
frontFwd.slider_min = -1.0 frontFwd.slider_max = 2.0
for v in [19, 20, 23, 24]:
pt = frontFwd.data[v].co
pt[1] = pt[1] - 1
# Добавление ключей TopUp: верхние вершины перемещаются на единицу вверх.
# TopUp_L и TopUp_R влияют только на левые и правые половины, соответственно
keylist = [(None, ''), ('Left', '_L'), ('Right', '_R')]
for (vgrp, suffix) in keylist:





