/*** * 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));