Введение в написание скриптов на Питоне для Блендера 2.5x. Примеры кода - страница 12

стр.

>

>import bpy 


>def run(origin):

>    # Создание арматуры и объекта

>    amt = bpy.data.armatures.new('MyRigData')

>    rig = bpy.data.objects.new('MyRig', amt)

>    rig.location = origin

>    amt.show_names = True

>    # Привязка объекта к сцене

>    scn = bpy.context.scene

>    scn.objects.link(rig)

>    scn.objects.active = rig

>    scn.update()


>    # Создание костей

>    bpy.ops.object.mode_set(mode='EDIT')

>    base = amt.edit_bones.new('Base')

>    base.head = (0,0,0)

>    base.tail = (0,0,1)


>    tip = amt.edit_bones.new('Tip')

>    tip.head = (0,0,1)

>    tip.tail = (0,0,2)

>    tip.parent = base

>    tip.use_connect = True


>    driver = amt.edit_bones.new('Driver')

>    driver.head = (2,0,0)

>    driver.tail = (2,0,1)


>    bpy.ops.object.mode_set(mode='POSE')


>    # Добавление управляющего элемента для вращения по Z кости Tip

>    # Tip.rotz = 1.0 - 1.0*x, где x = Driver.locx

>    fcurve = rig.pose.bones["Tip"].driver_add('rotation_quaternion', 3)

>    drv = fcurve.driver

>    drv.type = 'AVERAGE'

>    drv.show_debug_info = True


>    var = drv.variables.new()

>    var.name = 'x'

>    var.type = 'TRANSFORMS'


>    targ = var.targets[0]

>    targ.id = rig

>    targ.transform_type = 'LOC_X'

>    targ.bone_target = 'Driver'

>    targ.use_local_space_transform = True


>    fmod = fcurve.modifiers[0]

>    fmod.mode = 'POLYNOMIAL'

>    fmod.poly_order = 1

>    fmod.coefficients = (1.0, -1.0)


>    # Добавление управляющего элемента для вращения по Z кости Base

>    # Base.rotz = z*z - 3*y, где y = Driver.locy и z = Driver.rotz

>    fcurve = rig.pose.bones["Base"].driver_add('rotation_quaternion', 3)

>    drv = fcurve.driver

>    drv.type = 'SCRIPTED'

>    drv.expression = 'z*z - 3*y'

>    drv.show_debug_info = True


>    var1 = drv.variables.new()

>    var1.name = 'y'

>    var1.type = 'TRANSFORMS'


>    targ1 = var1.targets[0]

>    targ1.id = rig

>    targ1.transform_type = 'LOC_Y'

>    targ1.bone_target = 'Driver'

>    targ1.use_local_space_transform = True


>    var2 = drv.variables.new()

>    var2.name = 'z'

>    var2.type = 'TRANSFORMS'


>    targ2 = var2.targets[0]

>    targ2.id = rig

>    targ2.transform_type = 'ROT_Z'

>    targ2.bone_target = 'Driver'

>    targ2.use_local_space_transform = True


>    return 


>if __name__ == "__main__":

>    run((0,0,0))




Другие типы данных

Текст

Эта программа добавляет текстовый объект в 3D-пространство и устанавливает некоторые атрибуты. Заметьте, что тип данных здесь используется TextCurve; тип Text применяется для текста в текстовом редакторе.



>#----------------------------------------------------------

># File text.py

>#----------------------------------------------------------

>import bpy

>import math from math

>import pi  


>def run(origin):

>    # Создание и именование объекта TextCurve

>    bpy.ops.object.text_add(

>        location=origin,

>        rotation=(pi/2,0,pi))

>    ob = bpy.context.object

>    ob.name = 'HelloWorldText'

>    tcu = ob.data

>    tcu.name = 'HelloWorldData'


>    # Атрибуты TextCurve

>    tcu.body = "Hello, world"

>    tcu.font = bpy.data.fonts[0]

>    tcu.offset_x = -9

>    tcu.offset_y = -0.25

>    tcu.shear = 0.5

>    tcu.size = 3

>    tcu.space_character = 2

>    tcu.space_word = 4


>    # Унаследованные атрибуты Curve (Кривая)

>    tcu.extrude = 0.2

>    tcu.use_fill_back = True

>    tcu.use_fill_deform = True

>    tcu.use_fill_front = True  


>if __name__ == "__main__":

>    run((0,0,0))


Слои

Эта программа иллюстрирует три метода установки объекта на новом слое:

1. Создать его на правильном слое.

2. Создать его в слое 1, и изменить Object.layer.

3. Создать его в слое 1, и использовать оператор для его перемещения.

Также показано, как изменять видимость слоёв.



>#----------------------------------------------------------

># File layers.py

>#----------------------------------------------------------

>import bpy 


>def createOnLayer(mat):

>    for n in range(3, 8):

>    # Создание n-угольника в слое n+11

>        layers = 20*[False]

>        layers[n+11] = True


>        bpy.ops.mesh.primitive_circle_add(

>            vertices=n,

>            radius=0.5,

>            fill=True,

>            view_align=True,

>            layers=layers,

>            location=(n-3,0,0)

>        )

>        bpy.context.object.data.materials.append(mat)