出力したスキンアニメーションモデルのボーン座標が正しいか確認するために、
ボーン座標を求めてみました。
“Away3D 4.0.7″ にて読み込んだモデルのボーンは、”SkeletonJoint” となって
“Skeleton” 内に格納されています。
ただ “SkeletonJoint” には、”inverseBindPose” として初期行列の逆行列しか
格納されていません。では、アニメーションした行列はどこにあるか?
それは、 “SkeletonAnimator” 内にありました。
“SkeletonAnimator” はアニメーションを管理するクラスで、ここでアニメーションの
再生つまりボーン行列の更新が行われています。
“SkeletonAnimator” を覗いてみると、”globalMatrices” が見つかります。
ここに全てのボーンのアニメーション変換後の行列が直列化して格納されるようです。
更に中の数値を見てみると、ボーンの初期行列に対しての相対行列の値が、
4×3の転置した形で格納されていました。
なので、”globalMatrices” から必要な分のデータを取り出し、”inverseBindPose” の
逆行列を掛けてあげれば、アニメーション変換後の行列が取得できます。
では実際にコードにおこしてみると、
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
var _iterator:AssetLibraryIterator = AssetLibraryBundle.getInstance().createIterator(AssetType.MESH); var _mesh:Mesh = _iterator.currentAsset as Mesh; var _skeletonAnimator:SkeletonAnimator = _mesh.animator as SkeletonAnimator; for (var _k:int = 0; _k < _skeletonAnimator.skeleton.joints.length; ++_k) { // 初期逆行列の取得 var _initTm:Matrix3D = new Matrix3D(_anim.skeleton.joints[_k].inverseBindPose); // 初期行列に戻す _initTm.invert(); // アニメーション相対転置行列の取得 var _rawData:Vector.<Number> = new Vector.<number>(); for (var _t:int = 12 * _k; _t < (12 * _k + 12); ++_t) _rawData.push(_skeletonAnimator.globalMatrices[_t]); _rawData.push(0, 0, 0, 0); var _tm:Matrix3D = new Matrix3D(_rawData) // アニメーション相対行列に戻す _tm.transpose(); // 初期行列 × 変換行列 _tm.prepend(_initTm); trace(_tm.position.toString()); } |
これでとりあえず、行列は取得できるので後は確認用のプリミティブ当に行列を流し込めば
視覚的にも確認できます。
ここまでやっておいて、実は一発で変換後の行列が取得できたりして。。。
見つけたら誰か教えて><