変換行列からスケールを取得する

回転などを掛け合わせた後、スケールして、また回転したりするとうまく取れない

3x3行列を
|a b c|
|d e f|
|g h i|

返還前の行列を
|Xx Xy Xz|
|Yx Yy Yz|
|Zx Zy Zz|

スケール変換行列を
|Sx 0 0|
|0 Sy 0|
|0 0 Sz|

とするとき

スケール変換行列による変換は
|Xx Xy Xz| |Sx 0 0| |XxSx XySy XzSz|
|Yx Yy Yz|・|0 Sy 0|=|YxSx YySy YzSz|
|Zx Zy Zz| |0 0 Sz| |ZxSx ZySy ZzSz|

スケールのない各軸のベクトルは単位ベクトルなので、
	横
	√(a2 + b2 + c2) = 1
	√(d2 + e2 + f2) = 1
	√(g2 + h2 + i2) = 1

	縦
	√(a2 + d2 + g2) = 1
	√(b2 + e2 + h2) = 1
	√(c2 + f2 + i2) = 1
	※横は軸のベクトルを示している。
	縦は逆行列にした場合の軸のベクトルを示している

スケールのない各軸のベクトル縦から
	a2 + d2 + g2 = XxSx2 + YxSx2 + ZxSx2
	             = Sx2 * (Xx2 + Yx2 + Zx2)
	Xx2 + Yx2 + Zx2は、1だから
	             = Sx2

よって、
	√(XxSx2 + YxSx2 + ZxSx2)
  • 関数
void getScale(D3DXMATRIX &m, float &sx, float &sy, float &sz)
{
	sx = sqrt(m._11 * m._11 + m._21 * m._21 + m._31 * m._31);
	sy = sqrt(m._12 * m._12 + m._22 * m._22 + m._32 * m._32);
	sz = sqrt(m._13 * m._13 + m._23 * m._23 + m._33 * m._33);
}