Unexpected bone rotation

While writing an animation exporter for a custom format, I keep stumbling over the rotation of the bones.

( bone object ).matrix_local.to_euler()

For some reason, X is coming out as 1.57 when it should be zero (I assume) in resting position. When I import it into my application, the relative pitch is grossly thrown off. Is there an explanation for the rotation? Is subtracting 1.57 from X the only way around this?

On a side note, the arguments for .to_euler() don’t appear to be working yet. I tried some different ways of sorting the axes and the results are all (1.57, 0.00, 0.00).

can’t help, this retured correctly for me:
Euler((0.0, -0.0, 0.0))

good luck

Oh- that’s strange.

# Output: Euler((1.570796251296997, -0.0, 0.0))

# Output: Euler((0.0, -0.0, 0.0))

Why aren’t they the same? Am I not accessing the bone’s local matrix in the first line?

Ok, I think I am beginning to make sense of this now.

bpy.context.object.data.bones - - > Resting transform of the bone
bpy.context.object.pose.bones - - > Transform relative to the resting bone (Set by the pose)

This takes me back to where I started, because I need to export the resting transform, but it still has a curious 90 degree rotation. I have tried applying rotation, but still no luck. Does anyone know why the bones don’t have 0.0, 0.0, 0.0 rotation by default?

I guess, the whole armature’s been rotated 90 degrees on X…

That may be, but why do I not see this anywhere in the transform window? This is only showing up in python. If you want to see what I’m confused about, try the following:

  • Open Blender 2.54
  • Delete cube
  • Press Shift+A -> Armature -> Single Bone
  • Press N … Rotation is zero
  • Tab into edit mode … Rotation is zero
  • Open console
  • Type “bpy.context.object.data.bones[0].matrix_local.to_euler()”
  • You will see “Euler((1.570796251296997, -0.0, 0.0))”

Why is this? I just think it’s strange that this doesn’t show in the interface and the default rotation for a new bone isn’t zero. If I have a misunderstanding of the math involved or missed an option in the interface then I would love to learn where I am being mislead so that I can get past this.

Again, the whole reason I am concerned is because my application expects rotation to start at 0,0,0. I would rather not perform an ugly hack if it can be avoided.