从鼠标坐标获取 y=0 平面上的点,而不使用 OpenGL 调用

2024-02-22

I have:

  • 屏幕坐标 x,y(0,0 为屏幕中间,1,1 为左上角)
  • 屏幕尺寸
  • 相机位置矢量
  • 相机外观矢量
  • 投影矩阵
  • 模型视图矩阵
  • y=0 (0,1,0,0) 的平面法线
  • y=0 (0,0,0,0) 的平面位置

我希望获取我单击窗口的 y=0 平面上的位置 (x,0,z)(应该是线-平面交叉点,但必须考虑相机属性)。

令人烦恼的是,我无法访问用于取消投影等的 GLU 调用。只是基本的向量和矩阵计算。我实际上并不需要确切的代码,而只是需要技术 - 因为线平面相交很容易做到。找到从眼睛到屏幕上的点的线是困难的部分。

我认为这只是使用相机外观向量来表示从相机位置投射的光线,但这没有考虑鼠标坐标。那么我还需要考虑相机FOV吗?


// get line of sight through mouse cursor

GLint viewport[4];
GLdouble mvmatrix[16], projmatrix[16];
GLint realy;  /*  OpenGL y coordinate position  */
GLdouble wx, wy, wz;  /*  returned world x, y, z coords  */
GLdouble wx2, wy2, wz2;  /*  returned world x, y, z coords  */
glGetIntegerv (GL_VIEWPORT, viewport);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glGetDoublev (GL_MODELVIEW_MATRIX, mvmatrix);
glGetDoublev (GL_PROJECTION_MATRIX, projmatrix);
/*  note viewport[3] is height of window in pixels  */
realy = viewport[3] - (GLint) point.y - 1;
gluUnProject ((GLdouble) point.x, (GLdouble) realy, 0.0,
    mvmatrix, projmatrix, viewport, &wx, &wy, &wz);
//printf ("World coords at z=0.0 are (%f, %f, %f)\n",
//  wx, wy, wz);
gluUnProject ((GLdouble) point.x, (GLdouble) realy, 1.0,
    mvmatrix, projmatrix, viewport, &wx2, &wy2, &wz2);
//printf ("World coords at z=1.0 are (%f, %f, %f)\n",     
//  wx, wy, wz);

// line of sight intersection with y = 0 plane

double f = wy / ( wy2 - wy );
double x2d = wx - f * (wx2 - wx );
double z2d = wz - f * (wz2 - wz );

point.x、point.y 是鼠标屏幕坐标,0.0 是左上角。

该代码假设 y = 0 平面填充视口。 (您从狭窄的飞机港口俯视世界,看不到任何天空。)如果 y=0 平面没有填满视口,您必须测试 x,y 位置是否在“天空中” ' ( wy2 - wy

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从鼠标坐标获取 y=0 平面上的点,而不使用 OpenGL 调用 的相关文章

随机推荐