【发布时间】:2020-02-24 08:34:20
【问题描述】:
openGL 的 GLM 数学库为构造 lookAt matrix 提供了此实现。
template<typename T, qualifier Q>
GLM_FUNC_QUALIFIER mat<4, 4, T, Q> lookAtLH(vec<3, T, Q> const& eye, vec<3, T, Q> const& center, vec<3, T, Q> const& up)
{
vec<3, T, Q> const f(normalize(center - eye));
vec<3, T, Q> const s(normalize(cross(up, f)));
vec<3, T, Q> const u(cross(f, s));
mat<4, 4, T, Q> Result(1);
Result[0][0] = s.x;
Result[1][0] = s.y;
Result[2][0] = s.z;
Result[0][1] = u.x;
Result[1][1] = u.y;
Result[2][1] = u.z;
Result[0][2] = f.x;
Result[1][2] = f.y;
Result[2][2] = f.z;
Result[3][0] = -dot(s, eye); //#this
Result[3][1] = -dot(u, eye); //#this
Result[3][2] = -dot(f, eye); //#this
return Result;
}
一切都很好,除了我用//#this 标记的最后三行中完成的翻译因素。必须为相机的世界位置x, y and z 完成平移,但它是为相机的局部坐标和方向矢量的点积完成的,这不可能相等。
考虑一种情况,其中vector 2*eye(眼睛是相机的位置)作为vector center(中心是目标位置)传递,那么相机的局部z轴将与方向矢量重合,从而为我们提供平移因子对于相机为[0,0,1],所以我们基本上只会沿着z-axis沿着世界移动(因为我们不移动相机,我们只会沿着z轴在负方向移动世界)是我们不想要的。我在哪里漏掉了重点,或者为什么要翻译?
【问题讨论】: