2

我无法在 OpleGL 中得到正确的转换。

我有 point3D - P(X,Y,Z) 和投影矩阵 M,它等于 K*(R|T),其中

K - 相机校准矩阵

替代文字

(R|T) - 点(物体)坐标系变换(R - 旋转矩阵,T - 平移向量)

结果,我们将点投影为 p = M*P

我知道 P,K,R,T,而且我不会用 OpenGl 术语计算 p。

在 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 模式或其他模式下我能做什么?

4

1 回答 1

2

投影取决于您的相机。使用http://www.opengl.org/sdk/docs/man/xhtml/gluPerspective.xml。FoV 取决于使用的镜头(参见文档),方面取决于胶片(可能是 4:3)

model = RxT,你已经知道了。它是对象在世界空间中的位置

view = 可能是你所说的 K,但要注意它是 4x4 矩阵,而不是 3x3!它是相机在世界空间中的位置和方向。

你可能会问:什么是世界空间?好吧,只要您可以在这些坐标中表达相机和对象的位置,就可以了。

然后projected_point =投影x视图x投影x点

MODELVIEW 是视图 x 投影。

于 2010-08-27T15:44:20.633 回答