如何在GLM中用3x3矩阵R为4x4矩阵M的3x3子矩阵赋值?
在GLM中为4x4矩阵的3x3子矩阵赋值的简洁写法
你需要把3x3矩阵R赋值给4x4矩阵M的左上3x3子区域,同时保留M原有的第4行和第4列,GLM提供了比两层循环更简洁的实现方式,以下是两种可行方案:
方法1:使用矩阵块操作(推荐)
GLM内置了子矩阵块操作的模板方法,直接定位目标子区域赋值即可,代码简洁且高效:
M.block<3, 3>(0, 0) = R;
这里的block<rows, cols>(startRow, startCol)函数指定了子矩阵的尺寸(3行3列)和起始位置(第0行第0列),直接将R的值覆盖到M的对应区域,完全无需手动循环。
方法2:手动拼接矩阵
如果需要更灵活的矩阵构造逻辑,可以先提取M中需要保留的部分,再和R拼接成新矩阵:
// 提取M第4列的前3个元素,以及完整的第4行 glm::vec3 preservedCol = glm::vec3(M[0][3], M[1][3], M[2][3]); glm::vec4 preservedRow = M[3]; // 重新构造M:用R的行拼接保留的列元素,最后加上保留的第4行 M = glm::mat4( glm::vec4(R[0], preservedCol[0]), glm::vec4(R[1], preservedCol[1]), glm::vec4(R[2], preservedCol[2]), preservedRow );
这种写法适合需要调整矩阵其他部分的场景,但对于你的需求,第一种块操作的方法显然更直接高效。
需要注意的是,这种方式和单纯将mat3转为mat4的逻辑不同——后者会用单位矩阵填充第4行和第4列,而上述两种方法都完整保留了M原本的第4行和第4列内容,完全符合你的要求。
内容的提问来源于stack exchange,提问作者tuket
相关产品推荐
相关产品推荐

