2013-10-31 66 views
0

matMul函數執行將矩陣乘法存儲在矩陣C中的矩陣乘法。對於computeTransformationMatrix函數,目標是將旋轉矩陣,縮放矩陣,平移矩陣和投影矩陣組合爲單個變換矩陣M.所有變換矩陣均爲4x4除了投影矩陣是2X4矩陣。常量已在其他地方正確定義,儘管以下未顯示。將轉換合併到每個轉換矩陣一次(顯示在底部)應用matMul函數,直到最終創建複合轉換矩陣M的唯一方法?如何將所有線性變換合併到複合變換矩陣中?

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

你會怎麼做呢?我不認爲想要同時乘以三個矩陣是非常明智的,但是這將是關於您使用非線程代碼所能做的所有事情。使用線程代碼,您可能能夠加速單個矩陣乘法,但我相信您仍然需要按順序執行它們。 –

回答

1

我建議您製作三個旋轉矩陣的「罐頭」組合。

使用該公式從EulerAngles/wiki在X,則Y第一旋轉,則Z: enter image description here

c和s的意思cosin和角度的罪其中1是x的角度,2爲Y,3爲z。

這應該會大幅縮短您的計算時間。

如果要以不同的順序執行旋轉,還可以在網頁上描述其他矩陣。