2010-08-27 47 views
2

我無法在OpleGL中獲得正確的轉換。幾何 - > OpenGL

我有三維點 - 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_PROJECTION,我能做些什麼GL_MODELVIEW模式或其他?

回答

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投影。

+0

最近我發現將模型視圖矩陣分解成單獨的模型和視圖也讓我更好地理解了這個主題。 – 2012-06-13 14:15:12