Геометрия -> OpenGL - PullRequest
       15

Геометрия -> OpenGL

2 голосов
/ 27 августа 2010

Не могу получить правильное преобразование в OpleGL.

У меня есть point3D - P (X, Y, Z) и проекционная матрица M, которые равны K * (R | T), где

К - калибровочная матрица камеры

alt text

(R | T) - преобразование системы координат точки (объекта) (R - матрица вращения, T - вектор перемещения)

В результате мы спроецировали точку как p = M * P

Я знаю P, K, R, T и обычно рассчитываю p в терминах OpenGl.

В терминах OpenCV это будет выглядеть следующим образом (небольшой код абстракции):

CvMat* R = cvCreateMat(4,4, CV_32F, getRotationData());    
CvMat* T = cvCreateMat(4,1, CV_32F, getTranslationData());
CvMat* K = cvCreateMat(4,4, CV_32F, getCameraCalibrationData());

// (R|T)
R->data.fl[3] = T->data.fl[0];
R->data.fl[7] = T->data.fl[1];
R->data.fl[11] = T->data.fl[2];
R->data.fl[15] = T->data.fl[3];

CvMat M = cvMat(4,4, CV_32F);
// M = R*(R|T)
cvMulMat(K, R, &M);

CvMat* P = cvCreateMat(4,1, CV_32F, getTestedPoint3D());
cvMar p = cvMat(4,1, CV_32F);  // result transformation

// p = M*P
cvMulMat(&M, P, &p);

// project
float z = p.data.fl[2];
float x = p.data.fl[0] / z;
float y = p.data.fl[1] / z;

printf("Point projection [%f,%f]", x, y);
cvDrawPonit(img, cvPoint(x,y), CV_RGB(255,0,0)); /// <- !!!!

Как я могу перевести эту логику в OpenGl?

Как я могу установить GL_PROJECTION и что я могу сделать в режиме GL_MODELVIEW или как-то еще?

1 Ответ

2 голосов
/ 27 августа 2010

Проекция зависит от вашей камеры. Использование http://www.opengl.org/sdk/docs/man/xhtml/gluPerspective.xml. FoV зависит от используемого объектива (см. Документ), аспект зависит от пленки (вероятно, 4: 3)

модель = RxT, вы уже знаете это. Это положение объекта в мировом пространстве

view = Возможно то, что вы называете K, но будьте осторожны, это матрица 4x4, а не 3x3! Это положение и ориентация камеры в мировом пространстве.

Вы можете спросить: что такое Мировое Пространство? Ну, это все, что вы хотите, при условии, что вы можете выразить камеру и положение объекта в этих координатах.

затем projected_point = проекция x вид x проекция x точка

MODELVIEW - проекция вида x.

...