glm初試,關於行矩陣列矩陣問題


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM