Цель данной страницы затащить позу с костями из блендера во флеш.

Насколько я понял поза блендера состоит из костей (естественно) каждая кость имеет свою матрицу, впоследствии пробегая по ключевым кадрам кости меняют свое местоположение в пространстве используя QUATERNION вращение, надеюсь, что я победил кватернионы. Опять новую папку, новый проект в FD. В блендер новый документ. Для начала в блендере изображу кость. Надо добиться максимального соответствия изображения костей (blender и flash), тк. кость представляет собой отрезок с началом и концом, и может быть повернут как по осям x,y так и по своей оси (взгляните хоть на свою руку от локтя). А во флеше изобразить это вращение проблематично (чисто визуально), я решил нарисовать кость и заодно доработать триД двиг на предмет отображения множества объектов, пусть теперь это будут кости.
визуальное отображение кости

Тянуть во флеш буду теперь самодельным скриптом get-mesh.py . Длинный получился, кину в архив. Особенность:
#вытягиваемый объект
myObfName = 'Cube'

#и группы вытягивать тоже
groupON = False

#путь к экспорту
exportPathStr = 'D:\\FLEX\\3D\\proj-3d-engine\\pose-port\\bone-mesh.txt';

Прописать путь к экспорту и название экспортируемого меша. Так-же надо указать экспортировать ли индексы групп, есл объект не трансформируется, то скрипт выдает ошибку на группы, хотя они и есть, стоит подключить арматуру и ошибка пропадает.
Экспортированная кость имеет такой вид
v3ds = Vector.<Number>([0.986841,1.000000,1.001188,0.986841,1.000000,-0.998812,0.986841,-1.000000,-0.998812,0.986841,-1.000000,1.001189,8.913765,0.578554,0.579741,8.913765,0.578553,-0.577366,8.913765,-0.578554,-0.577365,8.913765,...]);

uvs = Vector.<Number>([0.855862,0.239564,0.865543,0.325133,0.199255,..]);

facs = Vector.<int>([15,7,13,7,3,13,6,15,13,..]);

facUvs = Vector.<int>([0,1,2,1,3,2,4,0,2,4,2,5,6,..]);



Троеточия похожие повторы.
Вставлю это во флеш. Настало время написать все-же триД двигло. я назвал его lex.d3, хотел lex.3d, но паккаж некорректный получается.
Вставил объект во флеш так
package  
{
	import flash.display.*;
	import flash.geom.*;
	import lex.d3.*;
	/**
	 * ...
	 * @author Alex Lexcuk http://www.murmadillo.tut.su
	 */
	public class Doc extends Sprite
	{
		[Embed(source = 'color-bone.jpg')]
		private var Pic:Class;
		
		public function Doc() 
		{
			var o:Obj3d = new Obj3d();
			with (o) {include "bone-mesh.txt";}
			o.bmd = new Pic().bitmapData;
			//инвертировать текстурный битмап объекта
			o.mirrorBmdY();
			var r:ObjRender = new ObjRender();
			var cam:Matrix3D = new Matrix3D();
			cam.appendScale(25, 25, 25);
			cam.appendRotation( 90, Vector3D.X_AXIS);
			r.render(o, cam, graphics);
			x = y = 150;
		}
		
	}

}

ctrl+enter
косточка во флеше

Неправда ли похоже?

Моделим blender арматуру.

Файл - новый
Куб нафик, Ставим курсор в ноль это можно сделать в view - view properties - 3d cursor, ставим нолики.
Теперь пробел - armature.
простенькая арматурка
Типа человечек

Теперь надо без потерь отобразить эту арматуру во флеше.
Опять надо питонить
Питончик легонький получился
import Blender
from Blender import Armature
from Blender.Mathutils import *

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


#вытягиваемая арматура
myArmatureName = 'Armature'


#путь к экспорту
exportPathStr = 'D:\\FLEX\\3D\\proj-3d-engine\\pose-port\\armature.txt';




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



def rawVector(v,param):
	i=0;
	s='';
	s+= "%f," % v[param][0]
	s+= "%f," % v[param][1]
	s+= "%f" % v[param][2]
	return s;

arm = Armature.Get(myArmatureName)

boneName = '';
boneMat = '';
boneHead = '';
boneTail = '';

i=0;
for bone in arm.bones.values():
	boneName += '"'+bone.name+'"'
	boneMat += '['+rawData(bone.matrix,'ARMATURESPACE')+']'
	boneHead += '['+rawVector(bone.head,'ARMATURESPACE')+']'
	boneTail += '['+rawVector(bone.tail,'ARMATURESPACE')+']'
	i+=1
	if i!=len(arm.bones.values()):
		#последний элемент
		boneName+=','
		boneMat +=',\n'
		boneHead += ','
		boneTail += ','



outFile = open(exportPathStr, 'w')

outFile.write('boneName = ['+boneName+'];\n')
outFile.write('boneMat = ['+boneMat+'];\n')
outFile.write('boneHead = ['+boneHead+'];\n')
outFile.write('boneTail = ['+boneTail+'];\n')


Выдает много чего
И документ класс вот такой
package  
{
	import flash.display.*;
	import flash.geom.*;
	import lex.d3.*;
	/**
	 * ...
	 * @author Alex Lexcuk http://www.murmadillo.tut.su
	 */
	public class Doc extends Sprite
	{
		[Embed(source = 'color-bone.jpg')]
		private var Pic:Class;

		public function Doc() 
		{
			var o:Obj3d = new Obj3d();
			with (o) {include "bone-mesh.txt";}
			o.bmd = new Pic().bitmapData;
			//инвертировать текстурный битмап объекта
			o.mirrorBmdY();
			var r:ObjRender = new ObjRender();
			var cam:Matrix3D = new Matrix3D();
			cam.appendScale(65, 65, 65);
			cam.appendRotation( 90, Vector3D.X_AXIS);
			
			x = 250;
			y = 300;
			
			var a:Armature = new Armature();
			with (a) { include 'armature.txt' }
			a.init();
			//r.render(o, cam, graphics);
			var i:int;
			var preCam:Matrix3D = new Matrix3D();
			var blen:Number;
			for (i = 0; i < a.bones.length; i++) {
				preCam.identity();
				blen = Vector3D.distance(a.bones[i].head, a.bones[i].tail);
				//trace(blen);
				preCam.appendScale(0.1*blen, 0.05, 0.05);
				preCam.appendRotation( 90, Vector3D.Z_AXIS);
				preCam.append(a.bones[i].armatureMat);
				preCam.append(cam);
				r.render(o, preCam, graphics);
			}
		}

	}

}

Вроде неплохо отобразилась
арматурка во флеше

Архив со всем.