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)

モデル = RxT、あなたはすでにこれを知っています。ワールド空間でのオブジェクトの位置です

view = おそらくあなたが K と呼んでいるものですが、これは 3x3 ではなく 4x4 行列であることに注意してください! ワールド空間でのカメラの位置と向きです。

あなたは尋ねるかもしれません: ワールド スペースとは何ですか? これらの座標でカメラとオブジェクトの位置を表すことができれば、それは何でも構いません。

次に、projected_point = 投影 x ビュー x 投影 x ポイント

MODELVIEW はビュー x 投影です。

于 2010-08-27T15:44:20.633 に答える