-3
void inverse44(
double *inverse,
double *matrix
)
{
double trans[3], trans_xf[3];
MTX3_t matrix3;

inverse[0] = matrix[0];
inverse[1] = matrix[4];
inverse[2] = matrix[8];
inverse[4] = matrix[1];
inverse[5] = matrix[5];
inverse[6] = matrix[9];
inverse[8] = matrix[2];
inverse[9] = matrix[6];
inverse[10] = matrix[10];
inverse[15] = 1.0;
inverse[12] = inverse[13] = inverse[14] = 0.0;

trans[0] = matrix[3];
trans[1] = matrix[7];
trans[2] = matrix[11];

MTX4_mtx3(MTX4_cast_pc(matrix),&matrix3);
MTX3_vec_multiply_t(VEC3_cast_pc(trans),&matrix3,VEC3_cast(trans_xf));
inverse[3] = -trans_xf[0];
inverse[7] = -trans_xf[1];
inverse[11] = -trans_xf[2];
}

この関数は何をしますか?

MTX3_t は 3*3 行列の定義です。MTX4_mtx3 はサブマトリックスを取得します。MTX3_vec_multiply_t ベクトルと行列を乗算します。

4

2 に答える 2

2

はい。変換行列の逆数を計算するには、このリンクを参照してください。基本的な考え方は、変換行列 (最初の 3x3 サブ行列) のスケーリング/回転の組み合わせは正規直交行列であり、正規直交行列の逆は転置に等しいということです。したがって、最初の部分は転置計算です。2 番目の部分 (trans[0] = matrix[3] の行から始まる) は、変換部分 (行列の最後の列) の逆数の計算です。

于 2012-06-06T09:40:24.630 に答える
0

これは、回転と平行移動の組み合わせである場合にのみ、変換マトリックスを反転します。変換マトリックスにスケーリングまたは透視投影も含まれている場合、正しく機能しません。

于 2012-06-06T16:42:12.403 に答える