происхождение камеры видно с проекционной матрицей - PullRequest
0 голосов
/ 01 марта 2020

enter image description here На изображении выше я показываю результат расположения камеры в том же положении , что и вершина, покрываемая мышью. Аналогичный результат получается при использовании ортогональной матрицы c. Моя проблема в том, что при вращении камеры она вращается вокруг видимого начала камеры. Я хочу, чтобы представление вращалось как обычные камеры FPS.

Что я считаю полезной информацией:

  • Я делаю математику вручную и рендеринг на экран с помощью OpenGL .
  • Вершины куба находятся в диапазоне от {0, 0, 0} до {1, 1, 1}
  • Камера расположена на {0, 0, 0}
  • Мои (4x4) матрицы находятся в главном столбце, и я получаю тот же результат, загружая отдельные матрицы в шейдер с помощью униформ и умножая их в том же порядке камера, только то, что происхождение камеры видно.

Эта последняя точка имеет смысл для меня математически с ортогональной проекцией c, однако, так как ближняя плоскость отсечения должна быть немного в перед камерой, я ожидаю, что точка рядом с мышью будет обрезана. Я точно знаю, что это не обрезка, потому что, если я поверну камеру, чтобы посмотреть на куб (не переводя ее), плоскость обрезания обрежется примерно наполовину вверх по этому вертикальному краю куба.

Я думаю, что мое замешательство может быть связано с фундаментальным неправильным пониманием того, как математика работает с матрицей проекции перспективы, но это также может быть связано с моим кодом, поэтому позвольте мне включить это:

static inline constexpr auto ortho(T l, T r, T b, T t, T n, T f) {
    return Matrix4x4{{(T)2 / (r - l), 0, 0, 0},
                     {0, (T)2 / (t - b), 0, 0},
                     {0, 0, (T)2 / (n - f), 0},
                     {(l + r) / (l - r), (b + t) / (b - t), (f + n) / (n - f), 1}};
}
static inline constexpr auto perspective(T fov, T aspect, T near, T far) {
    const T q = (T)1.0 / std::tan(0.5 * fov), 
            a = q * aspect, 
            b = (near + far) / (near - far), 
            c = near * far * 2 / (near - far);
    return Matrix4x4{
        {q, 0, 0, 0},
        {0, a, 0, 0},
        {0, 0, b, -1},
        {0, 0, c, 1},
    };
}

Если кто-то нужна дополнительная информация о том, что происходит, дайте мне знать в комментариях и с радостью либо ответим, либо сделаем дополнение к вопросу

1 Ответ

0 голосов
/ 01 марта 2020

После прочтения ссылки, приведенной в комментариях, и сравнения моего метода с написанным мною кодом, я понял, что допустил ошибку при переводе математики в мой код. Я случайно поместил 1 в последний ряд последнего столбца матрицы перспективы, хотя это должно было быть 0.

Исправленный код показан здесь:

static inline constexpr auto perspective(T fov, T aspect, T near, T far) {
    const T q = (T)1.0 / std::tan(0.5 * fov), 
            a = q * aspect, 
            b = (near + far) / (near - far), 
            c = near * far * 2 / (near - far);
    return Matrix4x4{
        {q, 0, 0, 0},
        {0, a, 0, 0},
        {0, 0, b, -1},
        {0, 0, c, 0},
    };
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...