/*** * glm中矩阵是行优先存储的,这不同于opengl默认的以列优先存储的方式??,以下面矩阵mat为例 * 它是用四个行向量来模拟存储四个行:vec4 value[4],其中 * value[0] = (1,0,0,0) = (m[0][0],m[0][1],m[0][2],m[0][3]) * value[1] = (0,1,0,0) = (m[1][0],m[1][1],m[1][2],m[1][3]) * value[2] = (0,0,1,0) = (m[2][0],m[2][1],m[2][2],m[2][3]) * value[3] = (1,1,1,1) = (m[3][0],m[3][1],m[3][2],m[3][3]) * 这个存储与opengl从直观看是不一样的,它的平移部分存储到了第四行,而不是第四列,与DX的写法一致 */ glm::mat4 mat = mat4( 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1 ); glm::vec4 v(1, 2, 3, 1); /*** * 矩阵与向量向乘规则,遵守opengl的谁在前谁是列向量的规则 * 矩阵在前则矩阵看成是四个列向量,向量在后则为一个行向量 * 向量在前则向量看成一个列向量,矩阵在后则视为四个行向量 */ /*** * 【矩阵与向量相乘,一般的用法是矩阵在左向量在右】 * 如下运算是把mat看作四个列向量,V看作行向量:(1*1+0*2+0*3+1*1, 0*1+1*2+0*3+1*1, 0*1+0*2+1*3+1*1, 0*1+0*2+0*3+1*1) = (2,3,4,1) */ auto vt = mat * v; //结果是(2,3,4,1) mat4 m2( 1, 4, 6, 8, 2, 1, 7, 9, 3, 5, 1, 0, 0, 0, 0, 0 ); /*** *【总结】 * 1, glm中矩阵的存储是按行存储的,与DX一致 * 2, glm中左矩阵右向量的乘法=DX的左向量右矩阵乘法 * 由以上两点可以,在使用glm库时只需要注意矩阵与向量的写法,内部原理与运算可按DX来看 * 比如上面的运算按DX来算 * (1,2,3,1) * (1,0,0,0) = (1*1+2*0+3*0+1*1,1*0+2*1+3*0+1*1, 1*0+2*0+3*1+1*1, 1*0+2*0+3*0+1*1) = (2,3,4,1) (0,1,0,0) (0,0,1,0) (1,1,1,1) */ //translate运算是将1,2,3 添加到矩阵的第四行,结果为value[3] = 1,2,3,1 auto m3 = glm::translate(vec3(1, 2, 3));