На изображении выше я показываю результат расположения камеры в том же положении , что и вершина, покрываемая мышью. Аналогичный результат получается при использовании ортогональной матрицы 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},
};
}
Если кто-то нужна дополнительная информация о том, что происходит, дайте мне знать в комментариях и с радостью либо ответим, либо сделаем дополнение к вопросу