4

私はJavaでOpenGLプロジェクトに取り組んでいますが、自分のコードで変換行列を作成したいところまで来たので、それらを使用して世界から画面へのポイント変換を行うことができます。 。変換をサポートするMatrixクラスを作成しましたが、それはすべて非常にうまく機能しています。ただし、逆変換を作成する方法を実際に理解するのに苦労しています。

だから私の質問はこれです:

  • 任意のアフィン(4x4)変換行列が与えられた場合、どのようにして逆変換行列を作成しますか?一部の行列は反転できませんか?変換行列を反転する際の制限と注意点は何ですか?

私の研究から、そうするためのさまざまな方法を聞いたことがあります。最も簡単なのは、マトリックスを転置してから否定することです。ただし、これは実際には機能していないようです。この方法は一部の行列では機能せず、一部の行列でさえ反転できないと聞きました。

行列を反転したときに何が起こっているのかを実際に理解したいので、「この方程式をプラグインする」という答え以上のものを探しています。これには、「このライブラリを使用するだけ」という回答も含まれません。将来的にはマトリックスライブラリに移行するかもしれませんが、とりあえず自分で作成したいと思います。

編集:誰かが尋ねる前に、これは宿題ではありません。これは個人的なプロジェクトです。

編集:どうやらここに逆行列を計算するための戦略の全リストがあります:http://en.wikipedia.org/wiki/Invertible_matrix

4

1 に答える 1

2

これが私のコンピュータグラフィックスコースで使用したコードです。基本的には、行列の逆行列を計算するためにガウスの消去法を使用しました。行列が可逆であるためには、その行列式の値がゼロに等しくない必要があります。私は私のコードでそのケースを処理していませんが、あなたのためにすべてを行うつもりはありません。

Matrix4* Matrix4::FindInverse(Matrix4 &a){

int n = R;
int i = 0;
int j = 0;
float pivot = 0;
Matrix4* invA = NULL;
//TODO: Check whether the matrix is invertible.Else Return
invA = new Matrix4();
invA->SetMatrix4(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1);


for(i = 0; i < n; i++){
    pivot = a.v[i][i];

    if(pivot != 1.0 and pivot != 0){
        for(int t = i; t < n; t++){
            a.v[i][t] = a.v[i][t]/pivot;
            invA->v[i][t] = invA->v[i][t]/pivot;
        }
    }

    //Update to the new pivot which must be 1.0
    pivot = a.v[i][i];

    for(j = 0; j < n; j++){
        if( j==i ){
            continue;

        }
        else{
            float l = a.v[j][i]/pivot;
            for(int m = 0; m < n; m++){
                a.v[j][m] = a.v[j][m] - l * a.v[i][m];
                invA->v[j][m] = invA->v[j][m] - (l * invA->v[i][m]);
            }
        }
    }
}
return invA;

}

于 2012-10-03T19:34:45.237 に答える