Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² написаниС скриптов Π½Π° ΠŸΠΈΡ‚ΠΎΠ½Π΅ для Π‘Π»Π΅Π½Π΄Π΅Ρ€Π° 2.5x. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΊΠΎΠ΄Π°Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 2

Автор Thomas Larsson

    ob = bpy.data.objects.new(name, me)

    ob.location = origin

    ob.show_name = True

    # ΠŸΡ€ΠΈΠ²ΡΠ·ΠΊΠ° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΊ сцСнС

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


    # Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ мСша ΠΈΠ· ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Ρ… списков Π²Π΅Ρ€ΡˆΠΈΠ½, Ρ€Ρ‘Π±Π΅Ρ€, Π³Ρ€Π°Π½Π΅ΠΉ.

# Или Ρ€Ρ‘Π±Ρ€Π° ΠΈΠ»ΠΈ Π³Ρ€Π°Π½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ [], ΠΈΠ½Π°Ρ‡Π΅ Π’Π°ΠΌ Π½ΡƒΠΆΠ½Ρ‹ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹

    me.from_pydata(verts, edges, faces)


    # ΠžΠ±Π½ΠΎΠ²Π»ΡΠ΅Ρ‚ мСш с Π½ΠΎΠ²Ρ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ

    me.update(calc_edges=True)

    return ob


def run(origin):

    (x,y,z) = (0.707107, 0.258819, 0.965926)

    verts1 = ((x,x,-1), (x,-x,-1), (-x,-x,-1), (-x,x,-1), (0,0,1))

    faces1 = ((1,0,4), (4,2,1), (4,3,2), (4,0,3), (0,1,2,3))

    ob1 = createMesh('Solid', origin, verts1, [], faces1)

    verts2 = ((x,x,0), (y,-z,0), (-z,y,0))

    edges2 = ((1,0), (1,2), (2,0))

    ob2 = createMesh('Edgy', origin, verts2, edges2, [])


    # Π‘Π΄Π²ΠΈΠ³Π°Π΅Ρ‚ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ с Π΄ΠΎΡ€ΠΎΠ³ΠΈ

    ob1.select = False

    ob2.select = True

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


return if __name__ == "__main__":

    run((0,0,0))


Π“Ρ€ΡƒΠΏΠΏΡ‹ Π²Π΅Ρ€ΡˆΠΈΠ½ ΠΈ ΠΊΠ»ΡŽΡ‡ΠΈ Ρ„ΠΎΡ€ΠΌΡ‹

Π­Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° добавляСт UV-сфСру с двумя Π³Ρ€ΡƒΠΏΠΏΠ°ΠΌΠΈ Π²Π΅Ρ€ΡˆΠΈΠ½ (Left И Right) ΠΈ Ρ‡Π΅Ρ‚Ρ‹Ρ€ΡŒΠΌΡ ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ Ρ„ΠΎΡ€ΠΌΡ‹.



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

# File shapekey.py

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

import bpy, random


def run(origin):

    # Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ UV-сфСры

    bpy.ops.mesh.primitive_uv_sphere_add(

        segments=6, ring_count=5, size=1, location=origin)

    ob = bpy.context.object

    ob.name = 'ShapeKeyObject'

    ob.show_name = True


    # Π‘ΠΎΠ·Π΄Π°Ρ‘Ρ‚ Π»Π΅Π²ΡƒΡŽ (Left) ΠΈ ΠΏΡ€Π°Π²ΡƒΡŽ (Right) Π³Ρ€ΡƒΠΏΠΏΡ‹ Π²Π΅Ρ€ΡˆΠΈΠ½

    left = ob.vertex_groups.new('Left')

    right = ob.vertex_groups.new('Right')

    for v in ob.data.vertices:

        if v.co[0] > 0.001:

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

        elif v.co[0] < -0.001:

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

        else:

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

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


    # Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π° Basis (Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ)

    bpy.ops.object.shape_key_add(None)

    basis = ob.active_shape_key


    # Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π° FrontForward:

    # ΠΏΠ΅Ρ€Π΅Π΄Π½ΠΈΠ΅ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ ΡΠ΄Π²ΠΈΠ³Π°ΡŽΡ‚ΡΡ Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ Π²ΠΏΠ΅Ρ€Ρ‘Π΄

    # ΠŸΡ€Π΅Π΄Π΅Π»Ρ‹ измСнСния (Slider) ΠΎΡ‚ -1.0 Π΄ΠΎ +2.0

    bpy.ops.object.shape_key_add(None)

    frontFwd = ob.active_shape_key

    frontFwd.name = 'FrontForward'

    frontFwd.slider_min = -1.0 frontFwd.slider_max = 2.0

    for v in [19, 20, 23, 24]:

        pt = frontFwd.data[v].co

        pt[1] = pt[1] - 1


    # Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ TopUp: Π²Π΅Ρ€Ρ…Π½ΠΈΠ΅ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ Π²Π²Π΅Ρ€Ρ….

    # TopUp_L ΠΈ TopUp_R Π²Π»ΠΈΡΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° Π»Π΅Π²Ρ‹Π΅ ΠΈ ΠΏΡ€Π°Π²Ρ‹Π΅ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρ‹, соотвСтствСнно

    keylist = [(None, ''), ('Left', '_L'), ('Right', '_R')]

    for (vgrp, suffix) in keylist:

        bpy.ops.object.shape_key_add(None)

        topUp = ob.active_shape_key

        topUp.name = 'TopUp' + suffix

        if vgrp:

            topUp.vertex_group = vgrp

        for v in [0, 1, 9, 10, 17, 18, 25]:

            pt = topUp.data[v].co

            pt[2] = pt[2] + 1


    # Установка ΠΏΠΎΠ·Ρ‹ ΠΊΠ»ΡŽΡ‡Π°ΠΌ Ρ„ΠΎΡ€ΠΌΡ‹

    for shape in ob.data.shape_keys.key_blocks:

        shape.value = random.random()

    return


if __name__ == "__main__":

    # Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ пяти ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ Ρ„ΠΎΡ€ΠΌΡ‹

    for j in range(5):

        run((3*j,0,0))


ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° массива (array)

Π­Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° создаСт Ρ†Π΅ΠΏΡŒ ΠΈΠ· дСсяти звСньСв. Π—Π²Π΅Π½ΠΎ являСтся простым Ρ‚ΠΎΡ€ΠΎΠΌ, ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ вдоль оси x. ΠœΡ‹ добавляСм Π·Π²Π΅Π½Ρƒ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ массива, Π³Π΄Π΅ смСщСниС управляСтся ΠΏΡƒΡΡ‚Ρ‹ΡˆΠΊΠΎΠΉ (empty). НаконСц, ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ массива примСняСтся (apply), создавая ΠΈΠ· Ρ†Π΅ΠΏΠΈ СдинствСнный мСш.



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

# File chain.py

# Creates an array modifier and applies it# Update to API rev. 36523

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

import bpy

import math

from math import pi


def run(origin):

# Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ СдинствСнного Π·Π²Π΅Π½Π° Ρ†Π΅ΠΏΠΈ ΠΊ сцСнС

    bpy.ops.mesh.primitive_torus_add(

        #major_radius=1,

        #minor_radius=0.25,

        major_segments=12,

        minor_segments=8,

        use_abso=True,

        abso_major_rad=1,

        abso_minor_rad=0.6,

        location=(0,0,0),

        rotation=(0,0,0))


    # ΠœΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚ΠΎΡ€Π° вдоль оси x

    ob = bpy.context.object

    ob.scale = (0.7, 1, 1)

    bpy.ops.object.transform_apply(scale=True)


    # Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΡƒΡΡ‚Ρ‹ΡˆΠΊΠΈ

    bpy.ops.object.add(

        type='EMPTY',

        location=(0,1.2,0.2),

        rotation=(pi/2, pi/4, pi/2))

    empty = bpy.context.object


    # Π—Π²Π΅Π½ΠΎ Ρ†Π΅ΠΏΠΈ снова дСлаСтся Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΌ

    scn = bpy.context.scene

    scn.objects.active = ob


    # Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°

    mod = ob.modifiers.new('Chain', 'ARRAY')

    mod.fit_type = 'FIXED_COUNT'

    mod.count = 10

    mod.use_relative_offset = 0

    mod.use_object_offset = True

    mod.offset_object = empty


    # ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°

    bpy.ops.object.visual_transform_apply()

    bpy.ops.object.modifier_apply(apply_as='DATA', modifier='Chain')


    # ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ Ρ†Π΅ΠΏΠΈ Π½Π° мСсто

    bpy.ops.transform.translate(value=origin)


    # ΠŸΡƒΡΡ‚Ρ‹ΡˆΠΊΠ° большС Π½Π΅ Π½ΡƒΠΆΠ½Π°

    scn.objects.unlink(empty)

    del(empty)


    return


if __name__ == "__main__":

    run((0,3,0))


Арматуры

Арматура

Π­Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° создаёт Π°Ρ€ΠΌΠ°Ρ‚ΡƒΡ€Ρƒ.



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

# File armature.py

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

import bpy, math

from mathutils import Vector, Matrix


def createRig(name, origin, boneTable):

    # Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π°Ρ€ΠΌΠ°Ρ‚ΡƒΡ€Ρ‹ ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°

    bpy.ops.object.add(

        type='ARMATURE',

        enter_editmode=True,

        location=origin)

    ob = bpy.context.object

    ob.show_x_ray = True

    ob.name = name

    amt = ob.data

    amt.name = name+'Amt'

    amt.show_axes = True


    # Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ костСй

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

    for (bname, pname, vector) in boneTable:

        bone = amt.edit_bones.new(bname)

        if pname:

            parent = amt.edit_bones[pname]

            bone.parent = parent

            bone.head = parent.tail

            bone.use_connect = False

            (trans, rot, scale) = parent.matrix.decompose()

        else:

            bone.head = (0,0,0)

            rot = Matrix.Translation((0,0,0)) # ΠœΠ°Ρ‚Ρ€ΠΈΡ†Π° идСнтичности

        bone.tail = Vector(vector) * rot + bone.head

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

    return ob


def poseRig(ob, poseTable):

    bpy.context.scene.objects.active = ob

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

    deg2rad = 2*math.pi/360


    for (bname, axis, angle) in poseTable:

        pbone = ob.pose.bones[bname]

        # Установка Ρ€Π΅ΠΆΠΈΠΌΠ° вращСния Π² Euler XYZ (Π­ΠΉΠ»Π΅Ρ€ΠΎΠ²ΠΎ),

        # Π»Π΅Π³Ρ‡Π΅ для понимания, Ρ‡Π΅ΠΌ ΠΊΠ²Π°Ρ‚Π΅Ρ€Π½ΠΈΠΎΠ½Ρ‹ ΠΏΠΎ-ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

        pbone.rotation_mode = 'XYZ'

        # Косяк Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ: Euler.rotate(angle,axis):

        # оси Π² ['x','y','z'] Π° Π½Π΅ ['X','Y','Z']

        pbone.rotation_euler.rotate_axis(axis, angle*deg2rad)

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

    return


def run(origo):

    origin = Vector(origo)

    # Π’Π°Π±Π»ΠΈΡ†Π° костСй Π² Ρ„ΠΎΡ€ΠΌΠ΅ (ΠΊΠΎΡΡ‚ΡŒ, Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ, Π²Π΅ΠΊΡ‚ΠΎΡ€)

    # Π’Π΅ΠΊΡ‚ΠΎΡ€ Π΄Π°Π½ Π² Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°Ρ…

    boneTable1 = [

        ('Base', None, (1,0,0)),

        ('Mid', 'Base', (1,0,0)),

        ('Tip', 'Mid', (0,0,1))

    ]

    bent = createRig('Bent', origin, boneTable1)


    # Вторая оснастка являСтся прямой Π»ΠΈΠ½ΠΈΠ΅ΠΉ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ кости проходят вдоль локальной оси Y

    boneTable2 = [

        ('Base', None, (1,0,0)),

        ('Mid', 'Base', (0,0.5,0)),

        ('Mid2', 'Mid', (0,0.5,0)),

        ('Tip', 'Mid2', (0,1,0))

    ]

    straight = createRig('Straight', origin+Vector((0,2,0)), boneTable2)


    # Поза Π²Ρ‚ΠΎΡ€ΠΎΠΉ остнастки

    poseTable2 = [

        ('Base', 'X', 90),

        ('Mid2', 'Z', 45),

        ('Tip', 'Y', -45)

    ]

    poseRig(straight, poseTable2)


    # Поза ΠΏΠ΅Ρ€Π²ΠΎΠΉ остнастки

    poseTable1 = [

        ('Tip', 'Y', 45),

        ('Mid', 'Y', 45),

        ('Base', 'Y', 45)

    ]