Введение в написание скриптов на Питоне для Блендера 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):