カメラを持っていて、テーブルの上に置かれた長方形の紙のスナップショットを撮ったとしましょう。その画像を取得し、フラットな背景として使用し、用紙が座標付きのクワッドでレンダリングされるように OpenGL シーンを設定する必要があります。たとえば、(0,0,0) (1,0,0) (1 ,2,0) (0,2,0) と特定のカメラとビューの設定。
つまり、Photoshop の「消失点」機能の背後にある同じアルゴリズムを再現する必要があります。
問題の数学的解法では、1 つの解 (観測者の距離など) を与えるために、さらにいくつかの定数を定義する必要があります。ビルド時にこれらのデータを修正しても問題ありません。
数学的な解決策は高く評価されますが、OpenGL カメラ モデル パラメーターにコヒーレント データを入力するために、幾何学的変換などの外部数学フレームワークを参照する C/C++ コードを使用する方が適切です。
NyArToolkit と OpenCV はどちらも興味深い複雑な機能を備えていますが、入力は不要な「トレーニング」を参照しています。Photoshop の「Vanishing point」機能はリアルタイムで機能し、入力の 4 つの 2d ポイントのみで結果が得られます。
必要な機能は次のようなものです
BOOL calculate_3D_scene_From_2D_Rectangle(
point2d* pointsList, // in: array of the four corners of the quad rectangle
// in 2d coordinates, in clockwise order
rect2d sceneSize, // in: view area in 2d coordinates, points are contained
// within this area
float eyeDistance // in: distance from observer eye to the object
point3d* vertexList // out: four coordinates of the point in 3d space
float* mvMatrix // out: 4x4 matrix to use as model view matrix in openGl
// return: true if found a correct result
);
明らかな使用例
point2d pointsList[] = { { -5, -5 }, { 10, -5 }, { 10, 10 }, { -5, 10 } };
rect2d sceneSize = { -20,-20,20,20 };
float eyeDistance = 20;
point3d vertexList[4];
float mvMatrix[16];
calculate_3D_scene_From_2D_Rectangle(
pointsList,sceneSize,eyeDistance,vertexList,mvMatrix);
[...]
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glLoadMatrixf(mvMatrix);
[...]
draw the polygon with vertexList[0..3];
[...]
正しい calculate_3D_scene_From_2D_Rectangle() の実際に適用可能な実装があれば幸いです。