OpenGL列主元矩阵的运算

大学线性代数课本是用的行主元矩阵,OpenGL使用的是列主元矩阵。有什么差别呢,对于线性代数学得不够扎实的孩纸来说,还挺烦的。

其实明白了就觉得很简单:

从课本的角度来看,平移矩阵是诸如这样的:

平移矩阵的计算是这样的:

从OpenGL的角度来看,平移矩阵是诸如这样的:

平移矩阵的计算呢,是这样的:

也就是,假如OpenGL的矩阵运算是a * b = c,如何变成书上的那种呢,改成bT * aT = cT就行了。

这里,我们有一样事情没有变,总是坚持:第一个矩阵的行与第二个矩阵的列的相应元素相乘之和作为新矩阵的对应元素。

程序里经常是这样写的:

#define A(row,col)  a[(col<<2)+row]

#define B(row,col)  b[(col<<2)+row]

#define P(row,col)  product[(col<<2)+row]



///////////////////////////////////////////////////////////////////////////////

// Multiply two 4x4 matricies

void m3dMatrixMultiply44(M3DMatrix44f product, const M3DMatrix44f a, const M3DMatrix44f b )

{

    for (int i = 0; i < 4; i++) {

        float ai0=A(i,0),  ai1=A(i,1),  ai2=A(i,2),  ai3=A(i,3);

        P(i,0) = ai0 * B(0,0) + ai1 * B(1,0) + ai2 * B(2,0) + ai3 * B(3,0);

        P(i,1) = ai0 * B(0,1) + ai1 * B(1,1) + ai2 * B(2,1) + ai3 * B(3,1);

        P(i,2) = ai0 * B(0,2) + ai1 * B(1,2) + ai2 * B(2,2) + ai3 * B(3,2);

        P(i,3) = ai0 * B(0,3) + ai1 * B(1,3) + ai2 * B(2,3) + ai3 * B(3,3);

    }

}

它通过定义前三行,实质就是转置,然后再进行行主元的运算,a * b = c变为bT * aT = cT

 


    
  
  
  
  
  
  
  
  
  
  
  
 
 
 


你可能感兴趣的:(OpenGL)