Выбрать главу

   # Таблица членов групп

 members = {

 redGrp : [redCube, redSphere, redText],

 greenGrp : [greenCube, greenSphere, greenText],

 cubeGrp : [redCube, greenCube, cubeText],

 sphereGrp : [redSphere, greenSphere, sphereText] }

    # Привязка объектов к группам

    for group in members.keys():

        for ob in members[group]:

            group.objects.link(ob)

    # Список пустышек

    empties = [

        ('RedEmpty', origin, redGrp),

        ('GreenEmpty', dy, greenGrp),

        ('CubeEmpty', 2*dy, cubeGrp),

        ('SphereEmpty', 3*dy, sphereGrp) ]

    # Создание пустышек и размещение их в слое отображения (Display)

    scn = bpy.context.scene

    for (name, loc, group) in empties:

        empty = bpy.data.objects.new(name, None)

        empty.location = loc

        empty.name = name

        empty.dupli_type = 'GROUP'

        empty.dupli_group = group

        scn.objects.link(empty)

        moveToLayer(empty, Display)

    # Слой отображения назначается активным слоем

    scn.layers[Display] = True

    for n in range(20):

        if n != Display:

            scn.layers[n] = False

    return

if __name__ == "__main__":

    run()

Решётка (Lattice)

Эта программа добавляет ico-сферу, деформированную решёткой. Модификатор решётки действует только на группу вершин в верхней половине сферы.

#----------------------------------------------------------

# File lattice.py

#----------------------------------------------------------

import bpy 

def createIcoSphere(origin):

    # Создание ico-сферы

    bpy.ops.mesh.primitive_ico_sphere_add(location=origin)

    ob = bpy.context.object

    me = ob.data

    # Создание групп вершин

    upper = ob.vertex_groups.new('Upper')

    lower = ob.vertex_groups.new('Lower')

    for v in me.vertices:

        if v.co[2] > 0.001:

            upper.add([v.index], 1.0, 'REPLACE')

        elif v.co[2] < -0.001:

            lower.add([v.index], 1.0, 'REPLACE')

        else: upper.add([v.index], 0.5, 'REPLACE')

            lower.add([v.index], 0.5, 'REPLACE')

    return ob 

def createLattice(origin):

    # Создание решётки и объекта

    lat = bpy.data.lattices.new('MyLattice')

    ob = bpy.data.objects.new('LatticeObject', lat)

    ob.location = origin ob.show_x_ray = True

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

    scn = bpy.context.scene

    scn.objects.link(ob)

    scn.objects.active = ob

    scn.update()

    # Установка атрибутов решётки

    lat.interpolation_type_u = 'KEY_LINEAR'

    lat.interpolation_type_v = 'KEY_CARDINAL'

    lat.interpolation_type_w = 'KEY_BSPLINE'

    lat.use_outside = False

    lat.points_u = 2

    lat.points_v = 2 lat.points_w = 2

    # Расстановка точек решётки

    s = 1.0

    points = [

        (-s,-s,-s), (s,-s,-s), (-s,s,-s), (s,s,-s),

        (-s,-s,s), (s,-s,s), (-s,s,s), (s,s,s)

    ]

    for n,pt in enumerate(lat.points):

        for k in range(3):

            pt.co_deform[k] = points[n][k]

            pass

    return ob  

def run(origin):

    sphere = createIcoSphere(origin)

    lat = createLattice(origin)

    # Создание модификатора решётки

    mod = sphere.modifiers.new('Lat', 'LATTICE')

    mod.object = lat

    mod.vertex_group = 'Upper'

    # Решётка в режиме редактирования для лёгкого деформирования

    bpy.context.scene.update()

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

    return

if __name__ == "__main__":

    run((0,0,0))

Кривая

Эта программа добавляет кривую Безье. Она также добавляет круг Nurbs, который используется как bevel-объект.

#----------------------------------------------------------

# File curve.py

#----------------------------------------------------------

import bpy 

def createBevelObject():

    # Создание Bevel-кривой и объекта

    cu = bpy.data.curves.new('BevelCurve', 'CURVE')

    ob = bpy.data.objects.new('BevelObject', cu)

    bpy.context.scene.objects.link(ob)

    # Настройка некоторых атрибутов cu.dimensions = '2D'

    cu.resolution_u = 6

    cu.twist_mode = 'MINIMUM'

    ob.show_name = True

    # Координаты управляющих точек

    coords = [

        (0.00,0.08,0.00,1.00),

        (-0.20,0.08,0.00,0.35),

        (-0.20,0.19,0.00,1.00),

        (-0.20,0.39,0.00,0.35),

        (0.00,0.26,0.00,1.00),

        (0.20,0.39,0.00,0.35),

        (0.20,0.19,0.00,1.00),

        (0.20,0.08,0.00,0.35)

    ]

    # Создание сплайна и установка управляющих точек

    spline = cu.splines.new('NURBS')

    nPointsU = len(coords)

    spline.points.add(nPointsU)

    for n in range(nPointsU):

        spline.points[n].co = coords[n]

    # Настройка атрибутов сплайна. Точки, вероятно, должны существовать к этому моменту.

    spline.use_cyclic_u = True

    spline.resolution_u = 6

    spline.order_u = 3

    return ob