Шрифт:
Интервал:
Закладка:
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:
bpy.ops.object.shape_key_add(None)
topUp = ob.active_shape_key
topUp.name = 'TopUp' + suffix
if vgrp:
topUp.vertex_group = vgrp
for v in [0, 1, 9, 10, 17, 18, 25]:
pt = topUp.data[v].co
pt[2] = pt[2] + 1
# Установка позы ключам формы
for shape in ob.data.shape_keys.key_blocks:
shape.value = random.random()
return
if __name__ == "__main__":
# Создание пяти объектов с произвольными ключами формы
for j in range(5):
run((3*j,0,0))
Применение модификатора массива (array)Эта программа создает цепь из десяти звеньев. Звено является простым тором, масштабированным вдоль оси x. Мы добавляем звену модификатор массива, где смещение управляется пустышкой (empty). Наконец, модификатор массива применяется (apply), создавая из цепи единственный меш.
#----------------------------------------------------------
# File chain.py
# Creates an array modifier and applies it# Update to API rev. 36523
#----------------------------------------------------------
import bpy
import math
from math import pi
def run(origin):
# Добавление единственного звена цепи к сцене
bpy.ops.mesh.primitive_torus_add(
#major_radius=1,
#minor_radius=0.25,
major_segments=12,
minor_segments=8,
use_abso=True,
abso_major_rad=1,
abso_minor_rad=0.6,
location=(0,0,0),
rotation=(0,0,0))
# Масштабирование тора вдоль оси x
ob = bpy.context.object
ob.scale = (0.7, 1, 1)
bpy.ops.object.transform_apply(scale=True)
# Создание пустышки
bpy.ops.object.add(
type='EMPTY',
location=(0,1.2,0.2),
rotation=(pi/2, pi/4, pi/2))
empty = bpy.context.object
# Звено цепи снова делается активным
scn = bpy.context.scene
scn.objects.active = ob
# Добавление модификатора
mod = ob.modifiers.new('Chain', 'ARRAY')
mod.fit_type = 'FIXED_COUNT'
mod.count = 10
mod.use_relative_offset = 0
mod.use_object_offset = True
mod.offset_object = empty
# Применение модификатора
bpy.ops.object.visual_transform_apply()
bpy.ops.object.modifier_apply(apply_as='DATA', modifier='Chain')
# Перемещение цепи на место
bpy.ops.transform.translate(value=origin)
# Пустышка больше не нужна
scn.objects.unlink(empty)
del(empty)
return
if __name__ == "__main__":
run((0,3,0))
Арматуры
АрматураЭта программа создаёт арматуру.
#---------------------------------------------------
# File armature.py
#---------------------------------------------------
import bpy, math
from mathutils import Vector, Matrix
def createRig(name, origin, boneTable):
# Создание арматуры и объекта
bpy.ops.object.add(
type='ARMATURE',
enter_editmode=True,
location=origin)
ob = bpy.context.object
ob.show_x_ray = True
ob.name = name
amt = ob.data
amt.name = name+'Amt'
amt.show_axes = True
# Создание костей
bpy.ops.object.mode_set(mode='EDIT')
for (bname, pname, vector) in boneTable:
bone = amt.edit_bones.new(bname)
if pname:
parent = amt.edit_bones[pname]
bone.parent = parent
bone.head = parent.tail
bone.use_connect = False
(trans, rot, scale) = parent.matrix.decompose()
else:
bone.head = (0,0,0)
rot = Matrix.Translation((0,0,0)) # Матрица идентичности
bone.tail = Vector(vector) * rot + bone.head
bpy.ops.object.mode_set(mode='OBJECT')
return ob
def poseRig(ob, poseTable):
bpy.context.scene.objects.active = ob
bpy.ops.object.mode_set(mode='POSE')
deg2rad = 2*math.pi/360
for (bname, axis, angle) in poseTable:
pbone = ob.pose.bones[bname]
# Установка режима вращения в Euler XYZ (Эйлерово),
# легче для понимания, чем кватернионы по-умолчанию
pbone.rotation_mode = 'XYZ'
# Косяк в документации: Euler.rotate(angle,axis):
# оси в ['x','y','z'] а не ['X','Y','Z']
pbone.rotation_euler.rotate_axis(axis, angle*deg2rad)
bpy.ops.object.mode_set(mode='OBJECT')
return
def run(origo):
origin = Vector(origo)
# Таблица костей в форме (кость, родитель, вектор)
# Вектор дан в локальных координатах
boneTable1 = [
('Base', None, (1,0,0)),
('Mid', 'Base', (1,0,0)),
('Tip', 'Mid', (0,0,1))
]
bent = createRig('Bent', origin, boneTable1)
# Вторая оснастка является прямой линией, то есть кости проходят вдоль локальной оси Y
boneTable2 = [
('Base', None, (1,0,0)),
('Mid', 'Base', (0,0.5,0)),
('Mid2', 'Mid', (0,0.5,0)),
('Tip', 'Mid2', (0,1,0))
]
straight = createRig('Straight', origin+Vector((0,2,0)), boneTable2)
# Поза второй остнастки
poseTable2 = [
('Base', 'X', 90),
('Mid2', 'Z', 45),
('Tip', 'Y', -45)
]
poseRig(straight, poseTable2)
# Поза первой остнастки
poseTable1 = [
('Tip', 'Y', 45),
('Mid', 'Y', 45),
('Base', 'Y', 45)
]
- Программирование приложений для мобильных устройств под управлением Android. Часть 1 - Евгений Сенько - Программирование
- Краткое введение в программирование на Bash - Гарольд Родригес - Программирование
- Crystal Programming. Введение на основе проекта в создание эффективных, безопасных и читаемых веб-приложений и приложений CLI - Джордж Дитрих - Программирование
- C# для профессионалов. Том II - Симон Робинсон - Программирование
- Программирование на Python с нуля - Максим Кононенко - Программирование
- Генерация высококачественного кода для программ, написанных на СИ - Филипп Хислей - Программирование
- Фундаментальные алгоритмы и структуры данных в Delphi - Джулиан Бакнелл - Программирование
- MySQL 5.0. Библиотека программиста - Виктор Гольцман - Программирование
- QT 4: программирование GUI на С++ - Жасмин Бланшет - Программирование
- Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен - Программирование