DirectX::XMMATRIXで定義されたワールド変換行列から、スケーリング、回転、オフセットの各成分を取り出します。
(参考 → 知っていると便利?ワールド変換行列から情報を抜き出そうhttp://marupeke296.com/DXG_No39_WorldMatrixInformation.html)
ワールド変換行列が Scaling×Rotation×Offset の順になっていることが前提ですが、それは標準なのかな
using namespace DirectX;
XMMATRIX ExtractOffset(const XMMATRIX& mWorld) {
return XMMatrixTranslation(mWorld.r[3].m128_f32[0], mWorld.r[3].m128_f32[1], mWorld.r[3].m128_f32[2]);
}
XMMATRIX ExtractScaling(const XMMATRIX& mWorld) {
return XMMatrixScaling(
XMVector3Length(XMVECTOR{ mWorld.r[0].m128_f32[0],mWorld.r[0].m128_f32[1],mWorld.r[0].m128_f32[2] }).m128_f32[0],
XMVector3Length(XMVECTOR{ mWorld.r[1].m128_f32[0],mWorld.r[1].m128_f32[1],mWorld.r[1].m128_f32[2] }).m128_f32[0],
XMVector3Length(XMVECTOR{ mWorld.r[2].m128_f32[0],mWorld.r[2].m128_f32[1],mWorld.r[2].m128_f32[2] }).m128_f32[0]
);
}
// ワールド行列から回転成分のみを抽出する
XMMATRIX ExtractRotation(const XMMATRIX& mWorld) {
XMMATRIX mOffset = ExtractOffset(mWorld);
XMMATRIX mScaling = ExtractScaling(mWorld);
XMVECTOR det;
// 左からScaling、右からOffsetの逆行列をそれぞれかける。
return XMMatrixInverse(&det, mScaling) * mWorld * XMMatrixInverse(&det, mOffset);
}