Создание виртуальной камеры в OpenGL с заданными внутренними компонентами

Я пытаюсь получить смоделированное изображение глубины объектной модели в OpenGL с учетом внутренних параметров камеры RealSense, fx fy ppx ppy.

Я сам строю матрицу проекций с помощью этого, что, а также что. Как-то результат не правильный, и я запутался с их условностями встроенных функций. Они используют alpha beta, которые, я считаю, отличаются от фокусного расстояния f.

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

Второй ответ в этом использует ту же систему координат, что и моя, но в моем случае она не работает, так как я все еще ничего не вижу в своем окне. Будет здорово, если кто-нибудь укажет мне, как вывести его из основ.

Это мой оригинальный рабочий код для отображения.

glMatrixMode(GL_PROJECTION);
glPushMatrix();
gluPerspective(60, (float)(*width) / (*height), zNear, zFar);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
gluLookAt(camOrigin[0], camOrigin[1], camOrigin[2], camOrigin[0] + camLookAt[0], camOrigin[1] + camLookAt[1], camOrigin[2] + camLookAt[2], camUp[0], camUp[1], camUp[2]);

И я изменил это, чтобы использовать встроенные функции (я попробовал транспонировать, чтобы посмотреть, поможет ли это):

static const double fx = intrin.fx, fy = intrin.fy, cx = intrin.ppx, cy = intrin.ppy, zNear = 0.01, zFar = 20.0, s = 0;
glMatrixMode(GL_PROJECTION);
glPushMatrix();
GLdouble perspMatrix[16] = { 2 * fx / *width, 0, 0, 0,
        2 * s / *width, 2 * fy / *height, 0, 0,
        2 * (cx / *height) - 1, 2 * (cy / *height) - 1, (zFar + zNear) / (zFar - zNear), 1,
        0, 0, 2 * zFar*zNear / (zNear - zFar), 0};
//GLdouble perspMatrix[16] =
//{ 2 * fx / *width, 2 * s / *width, 2 * (cx / *height) - 1, 0,
//0, 2 * fy / *height, 2 * (cy / *height) - 1, 0,
//0, 0, (zFar + zNear) / (zFar - zNear), 2 * zFar*zNear / (zNear - zFar),
//0, 0, 1, 0 };
glMultMatrixd(perspMatrix);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
gluLookAt(camOrigin[0], camOrigin[1], camOrigin[2], camOrigin[0] + camLookAt[0], camOrigin[1] + camLookAt[1], camOrigin[2] + camLookAt[2], camUp[0], camUp[1], camUp[2]);

Любая идея о том, что не так?


person mjfoo21    schedule 12.03.2019    source источник
comment
Я применил окончательное уравнение в это с alpha = fx и beta = fy, и это работает, но я не уверен, почему. Они переворачивают знак третьего столбца, потому что в их координатах камера смотрит в сторону отрицательной оси Z, а моя смотрит в сторону положительной оси Z. Почему это все еще работает в моем случае?   -  person mjfoo21    schedule 13.03.2019
comment
Привет, камеры OpenGL всегда смотрят в сторону отрицательной оси Z, вы не можете это изменить.   -  person Yakov Galka    schedule 13.03.2019
comment
@ybungalobill привет, образец кода, который я получил, смотрит в сторону положительной оси Z, а ось Y направлена ​​вниз. Я думаю, вы можете изменить направление просмотра через gluLookAt()? Я использую библиотеку GLFW, если это имеет значение.   -  person mjfoo21    schedule 14.03.2019