单击窗口 x 轴的末端时,通过鼠标单击在 OpenGL 中创建的光线不正确?

Posted

技术标签:

【中文标题】单击窗口 x 轴的末端时,通过鼠标单击在 OpenGL 中创建的光线不正确?【英文标题】:Incorrect ray creation in OpenGL from a mouse click when clicking on the extreams of the x-axis of the window? 【发布时间】:2013-06-15 18:21:43 【问题描述】:

我遇到了一个不知道如何修复的错误。当我点击窗口时,3D 空间中的点不会直接映射到实际窗口 x 轴上的点击。当您离窗口中的 x 轴中心越来越远时,单击的点与 3D 空间中实际创建的光线之间的差异会按比例增加。 y 轴工作正常,它只是 x 轴。

这是在 3D 空间中创建的正方形图片,我在其中单击鼠标。我只单击边缘并在窗口周围移动。 (有些正方形看起来像六边形,因为相机角度是朝下的,但这并不重要,左右间隙是)

这是我用来通过单击窗口在 3D 空间中创建射线的代码:

    GLfloat window_height = 800;
    GLfloat window_width  = 800;

    void proccess_Mouse(int button, int state, int x, int y) 
            glMatrixMode(GL_PROJECTION);
            glLoadIdentity();
            gluPerspective(camera->getAngle(), window_height / window_width, viewPlane_close, viewPlane_far);

            glMatrixMode(GL_MODELVIEW);
            glLoadIdentity();
            gluLookAt(camera->getIndex_position(0), camera->getIndex_position(1),   camera->getIndex_position(2),
                      camera->getIndex_looking(0),  camera->getIndex_looking(1),    camera->getIndex_looking(2),
                      0,                                    -1,                             0);

            // matrix information
            GLint viewport[4];
            GLdouble modelview[16];
            GLdouble projection[16];

            GLfloat winX, winY;                // clicked coords on the screen
            GLdouble near_x, near_y, near_z;   // position of the mouse on the near view plane
            GLdouble far_x, far_y, far_z;      // position of the mouse on the far view plane

            glGetDoublev(GL_MODELVIEW_MATRIX, modelview);
            glGetDoublev(GL_PROJECTION_MATRIX, projection);
            glGetIntegerv(GL_VIEWPORT, viewport);

            winX = (float)x;
            winY = (float)viewport[3] - (float)y; // window height - click position

            gluUnProject(winX, winY, 0.0, modelview, projection, viewport, &near_x, &near_y, &near_z);
            gluUnProject(winX, winY, 1.0, modelview, projection, viewport, &far_x, &far_y, &far_z);

            Vector3f* near = new Vector3f(near_x, near_y, near_z);
            Vector3f* far  = new Vector3f(far_x, far_y, far_z);

            ...
    

我相信我错过了什么,或者忘记了什么,但我没有看到。有什么想法吗?

【问题讨论】:

glMatrixMode(GL_MODELVIEW); 之后可以添加 glLoadIdentity 吗?只是为了确保我们创建正确的观察矩阵...... 添加它(并在上面添加),没有变化:( 当您实际渲染这些正方形时,您是否使用相同的矩阵(和视口)?对我来说,看起来你至少对投影使用了一些不同的方面。此外,您的代码假定视口正在填充整个窗口。 【参考方案1】:

乍一看,您似乎将错误的纵横比传递给 gluPerspective。第二个参数应该是宽度/高度。

【讨论】:

这就是你所说的,只是在不同的地方。在我的动画循环中(在上面的代码块中没有),变量被搞砸了,所以每次我点击鼠标时,正确的 gluPerspective 都会被错误的覆盖。谢谢!

以上是关于单击窗口 x 轴的末端时,通过鼠标单击在 OpenGL 中创建的光线不正确?的主要内容,如果未能解决你的问题,请参考以下文章

我想让鼠标悬浮在某个窗口的时候就选中这个窗口,不用单击左键,我的是w7旗舰,怎么设置?

在 Qt 中使用鼠标中键单击和拖动移动整个窗口

调整窗口大小时如何使用鼠标单击获取图像坐标?

ppt中如何通过单击鼠标依次分别出现一张图片?

PyQtgraph - 通过鼠标单击和拖动绘制 ROI

Python在单击时获取鼠标x,y位置