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

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):

    # Создание данных пути и объекта

    path = bpy.data.curves.new('MyPath', 'CURVE')

    pathOb = bpy.data.objects.new('Path', path)

    pathOb.location = origin

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

    # Настройка данных пути

    path.dimensions = '3D'

    path.use_path = True

    path.use_path_follow = True

    path.path_duration = 250

    # Добавление сплайна к пути

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

    spline.use_cyclic_u = True

    spline.use_endpoint_u = False

   # Добавление точек к сплайну

    pointTable = [(0,0,0,0), (1,0,3,0),

        (1,2,2,0), (0,4,0,0), (0,0,0,0)]

    nPoints = len(pointTable)

    spline.points.add(nPoints-1)

    for n in range(nPoints):

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

    # Добавление обезьяны

    bpy.ops.mesh.primitive_monkey_add()

    monkey = bpy.context.object

    # Добавление ограничения "следовать по пути" обезьяне

    cns = monkey.constraints.new('FOLLOW_PATH')

    cns.target = pathOb

    cns.use_curve_follow = True

    cns.use_curve_radius = True