使用 glut 函数 glutMouseFunc() 将窗口坐标转换为 3D 世界坐标

Posted

技术标签:

【中文标题】使用 glut 函数 glutMouseFunc() 将窗口坐标转换为 3D 世界坐标【英文标题】:convert window coordinates to 3D world coordinates with glut function glutMouseFunc() 【发布时间】:2012-01-11 15:00:23 【问题描述】:

我正在尝试使用 glut 函数 glutMouseFunc() 获取鼠标单击 C++/OpengGL 的 3D 坐标。所以我创建了一个这样的函数:

void mouse(int button, int state, int x, int y)
if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)

    mouse_x=x;
    mouse_y=y;
    

该函数获取鼠标单击的窗口坐标,我将它与 glut 函数 glutMouseFunc() 一起使用,如下所示:

  glutMouseFunc(mouse);

我的问题是如何修改鼠标功能给出的坐标,以便在 3D 世界中使用它们。我的确切目的如下:能够查看我是否点击了在世界中绘制的 3D 形状。

[编辑] 将 3D 对象的坐标转换为 2D 窗口坐标,然后将其与鼠标单击的坐标进行比较会更容易吗?

【问题讨论】:

与***.com/q/2093096/524368相同的问题(原则上) 【参考方案1】:

鼠标点击不对应于 3d 空间中的一个点,而是对应于一条射线。

无论如何,您都使用gluUnProject。

如果您知道光标下的场景“深度”,那么您可以通过 winZ 参数传递深度来获取点击的 3d 位置。

如果您不知道深度,请在 winZ 参数中传递 0.0 以获取射线的起点,并传递 1.0 以获取“终点”。如果这条射线击中任何东西,你必须自己计算。

【讨论】:

以上是关于使用 glut 函数 glutMouseFunc() 将窗口坐标转换为 3D 世界坐标的主要内容,如果未能解决你的问题,请参考以下文章

openGL按鼠标中键实现放大缩小

将 glutTimerFunc 与 glutMouseFunc 一起使用

使用 glutMouseFunc 获取访问冲突读取位置 0x000000b0

如何防止缩放低于定义(OpenGL)

openGL初学函数解释汇总

调用 glut 函数退出程序