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);
}