GLM翻译问题

时间:2018-10-30 16:22:39

标签: c++ matrix 3d transformation glm-math

如果我有一个变换矩阵glm::mat4并且向上向量是glm::vec4 up(matrix[1]);,则我有一个模型并希望沿其轴移动,所以如果我想按值沿向上向量移动模型up*=d;然后matrix=glm::translate(matrix,up);,结果矩阵不会向右移动模型,例如,如果向上向量id (0,0.707106769,0.707106769)“模型绕X轴旋转了45d”,而我想要将其移动5个单位,以使平移矢量为(0,3.535533845,3.535533845),然后在平移后位置分量仅在Y中更改,因此仅沿Y轴移动。

1 个答案:

答案 0 :(得分:2)

GLM的translate源代码:

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;
}

通过现有矩阵的旋转分量(左上的3x3子矩阵,或者如果前一行是0 0 0 1,则前3列)来修改所应用平移的效果,即:

  

glm::translate 添加,而不是附加翻译。

换句话说,上面的代码等效于:

// create an identity matrix and apply the translation
glm::mat4 translation = glm::translate(glm::mat4(1.f), up);

// post-multiply (i.e. the applied translation comes FIRST)
matrix = matrix * translation;

您想要的效果可以通过以下方式实现:

1)

// pre-multiply (i.e. the applied translation comes AFTER)
matrix = translation * matrix;

或等效地,在模型的 local 基础上构建翻译:

2)

// local up vector (Y-axis)
glm::vec3 local_up(0.f, 1.f, 0.f);
local_up *= d;

// apply using translate as before
matrix = glm::translate(matrix, local_up);