2010-08-27 5 views
2

Je ne peux pas obtenir la bonne transformation dans OpleGL.Géométrie -> OpenGL

je point3d - P (X, Y, Z), et de la matrice de projection M, égale à K * (R | T) où

K - matrice de calibrage de la caméra

alt text

(R | T) - point (objet) de coordonnées de la transformation du système (R - matrice de rotation, T - vecteur de translation)

en conséquence, nous avons prévu le point que p = M * P

Je sais que P, K, R, T, et moi ne calculerons pas p en termes OpenGl.

En termes OpenCV il sera présente comme suit (petit code d'abstraction):

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)); /// <- !!!! 

Comment puis-je traduire cette logique OpenGl?

Comment puis-je définir GL_PROJECTION et que puis-je faire en mode GL_MODELVIEW ou autre?

Répondre

2

La projection dépend de votre caméra. Utilisez http://www.opengl.org/sdk/docs/man/xhtml/gluPerspective.xml. FoV dépend de l'objectif utilisé (voir le document), l'aspect dépend du film (probablement 4: 3)

model = RxT, vous le savez déjà. C'est la position de l'objet dans l'espace du monde

view = Probablement ce que vous appelez K, mais attention, c'est une matrice 4x4, pas une 3x3! C'est la position et l'orientation de la caméra dans l'espace mondial.

Vous pourriez vous demander: qu'est-ce que World Space? Eh bien, c'est ce que vous voulez, à condition que vous puissiez exprimer la position de la caméra et de l'objet dans ces coordonnées.

puis projected_point = projection x x vue projection x points

MODELVIEW est une vue en projection de x.

+0

J'ai récemment découvert que le fait de scinder la matrice Modelview en un modèle et une vue séparés m'a aussi amené à mieux comprendre le sujet. –