我无法在OpleGl中获得正确的转换。

我有point3d -p(x,y,z)和投影矩阵M,等于k*(r | t)

K-相机校准矩阵

alt text

(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_Procottion,在GL_ModelView模式下该怎么办?

有帮助吗?

解决方案

投影取决于您的相机。采用 http://www.opengl.org/sdk/docs/man/xhtml/gluperspective.xml. 。 FOV取决于所使用的镜头(请参阅DOC),方面取决于胶片(大概4:3)

model = rxt,您已经知道了。这是物体在世界空间中的位置

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

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

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

ModelView是视图X投影。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top