質問
私はこのビューを設定しています:
glMatrixMode(GL_MODELVIEW); //Switch to the drawing perspective
glLoadIdentity(); //Reset the drawing perspective
マウスをクリックすると画面位置 (sx, sy) を取得します。
z の値が与えられた場合、sx と sy から 3D 空間の x と y を計算するにはどうすればよいでしょうか?
解決
使用する必要があります 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;
他のヒント
これについては、最も信頼できる情報源からの回答が最も適切です。 OpenGL の Web サイト.
これは実際には、モデルビュー行列ではなく射影行列に依存します。 http://www.toymaker.info/Games/html/picking.html これは D3D 中心ですが、理論は同じです。
ただし、マウスベースの選択を行う場合は、選択レンダリング モードを使用することをお勧めします。
編集:念のため言っておきますが、モデル ビュー マトリックスが関係しますが、あなたのアイデンティティであるため、それは問題ではありません。
libqglviewer それがあなたが探しているものであれば、優れた選択フレームワークがあります
所属していません StackOverflow