Текущее положение костей для анимашки.

Это из рязряда (пока не забыл) и пора спать, а завтра не вспомню 100%.
Итак, суть - нарисовали простую анимашку в блендере пусть это будет рука с костями. Повернули руку, запустили скрипт - нифига, не работает, кости не преобразовуются, лазим по нету, гуглим, пишем другой скрипт, он выдает, чето изменяется, но ниче не понятно.
Я делаю так: Порачиваю кость через панельку n, там есть rotX, rotY и rotZ. Ставлю RotX = 90. Естественно рука становится дыбом.
рука с ротацией 90
Обратите внимание на имя кости

Теперь запускаем такой скрипт
import Blender
from Blender import *
from Blender.Mathutils import *

from multiprocessing import Process, Lock
from multiprocessing.sharedctypes import Value, Array
from ctypes import Structure, c_double
import math

#взять конкретную арматуру
arm = Armature.Get('Armature')

scn= Scene.GetCurrent()

outStr = ''

for a in scn.objects:
	print a.name
	if a.name=='Armature': 
		armOb = a
		pose = armOb.getPose()

print pose
pbones = pose.bones.values()
print pbones

for bone in pbones:
	if bone.name=='Bone.001':
		outStr+= str(bone.quat[:]);

outFile = open("D:\\blender\\python-armature\\bone-mat.txt", 'w')

outFile.write(outStr)

outFile.close()


Он выдает
[0.7071068286895752, -0.70710676908493042, 0.0, 0.0]

Че это??? Я сразу так, хрен его знает... Но надо.
Пишу дему на флеше
package  
{
	import flash.display.*;
	import flash.geom.*;
	/**
	 * ...
	 * @author Alex Lexcuk http://www.murmadillo.tut.su
	 */
	public class TestMatrxDoc extends Sprite
	{
		
		public function TestMatrxDoc() 
		{
			var m3d:Matrix3D = new Matrix3D();
			//крутим X на 90 стредствами флеш
			m3d.prependRotation( 90, Vector3D.Y_AXIS);
			var quat:Vector. = m3d.decompose(Orientation3D.QUATERNION);
			//показываем компоненты
			trace('компонента флешевской ротации');
			trace(quat[1].x,quat[1].y,quat[1].z,quat[1].w,',');
			var v3d:Vector3D = new Vector3D(1, 1, 1);
			v3d = m3d.transformVector(v3d);
			trace('преобразованный флешевский единичный вектор '+v3d);
			
			//сброс m3d
			m3d.identity();

			//Матрица из блендера
			quat[1] = new Vector3D(0.70710653066635132, 0.70710700750350952, 0.0, 0.0);
			trace('компонента блендерной ротации');
			trace(quat[1].x,quat[1].y,quat[1].z,quat[1].w,',');
			
			m3d.recompose(quat, Orientation3D.QUATERNION);
			v3d = new Vector3D(1, 1, 1);
			v3d = m3d.transformVector(v3d);
			trace('преобразованный блендером единичный вектор '+v3d);
			
			
			//trace(s);
		}


	}

}

Trace выдает
компонента флешевской ротации
0 0.7071067690849304 0 0.7071067690849304 ,
преобразованный флешевский единичный вектор Vector3D(1, 1, -1)
компонента блендерной ротации
0.7071065306663513 0.7071070075035095 0 0 ,
преобразованный блендером единичный вектор Vector3D(0.9999993443489075, 1.0000007152557373, -0.9999998807907104)

Тут я схитрил тк. написал Vector3D.Y_AXIS, те. дефолтные оси не совпадают...А додумался через help.
Чтобы модифицировать преобразование матрицы с использованием абсолютной родительской системой координат, получите параметры при помощи метода decompose() и внесите соответствующие изменения. Затем можно применить к объекту Matrix3D измененное преобразование при помощи метода recompose().

Параметр метода recompose() задает стиль ориентации, который использовался для преобразования. По умолчанию используется ориентация eulerAngles, которая определяет ориентацию с тремя различными углами поворота вокруг каждой оси. Повороты выполняются последовательно, и ось каждого поворота не изменяется. С помощью свойств поворота осей экранного объекта выполняется преобразование стиля ориентации эйлеровых углов (Euler Angles). Другими вариантами стиля ориентации являются axisAngle и quaternion. Для определения ориентации межосевых улов (Axis Angle) используется комбинация оси и угла. Ось, вокруг которой вращается объект, является единичным вектором, который представляет направление. Угол представляет величину поворота относительно вектора. Направление также определяет расположение лицевой стороны экранного объекта, а угол — направление лицевой стороны вверх. В методах appendRotation() и prependRotation() используется ориентация межосевого угла. В ориентации кватерниона используются комплексные числа и четвертый элемент вектора. Ориентация представляется тремя осями поворота (x,y,z) и углом поворота (w). В методе interpolate() используется кватернион.


PS: Кто ниче не понял, я не виноват, спок.н.