1
2
3 """
4 The Blender.Object.Pose submodule.
5
6 Pose
7 ====
8
9 This module provides access to B{Pose} objects in Blender. This Pose is the
10 current object-level (as opposed to armature-data level) transformation.
11
12 Example::
13 import Blender
14 from Blender import *
15
16
17 scn= Scene.GetCurrent()
18
19 # New Armature
20 arm_data= Armature.New('myArmature')
21 print arm_data
22 arm_ob = scn.objects.new(arm_data)
23 arm_data.makeEditable()
24
25
26 # Add 4 bones
27 ebones = [Armature.Editbone(), Armature.Editbone(), Armature.Editbone(), Armature.Editbone()]
28
29 # Name the editbones
30 ebones[0].name = 'Bone.001'
31 ebones[1].name = 'Bone.002'
32 ebones[2].name = 'Bone.003'
33 ebones[3].name = 'Bone.004'
34
35 # Assign the editbones to the armature
36 for eb in ebones:
37 arm_data.bones[eb.name]= eb
38
39 # Set the locations of the bones
40 ebones[0].head= Mathutils.Vector(0,0,0)
41 ebones[0].tail= Mathutils.Vector(0,0,1)
42 ebones[1].head= Mathutils.Vector(0,0,1)
43 ebones[1].tail= Mathutils.Vector(0,0,2)
44 ebones[2].head= Mathutils.Vector(0,0,2)
45 ebones[2].tail= Mathutils.Vector(0,0,3)
46 ebones[3].head= Mathutils.Vector(0,0,3)
47 ebones[3].tail= Mathutils.Vector(0,0,4)
48
49 ebones[1].parent= ebones[0]
50 ebones[2].parent= ebones[1]
51 ebones[3].parent= ebones[2]
52
53 arm_data.update()
54 # Done with editing the armature
55
56
57 # Assign the pose animation
58 pose = arm_ob.getPose()
59
60 act = arm_ob.getAction()
61 if not act: # Add a pose action if we dont have one
62 act = Armature.NLA.NewAction()
63 act.setActive(arm_ob)
64
65 xbones=arm_ob.data.bones.values()
66 pbones = pose.bones.values()
67 print xbones
68 print pbones
69
70
71 frame = 1
72 for pbone in pbones: # set bones to no rotation
73 pbone.quat[:] = 1.000,0.000,0.000,0.0000
74 pbone.insertKey(arm_ob, frame, Object.Pose.ROT)
75
76 # Set a different rotation at frame 25
77 pbones[0].quat[:] = 1.000,0.1000,0.2000,0.20000
78 pbones[1].quat[:] = 1.000,0.6000,0.5000,0.40000
79 pbones[2].quat[:] = 1.000,0.1000,0.3000,0.40000
80 pbones[3].quat[:] = 1.000,-0.2000,-0.3000,0.30000
81
82 frame = 25
83 for i in xrange(4):
84 pbones[i].insertKey(arm_ob, frame, Object.Pose.ROT)
85
86 pbones[0].quat[:] = 1.000,0.000,0.000,0.0000
87 pbones[1].quat[:] = 1.000,0.000,0.000,0.0000
88 pbones[2].quat[:] = 1.000,0.000,0.000,0.0000
89 pbones[3].quat[:] = 1.000,0.000,0.000,0.0000
90
91
92 frame = 50
93 for pbone in pbones: # set bones to no rotation
94 pbone.quat[:] = 1.000,0.000,0.000,0.0000
95 pbone.insertKey(arm_ob, frame, Object.Pose.ROT)
96
97
98
99 @var ROT:
100 @type ROT: Constant
101 @var LOC:
102 @type LOC: Constant
103 @var SIZE:
104 @type SIZE: Constant
105 """
106
108 """
109 The Pose object
110 ===============
111 This object gives access to Pose-specific data in Blender.
112 @ivar bones: A Dictionary of PosePoseBones (PoseDict) that make up this Pose.
113 @type bones: PoseDict Object
114 """
115
117 """
118 Save all changes and update the Pose.
119 @rtype: None
120 """
121
123 """
124 The PoseBonesDict object
125 ========================
126 This object gives dictionary like access to the PoseBones in a Pose.
127 It is internal to blender but is called as 'Pose.bones'
128 """
129
131 """
132 Return the key, value pairs in this dictionary
133 @rtype: string, PosePoseBone
134 @return: All strings, and PosePoseBones in the Pose (in that order)
135 """
136
138 """
139 Return the keys in this dictionary
140 @rtype: string
141 @return: All strings representing the PosePoseBone names
142 """
143
145 """
146 Return the values in this dictionary
147 @rtype: BPy_PoseBone
148 @return: All PosePoseBones in this dictionary
149 """
150
152 """
153 The PoseBone object
154 ===================
155 This object gives access to PoseBone-specific data in Blender.
156 @ivar name: The name of this PoseBone.
157 @type name: String
158 @ivar loc: The change in location for this PoseBone. this is the equivilent of bone.getLoc() in the old 2.3x python api.
159 @type loc: Vector object
160 @ivar size: The change in size for this PoseBone (no change is 1,1,1)
161 @type size: Vector object
162 @ivar quat: The change in rotation for this PoseBone.
163 @type quat: Quaternion object
164 @ivar head: The final head location for this PoseBone. (not settable)
165 @type head: Vector object
166 @ivar tail: The final tail location for this PoseBone. (not settable)
167 @type tail: Vector object
168 @ivar sel: The selection state of this bone
169 @type sel: Boolean
170 @ivar parent: The parent of this posebone (not settable)
171 @type parent: posebone or None
172 @ivar displayObject: The object to display in place of the bone. (custom bones)
173 @type displayObject: Object or None
174 @ivar localMatrix: The matrix combination of rot/size/loc.
175 @type localMatrix: Matrix object
176 @ivar poseMatrix: The total transformation of this PoseBone including constraints.
177
178 This matrix is in armature space, for the current worldspace location of this pose bone, multiply
179 it with its objects worldspace matrix.
180
181 eg. pose_bone.poseMatrix * object.matrixWorld
182
183 Setting the poseMatrix only sets the loc/size/rot, before constraints are applied (similar to actions).
184 After setting pose matrix, run pose.update() to re-evaluate the pose and see the changes in the 3d view.
185
186 @type poseMatrix: Matrix object
187 @type constraints: BPy_ConstraintSeq
188 @ivar constraints: a sequence of constraints for the object
189 @type limitmin: 3-item sequence
190 @ivar limitmin: The x,y,z minimum limits on rotation when part of an IK
191 @type limitmax: 3-item sequence
192 @ivar limitmax: The x,y,z maximum limits on rotation when part of an IK
193
194 @type hasIK: bool
195 @ivar hasIK: True if this pose bone is a part of an IK (readonly), when False, other IK related values have no affect.
196
197 @type stretch: float
198 @ivar stretch: The amount to stretch to the ik target when part of an IK [0.0 - 1.0]
199
200 @type stiffX: float
201 @ivar stiffX: The x stiffness when part of an IK [0.0 - 0.990]
202 @type stiffY: float
203 @ivar stiffY: The x stiffness when part of an IK [0.0 - 0.990]
204 @type stiffZ: float
205 @ivar stiffZ: The x stiffness when part of an IK [0.0 - 0.990]
206
207 @type limitX: bool
208 @ivar limitX: Limit rotation over X axis when part of an IK.
209 @type limitY: bool
210 @ivar limitY: Limit rotation over Y axis when part of an IK.
211 @type limitZ: bool
212 @ivar limitZ: Limit rotation over Z axis when part of an IK.
213
214 @type lockXRot: bool
215 @ivar lockXRot: Disable X DoF when part of an IK.
216 @type lockYRot: bool
217 @ivar lockYRot: Disable Y DoF when part of an IK.
218 @type lockZRot: bool
219 @ivar lockZRot: Disable Z DoF when part of an IK.
220 @ivar layerMask: Layer bitmask
221 Example::
222 # set bone to layers 14 and 16
223 bone.layerMask = (1<<13) + (1<<15)
224 @type layerMask: Int
225 """
226
227 - def insertKey(parentObject, frameNumber, type = "[Pose.LOC, Pose.ROT, Pose.SIZE]", fast = False):
228 """
229 Insert a pose key for this PoseBone at a frame.
230 @type parentObject: Object object
231 @param parentObject: The object the pose came from.
232 @type frameNumber: integer
233 @param frameNumber: The frame number to insert the pose key on.
234 @type type: Constant object
235 @param type: Optional argumentm.
236 Can be any combination of 3 Module constants:
237 - Pose.LOC
238 - Pose.ROT (This adds keyframes to the quat ipo, since quaternions are used for pose bone rotation)
239 - Pose.SIZE
240 If this argument is omitted all keys will be added.
241 @type fast: Bool
242 @param fast: If enabled, the IPOs will not be recalculated, speeds up adding many keyframes at once.
243 @rtype: None
244 """
245