9

私はこのビューセットを持っています:

glMatrixMode(GL_MODELVIEW); //Switch to the drawing perspective
glLoadIdentity(); //Reset the drawing perspective

マウスクリックから画面位置(sx、sy)を取得します。

z の値が与えられた場合、sx と sy から 3 次元空間で x と y を計算するにはどうすればよいですか?

4

4 に答える 4

11

使用する必要がありますgluUnProject

まず、近平面への「非投影」を計算します。

GLdouble modelMatrix[16];
GLdouble projMatrix[16];
GLint viewport[4];

glGetIntegerv(GL_VIEWPORT, viewport);
glGetDoublev(GL_MODELVIEW_MATRIX, modelMatrix);
glGetDoublev(GL_PROJECTION_MATRIX, projMatrix);

GLdouble x, y, z;
gluUnProject(sx, viewport[1] + viewport[3] - sy, 0, modelMatrix, projMatrix, viewport, &x, &y, &z);

そしてファープレーンへ:

// replace the above gluUnProject call with
gluUnProject(sx, viewport[1] + viewport[3] - sy, 1, modelMatrix, projMatrix, viewport, &x, &y, &z);

これで、クリックした可能性のあるすべての点をトレースするワールド座標の線ができました。したがって、補間する必要があるだけです。z 座標が与えられているとします。

GLfloat nearv[3], farv[3];  // already computed as above

if(nearv[2] == farv[2])     // this means we have no solutions
   return;

GLfloat t = (nearv[2] - z) / (nearv[2] - farv[2]);

// so here are the desired (x, y) coordinates
GLfloat x = nearv[0] + (farv[0] - nearv[0]) * t,
        y = nearv[1] + (farv[1] - nearv[1]) * t;
于 2008-09-23T01:24:42.153 に答える
3

これは、最も信頼できる情報源であるOpenGL の Web サイトによる回答が最も適切です。

于 2008-09-22T06:03:43.177 に答える
2

これは実際には、モデル ビュー マトリックスではなく、射影マトリックスに依存します。 http://www.toymaker.info/Games/html/picking.htmlが役に立ちます。これは D3D 中心ですが、理論は同じです。

ただし、マウス ベースのピッキングを行う場合は、選択レンダリング モードを使用することをお勧めします。

編集: モデル ビュー マトリックスは機能しますが、あなたのものはアイデンティティであるため、問題ではありません。

于 2008-09-22T06:02:17.983 に答える
0

それがあなたが探しているものであれば、libqglviewerには優れた選択フレームワークがあります

于 2008-09-22T05:57:41.660 に答える