変換行列からスケールを取得する
回転などを掛け合わせた後、スケールして、また回転したりするとうまく取れない
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); }