Допустим, у вас есть камера и сделайте снимок прямоугольной бумаги, лежащей на столе.Мы получаем эту картинку, используем ее в качестве плоского фона, и нам нужно настроить сцену OpenGL таким образом, чтобы бумага отображалась с квадратом с координатами, скажем, (0,0,0) (1,0,0) (1)., 2,0) (0,2,0) с определенной камерой и настройками просмотра.
Другими словами, нам необходимо воспроизвести те же алгоритмы, что и в функции Photoshop «точка схода».
Для математического решения задачи необходимо определенно определить еще несколько констант, чтобы дать одно решение (расстояние от наблюдателя и т. Д.).Не должно быть проблем с исправлением этих данных во время сборки.
Было бы желательно получить математическое решение, но лучше рабочий код C / C ++ со ссылкой на любую внешнюю математическую среду для геометрических преобразований и т. Д. Для ввода связногоданные для параметров модели камеры OpenGL.
И NyArToolkit, и OpenCV имеют интересные и сложные функции, но ввод относится к «обучению», которое не требуется.Функция Photoshop «Точка исчезновения» работает в режиме реального времени, давая результат только с 4 2d точками ввода.
Функция, которая нам нужна, выглядит примерно так:
BOOL calculate_3D_scene_From_2D_Rectangle(
point2d* pointsList, // in: array of the four corners of the quad rectangle
// in 2d coordinates, in clockwise order
rect2d sceneSize, // in: view area in 2d coordinates, points are contained
// within this area
float eyeDistance // in: distance from observer eye to the object
point3d* vertexList // out: four coordinates of the point in 3d space
float* mvMatrix // out: 4x4 matrix to use as model view matrix in openGl
// return: true if found a correct result
);
Пример очевидного использования
point2d pointsList[] = { { -5, -5 }, { 10, -5 }, { 10, 10 }, { -5, 10 } };
rect2d sceneSize = { -20,-20,20,20 };
float eyeDistance = 20;
point3d vertexList[4];
float mvMatrix[16];
calculate_3D_scene_From_2D_Rectangle(
pointsList,sceneSize,eyeDistance,vertexList,mvMatrix);
[...]
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glLoadMatrixf(mvMatrix);
[...]
draw the polygon with vertexList[0..3];
[...]
Любая действительно применимая реализация для правильного вычисления_3D_scene_From_2D_Rectangle () будет принята с благодарностью.