0

matMul 関数は、行列 C に格納する行列乗算を実行します。computeTransformationMatrix 関数の場合、目標は、回転行列、スケーリング行列、並進行列、および射影行列を単一の変換行列 M に結合することです。すべての変換行列は、 2X4 行列である射影行列。以下に示されていませんが、定数は他の場所で適切に定義されています。最終的に複合変換行列 M を作成するまで、変換行列ごとに 1 回 (一番下に示されている) matMul 関数を適用するために変換を組み合わせる唯一の方法はありますか?

void matMul(Matrix A, Matrix B, int ARows, int ACols, int BCols, Matrix C){
   int i,j,k, sum;
        for(i=0;i<ARows;i++){
        sum = 0;
        for(j=0;j<ACols;j++){
            for(k=0;k<BCols;k++){
            sum += A[i][k]*B[k][j];
        }
        C[i][j] = sum;
        }
    }    
}    


void computeTransformationMatrix(Matrix M, float scale, float xt, float yt, float zt) {
// to return final transformation in M
    Matrix P;   // projection matrix
    Matrix S;   // scaling matrix
    Matrix T;   // translation matrix
    Matrix R_X, R_Y, R_Z; //rotation matrices

    // initialize transformation matrices
    rotationMatrixX(ROTATION_ANGLE_X, R_X);
    rotationMatrixY(ROTATION_ANGLE_Y, R_Y);
    rotationMatrixZ(ROTATION_ANGLE_Z, R_Z);
    projectionMatrix(P);
    scalingMatrix(scale, scale, -scale, S);  
    translationMatrix(xt, yt, zt, T);

    Matrix TM1, TM2, TM3, TM4;//store transformed matrices
        matMul(R_X, R_Y, 4, 4, 4, TM1);
        matMul(R_Z, TM1, 4, 4, 4, TM2);
        matMul(T,TM2, 4, 4, 4, TM3);
        matMul(S, TM3, 4, 4, 4, TM4);
        matMul(P, TM4, 2, 4, 4, M);
    }
4

1 に答える 1

1

3 つのローテーション マトリックスの "定型化された" 組み合わせを作成することをお勧めします。

EulerAngles/wikiの次の式を使用して、最初に X、Y、Z の順に回転し ます。ここに画像の説明を入力

c と s は、1 が x の角度、2 が y の角度、3 が z の角度のコサインとサインを意味します。

これにより、計算時間が大幅に短縮されます。

別の順序でローテーションを実行したい場合は、Web ページで説明されている他のマトリックスがあります。

于 2013-10-31T04:59:53.240 に答える