Сборка виртуальной камеры в OpenGL с заданными характеристиками - PullRequest
0 голосов
/ 12 марта 2019

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

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

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

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

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

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]);

Есть идеи, что не так?

...