KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Программирование » Thomas Larsson - Введение в написание скриптов на Питоне для Блендера 2.5x. Примеры кода

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

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Thomas Larsson, "Введение в написание скриптов на Питоне для Блендера 2.5x. Примеры кода" бесплатно, без регистрации.
Перейти на страницу:

    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  


def createCurveObject(bevob):

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

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

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

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


    # Настройка некоторых атрибутов

    cu.bevel_object = bevob

    cu.dimensions = '3D'

    cu.use_fill_back = True

    cu.use_fill_front = True

    ob.show_name = True


    # Координаты Безье

    beziers = [

        ((-1.44,0.20,0.00), (-1.86,-0.51,-0.36), (-1.10,0.75,0.28)),

        ((0.42,0.13,-0.03), (-0.21,-0.04,-0.27), (1.05,0.29,0.21)),

        ((1.20,0.75,0.78), (0.52,1.36,1.19), (2.76,-0.63,-0.14)) ]


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

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

    nPointsU = len(beziers)

    spline.bezier_points.add(nPointsU)

    for n in range(nPointsU):

        bpt = spline.bezier_points[n]

        (bpt.co, bpt.handle_left, bpt.handle_right) = beziers[n]

    return ob 


def run(origin):

    bevob = createBevelObject()

    bevob.location = origin


    curveob = createCurveObject(bevob)

    curveob.location = origin

    bevob.select = False

    curveob.select = True

    bpy.ops.transform.translate(value=(2,0,0))

    return


if __name__ == "__main__":

   run((0,0,0))


Типы кривых

Эта программа иллюстрирует различие между типами кривых: POLY, NURBS и BEZIER.



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

# File curve_types.py

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

import bpy

from math import sin, pi


# Poly (многоугольник) и nurbs

def makePolySpline(cu):

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

    cu.dimensions = '3D'

    addPoints(spline, 8)  


def makeNurbsSpline(cu):

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

    cu.dimensions = '3D'

    addPoints(spline, 4)

    spline.order_u = 3

    return spline 


def addPoints(spline, nPoints):

    spline.points.add(nPoints-1)

    delta = 1/(nPoints-1)

    for n in range(nPoints):

        spline.points[n].co = (0, n*delta, sin(n*pi*delta), 1)


  # Безье

def makeBezierSpline(cu):

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

    cu.dimensions = '3D'

    order = 3

    addBezierPoints(spline, order+1)

    spline.order_u = order 


def addBezierPoints(spline, nPoints):

    spline.bezier_points.add(nPoints-1)

    bzs = spline.bezier_points

    delta = 1/(nPoints-1)

    for n in range(nPoints):

        bzs[n].co = (0, n*delta, sin(n*pi*delta))

        print(bzs[n].co)

    for n in range(1, nPoints):

        bzs[n].handle_left = bzs[n-1].co

    for n in range(nPoints-1):

        bzs[n].handle_right = bzs[n+1].co

    return spline


# Создание кривой с объектом и привязка к сцене

def makeCurve(name, origin, dx):

    cu = bpy.data.curves.new('%sCurve' % name, 'CURVE')

    ob = bpy.data.objects.new('%sObject' % name, cu)

    (x,y,z) = origin ob.location = (x+dx,y,z)

    ob.show_name = True

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

    return cu 


def run(origin):

    polyCurve = makeCurve("Poly", origin, 0)

    makePolySpline(polyCurve)

    nurbsCurve = makeCurve("NurbsEnd", origin, 1)

    spline = makeNurbsSpline(nurbsCurve)

    spline.use_endpoint_u = True

    nurbsCurve = makeCurve("NurbsNoend", origin, 2)

    spline = makeNurbsSpline(nurbsCurve)

    spline.use_endpoint_u = False

    bezierCurve = makeCurve("Bezier", origin, 3)

    makeBezierSpline(bezierCurve)

    return


if __name__ == "__main__":

    run((0,0,0))


Путь

Эта программа добавляет путь и обезьяну с ограничением "следовать по пути" (follow path).



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

# File path.py

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

import bpy 


def run(origin):

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*