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

стр.

>

>    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

>    cns.use_fixed_location = False

>    cns.forward_axis = 'FORWARD_Z'

>    cns.up_axis = 'UP_Y'

>    return


>if __name__ == "__main__":

>    run((0,0,0))

>    bpy.ops.screen.animation_play(reverse=False, sync=False)


Камера и освещение

Эта программа добавляет источник света "солнце" к сцене, и прожекторы (spot) для каждого объекта рендера на сцене. Каждый прожектор имеет ограничение TrackTo, заставляющее быть направленным на свой объект, тогда как солнце отслеживает центр всех объектов, визуализируемых на сцене.

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

># File camera.py

># Adds one camera and several lights

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

>import bpy, mathutils, math

>from mathutils import Vector

>from math import pi  


>def findMidPoint():

>    # Нахождение позиции середины всех визуализируемых объектов

>    sum = Vector((0,0,0))

>    n = 0

>    for ob in bpy.data.objects:

>        if ob.type not in ['CAMERA', 'LAMP', 'EMPTY']:

>            sum += ob.location

>            n += 1

>    if n == 0:

>        return sum

>    else:

>        return sum/n 


>def addTrackToConstraint(ob, name, target):

>    # Добавление ограничения TrackTo

>    cns = ob.constraints.new('TRACK_TO')

>    cns.name = name

>    cns.target = target

>    cns.track_axis = 'TRACK_NEGATIVE_Z'

>    cns.up_axis = 'UP_Y'

>    cns.owner_space = 'WORLD'

>    cns.target_space = 'WORLD'

>    return 


>def createLamp(name, lamptype, loc):

>    # Создание источника освещения

>    bpy.ops.object.add(

>        type='LAMP',

>        location=loc)

>    ob = bpy.context.object

>    ob.name = name

>    lamp = ob.data

>    lamp.name = 'Lamp'+name

>    lamp.type = lamptype

>    return ob 


>def createLamps(origin, target):

>    deg2rad = 2*pi/360


>    sun = createLamp('sun', 'SUN', origin+Vector((0,20,50)))

>    lamp = sun.data

>    lamp.type = 'SUN'

>    addTrackToConstraint(sun, 'TrackMiddle', target)


>    for ob in bpy.context.scene.objects:

>        if ob.type == 'MESH':

>            spot = createLamp(ob.name+'Spot', 'SPOT', ob.location+Vector((0,2,1)))

>            bpy.ops.transform.resize(value=(0.5,0.5,0.5))

>            lamp = spot.data


>            # Лампа

>            lamp.type = 'SPOT'

>            lamp.color = (0.5,0.5,0)

>            lamp.energy = 0.9

>            lamp.falloff_type = 'INVERSE_LINEAR'

>            lamp.distance = 7.5


>            # Форма луча прожектора

>            lamp.spot_size = 30*deg2rad

>            lamp.spot_blend = 0.3


>            # Тени

>            lamp.shadow_method = 'BUFFER_SHADOW'

>            lamp.use_shadow_layer = True