понимание перевода камеры в GLM- openGL - PullRequest
2 голосов
/ 24 февраля 2020

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

Ответы [ 2 ]

3 голосов
/ 24 февраля 2020

glm::lookAt определяет матрицу вида. Матрица вида преобразует координаты вершины из мирового пространства в пространство просмотра.
eye, center и up - это положения соответственно векторов в мировом пространстве, которые определяют положение и ориентацию камеры в мировом пространстве. eye, center и up определяют пространство просмотра. Если бы вы установили матрицу по этим векторам, то матрица трансформировалась бы из пространства просмотра в мировое пространство.
Так как матрица представления должна делать обратное (мировое пространство -> пространство просмотра), матрица представления будет обратная матрица той матрицы, которая определяется eye, center и up. glm::lookAt - это оптимизированный алгоритм для вычисления обратной матрицы в этом пространственном случае.
Примечание s, u, f транспонируются, когда они назначены матрице.

Перевод обратной матрицы не отрицательный перевод матрицы. Перевод обратной матрицы должен учитывать ориентацию (вращение). Из-за этого вектор перевода должен вращаться. Вращение вектора (3d) на матрицу вращения 3x3 может быть вычислено (аналогично) произведению 3 Dot векторов оси и вектора направления. (s, u, f) определяют матрицу вращения 3x3, и eye преобразуется этой матрицей.

То, что на самом деле доза кода, состоит в объединении вращения путем транспонирования (s, u, f) и перевода -eye (очень упрощенный псевдокод):

viewmatrix = transpose(rotation(s, u, f)) * translation(-eye)
1 голос
/ 24 февраля 2020

Точечное произведение одного вектора, a , с другим нормализованным вектором, n , может рассматриваться как проекция a на п . Итак, все, что здесь происходит, это то, что вектор eye проецируется на f, s и u, которые являются базисными векторами повернутой системы координат. С помощью этих проекций мы можем узнать координаты x , y и z eye в системе координат fsu .

...