Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在glm和OpenGL中合成转换_C++_Opengl_Matrix_Glm Math - Fatal编程技术网

C++ 在glm和OpenGL中合成转换

C++ 在glm和OpenGL中合成转换,c++,opengl,matrix,glm-math,C++,Opengl,Matrix,Glm Math,从线性代数中,如果有平移矩阵: 和缩放矩阵: 我们转换和缩放的净效应如下所示: 现在,我只使用VSCode查看glm如何使用这些操作来处理翻译: //my code glm::mat4 modelMatrix(1.0f); modelMatrix = glm::translate(modelMatrix, glm::vec3(0.5, 0.5f, 0.5f)); modelMatrix = glm::scale(modelMatrix,glm::vec3(1.5, 1.5, 1.0));

从线性代数中,如果有平移矩阵:

和缩放矩阵:


我们转换和缩放的净效应如下所示:

现在,我只使用VSCode查看
glm
如何使用这些操作来处理翻译:

//my code
glm::mat4 modelMatrix(1.0f); 
modelMatrix = glm::translate(modelMatrix, glm::vec3(0.5, 0.5f, 0.5f));
modelMatrix = glm::scale(modelMatrix,glm::vec3(1.5, 1.5, 1.0));
glm::translate的代码是:

//glm code
template<typename T, qualifier Q>
    GLM_FUNC_QUALIFIER mat<4, 4, T, Q> translate(mat<4, 4, T, Q> const& m, vec<3, T, Q> const& v)
    {
        mat<4, 4, T, Q> Result(m);
        Result[3] = m[0] * v[0] + m[1] * v[1] + m[2] * v[2] + m[3];
        return Result;
    }  
这基本上就是按如下方式缩放变换矩阵的列:
(我已经输入了翻译矩阵的值,如上面代码所示):

这根本不是我所期望的复合变换矩阵,这是我从线性代数理论中学到的:


这是怎么回事?

矩阵乘法顺序错误。示例代码计算的是T*S而不是S*T,因此结果与您的预期不同

以下代码应生成所需的结果:

glm::mat4 modelMatrix(1.0f); 
modelMatrix = glm::scale(modelMatrix,glm::vec3(1.5, 1.5, 1.0));
modelMatrix = glm::translate(modelMatrix, glm::vec3(0.5, 0.5f, 0.5f));

下面的第二个矩阵真的就是你得到的结果吗?因为在代码中使用(1.5,1.5,1)作为缩放因子,所以第三行/第三列中不应该有1.0吗?对于其他一切:你的乘法顺序是错误的。你的代码计算的是T*S,而不是S*T。@BDL,似乎我犯了一个错误。这是缩放然后平移,或者平移然后缩放之间的区别。这是真的,但是,这似乎是GLM处理事情的方式,因为人们会认为连续的矩阵调用会将矩阵固定到左侧而不是右侧。
glm::mat4 modelMatrix(1.0f); 
modelMatrix = glm::scale(modelMatrix,glm::vec3(1.5, 1.5, 1.0));
modelMatrix = glm::translate(modelMatrix, glm::vec3(0.5, 0.5f, 0.5f));