Пробуем аналогичные матрицы блендера и флеша.

Немного питона с блендеровыми матрицами

Для тестов я сделал отдельную папку. Запустил blender. На экране вижу куб, хороша прога, она всегда показывает, то чего от нее ждешь. Ctrl+s, сохранил этот файл в папку с проектом. Разбил окно на две части (блендерное естественно). В правой, по привычке выбрал text режим (ну немогу, что-бы не закодить, ну хоть что-нибуть, хоть яваСкрипт, хоть питон, as3, php, да емае бат файл виндовса напишу...) Не... Открываем все же FD (flashDevelop) проект - новый проект - пустой ас3 проект (не создавать папку для проекта) и сохраняем проект в папку с бленд файлом. Теперь новай файл - прописываем расширение py (питон). В панельке синтакс выбираем питон (о она сама выбрала, спасибки FD). Пишем туда такое
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

v = Vector(1,1,1);
outStr = 'тестирование блендера\n'
outFile = open('D:\\FLEX\\3D\\proj-3d-engine\\python-matrix-tester\\out.txt', 'w')


obj = Blender.Object.Get('Cube')
m = obj.mat;

outStr += str(m);

outFile.write(outStr)

Рульно, да??
Сохраняем файл, тут суть, лог строка будет писаться в файл D:\\FLEX\\3D\\proj-3d-engine\\python-matrix-tester\\out.txt те. в папке с проектом. Теперь в блендере нажимаем открыть и он сам подсунет папку, куда сохранен бленд файл. Открываем наш py скрипт. Скришотик небольшой:
прикольный русский
Зацените кодировку в окне блендер

Вас это смущает??? Мне пофигу. Писать буду в FD, а запускать в блендер. Там надо сначала нажать алт+R (обновить) потом alp+p (запустить) Теперь откраваем файл D:\\FLEX\\3D\\proj-3d-engine\\python-matrix-tester\\out.txt редактором akelPad, просто прикольный редактор, он показывает.
тестирование блендера
[1.000000, 0.000000, 0.000000, 0.000000](matrix [row 0])
[0.000000, 1.000000, 0.000000, 0.000000](matrix [row 1])
[0.000000, 0.000000, 1.000000, 0.000000](matrix [row 2])
[0.000000, 0.000000, 0.000000, 1.000000](matrix [row 3])

Переходим в блендере в окно с кубом нажимаем 'n'
ротация на 90
Выбираем ротацию на 90 градусов по оси x

Опять запускаем скрип в окне со скриптом alp+p
тестирование блендера
[1.000000, 0.000000, 0.000000, 0.000000](matrix [row 0])
[0.000000, -0.000000, 1.000000, 0.000000](matrix [row 1])
[0.000000, -1.000000, -0.000000, 0.000000](matrix [row 2])
[0.000000, 0.000000, 0.000000, 1.000000](matrix [row 3])

Теперь делаем флеш аналог матриц для этог компилируем Doc
package  
{
	import flash.display.*;
	import flash.geom.*;
	
	
	/**
	 * ...
	 * @author Alex Lexcuk http://www.murmadillo.tut.su
	 */
	public class Doc extends Sprite
	{
		
		public function Doc() 
		{
			var m:Matrix3D = new Matrix3D();
			m.appendRotation(90, Vector3D.X_AXIS);
			traceMat(m);
		}

		private function traceMat(m:Matrix3D):void {
			var i:int;
			var raw:Vector.<Number> = m.rawData;
			var s:String = '';
			for (i = 0; i < raw.length; i++) {
				s += raw[i].toFixed(6);
				if (i>0 && (i+1) % 4 == 0) s += '\n'; else s += ',';
			}
			trace(s);
		}
	}

}

Запускаем... trace выдает
1.000000,0.000000,0.000000,0.000000
0.000000,0.000001,1.000000,0.000000
0.000000,-1.000000,0.000001,0.000000
0.000000,0.000000,0.000000,1.000000

Полный дубль блендеровой матрицы.
Ну че??? Потестить векторы заодно.. Блин, одино и тоже, одно и то-же начинает напрягать.
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

v = Vector(1,1,1);
outStr = 'тестирование блендера\n'
outFile = open('D:\\FLEX\\3D\\proj-3d-engine\\python-matrix-tester\\out.txt', 'w')


obj = Blender.Object.Get('Cube')
m = obj.mat;
v = v*m

outStr += str(v);


outFile.write(outStr)

Выдает блендер [1.000000, -1.000000, 1.000000](vector)
package  
{
	import flash.display.*;
	import flash.geom.*;
	
	
	/**
	 * ...
	 * @author Alex Lexcuk http://www.murmadillo.tut.su
	 */
	public class Doc extends Sprite
	{
		
		public function Doc() 
		{
			var m:Matrix3D = new Matrix3D();
			m.appendRotation(90, Vector3D.X_AXIS);
			//traceMat(m);
			
			var v:Vector3D = new Vector3D(1, 1, 1);
			v = m.transformVector(v);
			trace(v);
		}

	}

}

Флеш выдает Vector3D(1, -1, 1)
Теперь от фонаря серьезно крутанем и переместим куб в блендере и выдадим рав матрицы в флешевском стиле.
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

def rawData(m):
	i=0;
	s='';
	for i in range(4):
		s+= "%f," % m[i][0]
		s+= "%f," % m[i][1]
		s+= "%f," % m[i][2]
		s+= "%f" % m[i][3] 
		if (i!=3): s+= ","
	return s;

v = Vector(1,1,1);
outStr = 'тестирование блендера\n'
outFile = open('D:\\FLEX\\3D\\proj-3d-engine\\python-matrix-tester\\out.txt', 'w')


obj = Blender.Object.Get('Cube')
m = obj.mat;
v = v*m
outStr = 'равДата матрицы\n';
outStr += rawData(m)+'\n';
outStr += 'Преобразованный вектор(1,1,1)'+str(v);

outFile.write(outStr)

Блендер выдает
равДата матрицы
0.034132,0.917492,0.396288,0.000000,-0.381130,-0.354604,0.853812,0.000000,0.923891,-0.180180,0.337580,0.000000,15.124082,-8.725431,-8.434584,1.000000
Преобразованный вектор(1,1,1)[15.700974, -8.342724, -6.846903](vector)

Затестим то-же во флеше
package  
{
	import flash.display.*;
	import flash.geom.*;
	
	
	/**
	 * ...
	 * @author Alex Lexcuk http://www.murmadillo.tut.su
	 */
	public class Doc extends Sprite
	{
		
		public function Doc() 
		{
			var m:Matrix3D = new Matrix3D();
			m.rawData = Vector.<Number>([0.034132, 0.917492, 0.396288, 0.000000, -0.381130, -0.354604, 0.853812, 0.000000, 0.923891, -0.180180, 0.337580, 0.000000, 15.124082, -8.725431, -8.434584, 1.000000]);

			//traceMat(m);
			
			var v:Vector3D = new Vector3D(1, 1, 1);
			v = m.transformVector(v);
			trace(v);
		}

	}

}

trace выдает
Vector3D(15.700974464416504, -8.342723846435547, -6.8469038009643555)
Ну и напоследок, серьезный тест Quaternion ротации, вытянем Quaternion из блендера, модифицируем вектор(1,1,1) и то-же проделаем во флеше
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


v = Vector(1,1,1);
outStr = 'тестирование блендера\n'
outFile = open('D:\\FLEX\\3D\\proj-3d-engine\\python-matrix-tester\\out.txt', 'w')


obj = Blender.Object.Get('Cube')
m = obj.mat;
q = m.toQuat()
#применяем квартенион
v = v*q
outStr = 'Quaternion\n';
outStr += str(q)+'\n';
outStr += 'Преобразованный вектор(1,1,1)'+str(v);

outFile.write(outStr)

Блендер выдает
Quaternion
[0.504259, 0.512630, 0.261574, 0.643827](quaternion)
Преобразованный вектор(1,1,1)[0.576893, 0.382707, 1.587681](vector)

Теперь то-же во флеше, используя quaternion
package  
{
	import flash.display.*;
	import flash.geom.*;
	
	
	/**
	 * ...
	 * @author Alex Lexcuk http://www.murmadillo.tut.su
	 */
	public class Doc extends Sprite
	{
		
		public function Doc() 
		{
			var m:Matrix3D = new Matrix3D();
			m.rawData = Vector.<Number>([0.034132, 0.917492, 0.396288, 0.000000, -0.381130, -0.354604, 0.853812, 0.000000, 0.923891, -0.180180, 0.337580, 0.000000, 15.124082, -8.725431, -8.434584, 1.000000]);
			var quat:Vector.<Vector3D> = m.decompose(Orientation3D.QUATERNION);
			trace(vStr(quat[0])+vStr(quat[1])+vStr(quat[2]));
			//quat[1] = new Vector3D(0.504259, 0.512630, 0.261574, 0.643827);
			//m.recompose(quat, Orientation3D.QUATERNION);
			var v:Vector3D = new Vector3D(1, 1, 1);
			v = m.transformVector(v);
			trace(v);
		}

		private function vStr(v:Vector3D):String {
			return 'vector(' + v.x.toFixed(5) + ',' + v.y.toFixed(5) + ',' + v.z.toFixed(5) + ',' + v.w.toFixed(5) + ');';
		}

	}

}

Блин, проблемы какие-то
БЛЕНДЕР out.txt

Quaternion
[0.504259, 0.512630, 0.261574, 0.643827](quaternion)
Преобразованный вектор(1,1,1)[0.576893, 0.382707, 1.587681](vector)




флеш trace

vector(15.12408,-8.72543,-8.43458,0.00000);
vector(0.51263,0.26157,0.64383,0.50426);
vector(1.00000,1.00000,1.00000,0.00000);

Vector3D(15.700974464416504, -8.342723846435547, -6.8469038009643555)


Серьезно запутался quaternion, перепутались все компоненты! Фигня, счас поправлю..,
package  
{
	import flash.display.*;
	import flash.geom.*;
	
	
	/**
	 * ...
	 * @author Alex Lexcuk http://www.murmadillo.tut.su
	 */
	public class Doc extends Sprite
	{
		
		public function Doc() 
		{
			var m:Matrix3D = new Matrix3D();
			
			var quat:Vector.<Vector3D> = m.decompose(Orientation3D.QUATERNION);
			//преобразовуем quaternion блендера для совместимости его с флешем
			
			m = blendOrientation([0.504259, 0.512630, 0.261574, 0.643827]);
			trace(vStr(quat[0])+vStr(quat[1])+vStr(quat[2]));
			
			var v:Vector3D = new Vector3D(1, 1, 1);
			v = m.transformVector(v);
			trace(v);
		}

		private function blendOrientation(a:Array):Matrix3D {
			var m:Matrix3D = new Matrix3D();
			var quat:Vector.<Vector3D> = m.decompose(Orientation3D.QUATERNION);
			var v:Vector3D = new Vector3D(a[1], a[2], a[3], a[0]);
			quat[1] = v;
			m.recompose(quat, Orientation3D.QUATERNION);
			return m;
		}

	}

}

Тестим
БЛЕНДЕР out.txt

Quaternion
[0.504259, 0.512630, 0.261574, 0.643827](quaternion)
Преобразованный вектор(1,1,1)[0.576893, 0.382707, 1.587681](vector)




флеш trace

Vector3D(0.5768939852714539, 0.3827073276042938, 1.5876805782318115)


Векторы одинаковые
Да... теперь дело сдвинется в лучшем направлении и пойдет... быстрее, думаю, архив сунуть или нафик...А че я думаю?, это ж вредно!
Архив с проектом ротации.