在 glm 和 OpenGL 中合成一个转换
Compositing a transformation in glm and OpenGL
来自线性代数,如果你有一个平移矩阵:
和一个缩放矩阵:
我们平移和缩放的净效应由下式给出:
现在我只使用 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;
}
本质上是改变单位矩阵的第三列,modelMatrix
变成平移矩阵T,但奇怪的是,它并没有形成复合变换
矩阵,而是这样做的:
//glm code
template<typename T, qualifier Q>
GLM_FUNC_QUALIFIER mat<4, 4, T, Q> scale(mat<4, 4, T, Q> const& m, vec<3, T, Q> const& v)
{
mat<4, 4, T, Q> Result;
Result[0] = m[0] * v[0];
Result[1] = m[1] * v[1];
Result[2] = m[2] * v[2];
Result[3] = m[3];
return Result;
}
这实际上只是像这样缩放变换矩阵的列:
(我把翻译矩阵的值放在我上面的代码中):
这根本不是我期望的复合变换矩阵,这是我从线性代数理论中学到的:
这是怎么回事?
矩阵乘法顺序错误。示例代码计算的是 T * S 而不是 S * T。Matrix multiplications are not commutative,因此结果与您的预期不同。
以下代码应该会产生您需要的结果:
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));
来自线性代数,如果你有一个平移矩阵:
和一个缩放矩阵:
我们平移和缩放的净效应由下式给出:
现在我只使用 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;
}
本质上是改变单位矩阵的第三列,modelMatrix
变成平移矩阵T,但奇怪的是,它并没有形成复合变换
矩阵,而是这样做的:
//glm code
template<typename T, qualifier Q>
GLM_FUNC_QUALIFIER mat<4, 4, T, Q> scale(mat<4, 4, T, Q> const& m, vec<3, T, Q> const& v)
{
mat<4, 4, T, Q> Result;
Result[0] = m[0] * v[0];
Result[1] = m[1] * v[1];
Result[2] = m[2] * v[2];
Result[3] = m[3];
return Result;
}
这实际上只是像这样缩放变换矩阵的列:
(我把翻译矩阵的值放在我上面的代码中):
这根本不是我期望的复合变换矩阵,这是我从线性代数理论中学到的:
这是怎么回事?
矩阵乘法顺序错误。示例代码计算的是 T * S 而不是 S * T。Matrix multiplications are not commutative,因此结果与您的预期不同。
以下代码应该会产生您需要的结果:
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));