2

OpenGL を使用する MFC c++ アプリケーションを作成しています。このプログラムは、3D でのオブジェクトの描画と操作を可能にします。現在、オブジェクトが描画されているのと同じ座標空間で、画面上でマウスをクリックした場所の座標を見つけたいと考えています。

これまでのところ、glReadPixels と gluUnProject の組み合わせを使用してきましたが、オブジェクトが既に描画されている場所でマウスをクリックした場合にのみ機能しています。オブジェクトの外側をクリックすると、取得された座標が完全にオフになります。

だから、オブジェクトが画面上のどこにでもある座標空間で座標を見つけることができるように、コードを変更する方法を考えていました。これが私が使用しているコードです:

GLint viewport[4];
GLdouble ox, oy, oz;//the coordinates I need
GLfloat winZ = 0.0;
::glGetIntegerv(GL_VIEWPORT, viewport);
::glGetDoublev(GL_PROJECTION_MATRIX,    projectionMatrix);
::glGetDoublev(GL_MODELVIEW_MATRIX, modelviewMatrix);
GLfloat winX = (float)point.x;//point.x and point.y are the mouse coordinates
GLfloat winY = (float)viewport[3] - (float)point.y;

::glReadPixels( winX, winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ);

gluUnProject((GLdouble)winX, (GLdouble)winY, (GLdouble)winZ, modelviewMatrix, projectionMatrix, viewport, &ox, &oy, &oz);
4

1 に答える 1

0

gluUnProjectウィンドウ スペース座標を取得し、ワールド ビュー プロジェクション ビューポート変換の逆でそれらをアンプロジェクションします。座標が既存のオブジェクトに対応しているかどうかはわかりません。

深度バッファをクリアすると、 で 1.0 として読み取られる値でどこでも初期化されglReadPixelsます。

オブジェクトの可視フラグメントが描画されると、それらは深度テストに合格し、これらのフラグメントと交差するすべてのピクセルの深度値をより小さい値で上書きします。

これは、深度バッファ内の値が 1.0 のピクセルを読み取るたびに、そのピクセルには何も表示されず、得られる結果が完全にオフになることを意味します。

于 2013-06-29T02:45:09.947 に答える