Библиотека математики GLM для openGL предоставляет эту реализацию для построения 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 в отрицательном направлении направление), что мы бы не хотели. Где я упускаю суть или почему это делается для перевода?