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

стр.

>

>                    if rot90:

>                        (index, mode, sign) = channelZup(word)

>                    else:

>                        (index, mode, sign) = channelYup(word)

>                    if mode != oldmode:

>                        indices = []

>                        node.channels.append((mode, indices))

>                        oldmode = mode

>                    indices.append((index, sign))

>            elif key == '{':

>                level += 1

>            elif key == '}':

>                level -= 1

>                node = node.parent

>            else:

>                raise NameError("Did not expect %s" % words[0])

>        elif status == Motion:

>            if key == 'FRAMES:':

>                nFrames = int(words[1])

>            elif key == 'FRAME' and words[1].upper() == 'TIME:':

>                frameTime = float(words[2])

>                frameTime = 1

>                status = Frames

>                frame = 0

>                t = 0

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

>                pbones = rig.pose.bones

>                for pb in pbones:

>                    pb.rotation_mode = 'QUATERNION'

>        elif status == Frames:

>            addFrame(words, frame, nodes, pbones, scale)

>            t += frameTime

>            frame += 1


>    fp.close()

>    time2 = time.clock()

>    print("Bvh file loaded in %.3f s" % (time2-time1))

>    return rig 


>#

># channelYup(word):

># channelZup(word):

># 


>def channelYup(word):

>    if word == 'Xrotation':

>        return ('X', Rotation, +1)

>    elif word == 'Yrotation':

>        return ('Y', Rotation, +1)

>    elif word == 'Zrotation':

>        return ('Z', Rotation, +1)

>    elif word == 'Xposition':

>        return (0, Location, +1)

>    elif word == 'Yposition':

>        return (1, Location, +1)

>    elif word == 'Zposition':

>        return (2, Location, +1)  


>def channelZup(word):

>    if word == 'Xrotation':

>        return ('X', Rotation, +1)

>    elif word == 'Yrotation':

>        return ('Z', Rotation, +1)

>    elif word == 'Zrotation':

>        return ('Y', Rotation, -1)

>    elif word == 'Xposition':

>        return (0, Location, +1)

>    elif word == 'Yposition':

>        return (2, Location, +1)

>    elif word == 'Zposition':

>        return (1, Location, -1)  


>#

># addFrame(words, frame, nodes, pbones, scale):

># 


>def addFrame(words, frame, nodes, pbones, scale):

>    m = 0

>    for node in nodes:

>        name = node.name

>        try:

>            pb = pbones[name]

>        except:

>            pb = None

>        if pb:

>            for (mode, indices) in node.channels:

>                if mode == Location:

>                    vec = Vector((0,0,0))

>                    for (index, sign) in indices:

>                        vec[index] = sign*float(words[m])

>                        m += 1

>                    pb.location = (scale * vec - node.head) * node.inverse

>                    for n in range(3):

>                        pb.keyframe_insert('location', index=n, frame=frame, group=name)

>                elif mode == Rotation:

>                    mats = []

>                    for (axis, sign) in indices:

>                        angle = sign*float(words[m])*Deg2Rad

>                        mats.append(Matrix.Rotation(angle, 3, axis))

>                        m += 1

>                    mat = node.inverse * mats[0] * mats[1] * mats[2] * node.matrix

>                    pb.rotation_quaternion = mat.to_quaternion()

>                    for n in range(4):

>                        pb.keyframe_insert('rotation_quaternion',

>                                          index=n, frame=frame, group=name)

>    return 


>#

># initSceneProperties(scn):

>#  


>def initSceneProperties(scn):

>    bpy.types.Scene.MyBvhRot90 = bpy.props.BoolProperty(

>        name="Rotate 90 degrees",

>        description="Rotate the armature to make Z point up")

>    scn['MyBvhRot90'] = True


>    bpy.types.Scene.MyBvhScale = bpy.props.FloatProperty(

>        name="Scale",

>        default = 1.0,

>        min = 0.01,

>        max = 100)

>    scn['MyBvhScale'] = 1.0  


>initSceneProperties(bpy.context.scene)  


>#

># class BvhImportPanel(bpy.types.Panel):

># 


>class BvhImportPanel(bpy.types.Panel):