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

发布于 2024-12-26 11:46:32 字数 507 浏览 0 评论 0原文

我正在尝试使用 glut 函数 glutMouseFunc() 获取鼠标单击 C++/OpenGL 的 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 窗口坐标,然后将其与鼠标单击的坐标进行比较会更容易吗?

I am trying to get the 3D coordinates of a mouse click C++/OpengGL with the glut function glutMouseFunc(). So I created a function like this:

void mouse(int button, int state, int x, int y){
if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
{
    mouse_x=x;
    mouse_y=y;
    }
}

The function gets the window coordinates of the click of the mouse and i use it with the glut function glutMouseFunc() like this:

  glutMouseFunc(mouse);

My question is how would I modify the coordinates given by the mouse function so I could use them in a 3D world. My exact purpose would be the following: to be able to see if I have clicked on a 3D shape drawn in the world.

[EDIT] Would it be easier to transform the coordinates of the 3D object to 2D window coordinates and then compare it to the coordinates of the mouse click?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

孤檠 2025-01-02 11:46:32

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

无论如何,您都可以使用 gluUnProject

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

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

Mouse click does not correspond to a point in 3d space, but to a ray.

In any case, you use gluUnProject.

If you know scene "depth" under cursor, then you can get 3d position of a click - by passing depth via winZ parameter.

If you don't know depth, pass 0.0 in winZ parameter, to get start of the ray, and 1.0 to get the "end". You'll have to calculate yourself if this ray hits anything.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文