逆行列
2023年12月22日 (金) 05:05時点におけるAdministrator (トーク | 投稿記録)による版
逆行列(inverse matrix)とは、行列の逆数のようなもの。
主に3DCGの世界では頂点の座標系を「戻す」のによく使われる。
たとえばバーテックスシェーダーでローカル座標系からワールド座標系に変換してしまった頂点位置をピクセルシェーダーでローカル座標系に戻したい場合などに使われる。
3x3行列の場合
C言語風に実装すると以下のような感じ。
bool inverseMatrix(float a[3][3], float inv[3][3]) {
float det = a[0][0] * (a[1][1] * a[2][2] - a[2][1] * a[1][2])
- a[0][1] * (a[1][0] * a[2][2] - a[1][2] * a[2][0])
+ a[0][2] * (a[1][0] * a[2][1] - a[1][1] * a[2][0]);
if (det == 0) {
printf("The matrix is singular and cannot be inverted.\n");
return false;
}
float invdet = 1 / det;
inv[0][0] = (a[1][1] * a[2][2] - a[2][1] * a[1][2]) * invdet;
inv[0][1] = -(a[0][1] * a[2][2] - a[0][2] * a[2][1]) * invdet;
inv[0][2] = (a[0][1] * a[1][2] - a[0][2] * a[1][1]) * invdet;
inv[1][0] = -(a[1][0] * a[2][2] - a[1][2] * a[2][0]) * invdet;
inv[1][1] = (a[0][0] * a[2][2] - a[0][2] * a[2][0]) * invdet;
inv[1][2] = -(a[0][0] * a[1][2] - a[1][0] * a[0][2]) * invdet;
inv[2][0] = (a[1][0] * a[2][1] - a[2][0] * a[1][1]) * invdet;
inv[2][1] = -(a[0][0] * a[2][1] - a[2][0] * a[0][1]) * invdet;
inv[2][2] = (a[0][0] * a[1][1] - a[1][0] * a[0][1]) * invdet;
return true;
}