私は現在、行列からオフセット要素を取得する関数(つまりm[3][0]〜m[3][2]をVECTOR型座標に変換)と、
オフセット要素を除いた純粋な回転行列を出す関数(m[3][n]が単位行列要素になる)を自作しています。
というのも、標準の関数が使用できず(もしくは無く)、行列を用いて移動や回転を行うプログラミングを記述する際に必要となったためです。
例えば、以下スレッドのように、直接カメラ行列を指定した場合にDxLib関数から取得できない場合などです。
参考URL:dxlib.o.oo7.jp/cgi/patiobbs/patio.cgi?mode=view&no=4127
参考までに、作成した関数とその使用例を記述します。
===========================================================================================================================================================
//行列から座標を取得
VECTOR GetOffset(const MATRIX& mat)
{
return VGet(mat.m[3][0], mat.m[3][1], mat.m[3][2]);
}
//行列から回転成分のみの行列を取得
//X,Y,Z軸の回転行列を取得する関数はあるが行列から回転要素のみを取得するものはない?
MATRIX GetRotMatrix(const MATRIX& mat)
{
MATRIX retMat = MATRIX_IDENTITY;
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
retMat.m[i][j] = mat.m[i][j];
}
}
return retMat;
}
//以下使用例
VECTOR Camera::GetCamPosition()
{
return GetOffset(MInverse(GetCameraViewMatrix()));
}
//[平行移動][回転][回転原点][回転原点との距離][回転原点座標の平行移動]を基にカメラを移動、回転
void Camera::SetTransform(const VECTOR& translate, const VECTOR& rotation, const VECTOR& rotateCenter, float toCenterLength, const VECTOR& offset)
{
MATRIX rotMatX = MGetRotAxis(GetCamVector(VECTOR_X_AXIS), DegToRad(rotation.x));
MATRIX rotMatY = MGetRotAxis(VECTOR_Z_AXIS, DegToRad(rotation.y));
//使用部分
MATRIX rotMat = GetRotMatrix(MInverse(GetCameraViewMatrix())) * (rotMatX * rotMatY);
MATRIX zAxisMat = MGetTranslate(VECTOR_Z_AXIS * -toCenterLength);
SetCameraViewMatrix(MInverse(zAxisMat * rotMat * MGetTranslate(rotateCenter + offset + translate)));
}
===========================================================================================================================================================
個人的にはありそうでなかった関数であるため、あれば有用なのではと思い提案させていただきました。
既に存在する、もしくは似たようなものが既にある場合は申し訳ありません。
ご検討や意見の方、よろしくお願いいたします。