c++ - GLM 翻译问题
问题描述
我有一个模型并且想沿着它的轴移动它,如果我有一个变换矩阵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 轴移动。
解决方案
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 子矩阵,或者如果底行是前 3 列0 0 0 1
)修改,即:
glm::translate
prepends,而不是append,翻译。
换句话说,上面的代码等价于:
// 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;
或者等效地,在模型的本地基础上构建翻译:
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);
推荐阅读
- python - 用户输入的熊猫数据框
- typescript - SystemJS 没有导入
- fragment - 在片段中打开自定义选项卡
- facebook-opengraph - property="og:type" content="website" 和 property="og:type" content="article" 有什么区别
- python - 如何减少输出数量?
- javascript - 在 javascript / moment.js 中获取每周的第一天
- android - 我是新手JNI,为什么我的android jni C++ try块没有捕获异常
- ios - 在字典 Swift 中更新字典的值
- android - android studio 渲染错误
- angular - Angular 8 Form Array返回找不到带有路径的控件:'变量-> 0'